ディアズ
コンパイル マクロ命令を使用して、Hse_Send() 関数を 0x0041E400 にコンパイルし、スペース サイズを 6kb にしました。コンパイル後に生成されたマップ ファイルは、上記の操作が成功したことを示します。
暗号化サービスを実行する前に、まず HSE_send 関数をアドレス 0x2043E800 にコピーし、ポインター関数を使用して対応するアドレスにジャンプして関数を実行しました。状況のスクリーンショットは次のとおりです。
上記のアセンブリ命令を 1 ステップで実行すると、PC レジスタは 0 にリセットされます。
質問: この問題はソフトウェアの操作によるものですか?コードを RAM アドレスにコピーする方法が間違っていますか?
デバッガーが PC をゼロとして表示する場合、通常はデバッガーが障害コンテキストを解析できないことが原因です。前に書いたように、間違ったアドレスから位置依存コードを実行したようです。一部の相対ジャンプが正しくないため、常にクラッシュが発生します。これは明らかに障害、いやむしろ一連の障害を引き起こしました。
よろしくお願いいたします。
ルーカス
ディアズ
サポートありがとうございます。しかし、以下のように 0x0 にジャンプする理由がまだわかりません。
リスクを回避するために問題の原因を見つける必要がありますので、フィードバックをお待ちください。
関数は単にテキスト セクションに強制されているように見えますが、コンパイラは関数を RAM アドレスにコンパイルする必要があることを認識していません。これは位置独立コードではありません。詳細については、この記事をCANご覧ください。
しかし、RTD はすでにこのためのメモリ マッピング ファイルとリンカー ファイルを用意しているので、別の方法でこれを行う必要はありません。
よろしくお願いいたします。
ルーカス
ディアズ
ありがとうございます。あなたの解決策でうまくいきました。しかし、コードをRAMにコピーする方法がうまくいかない理由を教えていただけますか?S32DSがこの方法をサポートしていないからでしょうか?それともRTDにこの方法の制限があるのでしょうか?
注意点が 1 つあります。RAM に強制的に保存したい関数が他の関数を呼び出す場合、それらの関数も RAM に強制的に保存する必要がある場合があります。
こんにちは@Ali22
RTD からのメモリ マッピング ファイルを使用していることがCANます。このCASE、RTD プロジェクトでは非常に簡単で、独自のセクションを作成する必要はなく、コードを手動でコピーする必要もありません。
たとえば、Hse_Ip_ServiceRequest 関数を RAM に強制的に配置したいとします。HSE_Ip.cとHSE_Ip.hを開くこの関数の定義/宣言を見つけます。
ファイルを詳しく見ると、すべてのコードが最初にこれを使用して強制的にフラッシュされていることがわかります。
#CRYPTO_43_HSE_START_SEC_CODE を定義します
#include "Crypto_43_HSE_MemMap.h"
そして最後に:
#CRYPTO_43_HSE_STOP_SEC_CODE を定義します
#include "Crypto_43_HSE_MemMap.h"
1 つの関数だけを RAM に強制するには、関数の前でこのデフォルト セクションを停止し、 RAMCODEセクションを使用してから、再度デフォルト セクションを使用する必要があります。ヘッダーファイルでは次のようになります。
...
#CRYPTO_43_HSE_STOP_SEC_CODE を定義します
#include "Crypto_43_HSE_MemMap.h"
#CRYPTO_43_HSE_START_SEC_RAMCODE を定義します
#include "Crypto_43_HSE_MemMap.h"
hseSrvResponse_t Hse_Ip_ServiceRequest
(
uint8 u8Muインスタンス、
uint8 u8Muチャネル、
Hse_Ip_ReqType* pリクエスト、
hseSrvDescriptor_t* pHseSrvDesc
);
#CRYPTO_43_HSE_STOP_SEC_RAMCODE を定義します
#include "Crypto_43_HSE_MemMap.h"
#CRYPTO_43_HSE_START_SEC_CODE を定義します
#include "Crypto_43_HSE_MemMap.h"
...
*.c ファイルでも同じことを行います。その後、関数はスタートアップ コードによって自動的に RAM にコピーされるため、コードを手動でコピーする必要はありません。
よろしくお願いいたします。
ルーカス