2142251_ja-JP

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

2142251_ja-JP

2142251_ja-JP

S32K344のHSE命令実行によりプログラムクラッシュ問題が発生した

ディアズ

コンパイル マクロ命令を使用して、Hse_Send() 関数を 0x0041E400 にコンパイルし、スペース サイズを 6kb にしました。コンパイル後に生成されたマップ ファイルは、上記の操作が成功したことを示します。

1.png.jpg

1.png.jpg

1.png.jpg

1.png.jpg


暗号化サービスを実行する前に、まず HSE_send 関数をアドレス 0x2043E800 にコピーし、ポインター関数を使用して対応するアドレスにジャンプして関数を実行しました。状況のスクリーンショットは次のとおりです。

1.png.jpg

1.jpg

1.jpg

上記のアセンブリ命令を 1 ステップで実行すると、PC レジスタは 0 にリセットされます。

1.jpg

質問: この問題はソフトウェアの操作によるものですか?コードを RAM アドレスにコピーする方法が間違っていますか?

Re: S32K344 execution of HSE instructions led to a program crash issue

デバッガーが PC をゼロとして表示する場合、通常はデバッガーが障害コンテキストを解析できないことが原因です。前に書いたように、間違ったアドレスから位置依存コードを実行したようです。一部の相対ジャンプが正しくないため、常にクラッシュが発生します。これは明らかに障害、いやむしろ一連の障害を引き起こしました。

よろしくお願いいたします。

ルーカス

Re: S32K344 execution of HSE instructions led to a program crash issue

ディアズ

サポートありがとうございます。しかし、以下のように 0x0 にジャンプする理由がまだわかりません。

リスクを回避するために問題の原因を見つける必要がありますので、フィードバックをお待ちください。

1.jpg

Re: S32K344 execution of HSE instructions led to a program crash issue

関数は単にテキスト セクションに強制されているように見えますが、コンパイラは関数を RAM アドレスにコンパイルする必要があることを認識していません。これは位置独立コードではありません。詳細については、この記事をCANご覧ください。

https://community.nxp.com/t5/S32-Design-Studio-Knowledge-Base/HOWTO-S32-Design-Studio で RAM からルーチンを実...

しかし、RTD はすでにこのためのメモリ マッピング ファイルとリンカー ファイルを用意しているので、別の方法でこれを行う必要はありません。

よろしくお願いいたします。

ルーカス

Re: S32K344 execution of HSE instructions led to a program crash issue

ディアズ

ありがとうございます。あなたの解決策でうまくいきました。しかし、コードをRAMにコピーする方法がうまくいかない理由を教えていただけますか?S32DSがこの方法をサポートしていないからでしょうか?それともRTDにこの方法の制限があるのでしょうか?

Re: S32K344 execution of HSE instructions led to a program crash issueディアズ

ありがとうございます。あなたの解決策では動作しますが、コードを RAM にコピーする方法がCAN動作しない理由を教えていただけますか?S32DS はこの方法をサポートしていないのでしょうか?それとも、RTD にはこの方法に制限があるのでしょうか?
Re: S32K344 execution of HSE instructions led to a program crash issue

注意点が 1 つあります。RAM に強制的に保存したい関数が他の関数を呼び出す場合、それらの関数も RAM に強制的に保存する必要がある場合があります。

Re: S32K344 execution of HSE instructions led to a program crash issue

こんにちは@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 にコピーされるため、コードを手動でコピーする必要はありません。

よろしくお願いいたします。

ルーカス

标记 (1)
无评分
版本历史
最后更新:
‎11-21-2025 06:16 PM
更新人: