2171070_ja-JP

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

2171070_ja-JP

2171070_ja-JP

S32K324 M7コアの起動中に発生したハードフォールト

説明: S32K324 Cortex-M7コアの起動フェーズでHardFaultが発生しています。FEEデモに基づいてドライバを設定した後、 startup_cm7.s 内の _INIT_DATA_BSS() でプログラムが停止します 。

詳細:

  • MCU: S32K324、デュアルCortex-M7

  • 開発環境: S32DS + Segger J-Link

  • コールスタックには次の内容が表示されます:

HardFault_Handler() at exceptions.c:97
memset() at 0x40a66c
init_data_bss() at startup.c:144
_INIT_DATA_BSS() at startup_cm7.s:565
  • リンカーセクション:

.sram_bss (NOLOAD) : { *(.bss) *(.bss*) *(.mcal_bss) } > int_sram_c0
.bss_tcm_data (NOLOAD) : { *(.dtcm_bss*) } > int_dtcm
  • HardFault は.bss_tcm_data memset() 中に発生します 。

スタートアップ初期化のようです

#S32K324

Re: HardFault during startup on S32K324 M7 core

こんにちは@Changyukeさん

遅れて申し訳ありません。数日間オフィスを離れていました。

ldr r3, [pc, #12]

str r0, [r3, #32]

このコードは、まず PC + 12 のメモリ アドレスから 32 ビットの値を読み取り、それをレジスタ R3 にロードします。この値は通常、データ構造またはメモリ領域へのポインターを表します。
次に、直接ストア命令は、R0 の内容を R3 + 32 として計算されたメモリ アドレスに書き込みます。このCASE、0x20440020 に解決されます。
この障害は MPU または XRDC の構成が原因ではないため、その場所の SRAM が適切に初期化されていないことが原因であると考えられます。初期化は、32 ビット書き込みではなく、64 ビット整列書き込みを使用して実行する必要があります。初期化されていない領域に 32 ビット書き込みを試みると、不正確なバス障害が発生します。

danielmartynek_0-1759320990346.png

main() の始めで、メモリを初期化CAN。

    volatile uint64* ptr = (uint64*)0x20440000;
    *ptr = 0ULL;  // Write 64-bit zero

逆アセンブリでは、STRD 命令が表示されます。


プロジェクトは Mem_43_INFLS_eJobRuntimeInfo を CAN 更新しますか?


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

ダニエル

Any support, information, and technology (“Materials”) provided by NXP are provided AS IS, without any warranty express or implied, and NXP disclaims all direct and indirect liability and damages in connection with the Material to the maximum extent permitted by the applicable law. NXP accepts no liability for any assistance with applications or product design.  Materials may only be used in connection with NXP products. Any feedback provided to NXP regarding the Materials may be used by NXP without restriction.


Re: HardFault during startup on S32K324 M7 core

こんにちは@danielmartynek

RTD を搭載した S32K324のデバッグ中に、アプリケーションが次の割り当てで常に HardFault に入ることを観察しました。

Mem_43_INFLS_eJobRuntimeInfo[インスタンスインデックス].JobResult = ジョブ結果;
 

デバッガーの観察:

  • 変数 Mem_43_INFLS_eJobRuntimeInfo は 0x20440000 (サイズ: 40 バイト) にあります。

  • 障害指示:

     
    文字列 r0, [r3, #32]
  • 例外レジスタ:

    • CFSR = 0x00000400 (IMPRECISERR = 1)

    • HFSR = 0x40000000 (強制 = 1)

    • BFARVALID = 0

    • BFAR = 0x00000000

この現象は、上記の行が実行されるたびに再現されます

アドバイスをお願いします:

  1. Mem_43_INFLS_eJobRuntimeInfo の正しい配置と構成については、どのドキュメントまたはアプリケーション ノートを参照すればよいですか?

  2. メモリ領域 (0x20440000) が有効であり、この変数に対して適切に初期化されているかどうかを確認するための推奨されるデバッグ方法はありますか?

ありがとう、
チャンユケ

Changyuke_0-1758969088516.png


Re: HardFault during startup on S32K324 M7 core

こんにちは、ダニエル。

ご提案ありがとうございます。障害ステータス レジスタをチェックした結果は次のとおりです。

  • CFSR = 0x00000400

    • 不正確さ = 1

    • 精度 = 0

    • BFARVALID = 0

  • HFSR = 0x40000000 (強制 = 1)

  • BFAR = 0x00000000

Changyuke_0-1758794735999.png


私も:

  1. MPU を無効にしました (プリプロセッサから MPU_ENABLE を削除しました)。

  2. RM にリストされているオプション (オプション B core clk @120Mhz) に従ってシステム クロックを厳密に構成しましたが、システムは依然として HardFault 状態になります。

  3. スタックから正確な障害命令をキャプチャする方法がよくわかりません。実際にこれをどのように行うのか明確にしていただけますか?

根本原因を絞り込む方法について、さらに何か提案はありますか?

ありがとう、
チャンユケ

Re: HardFault during startup on S32K324 M7 core

こんにちは@Changyukeさん

BFAR を使用した PRECISERR はまだ無効ですか?

いずれにせよ、スタック中に障害が発生しない限り、スタック上に障害命令が表示されるはずです。https://community.nxp.com/t5/S32K-Knowledge-Base/S32K14x の障害処理/ta-p/1114447


POR 後、起動コードの先頭でそれをキャッチし、デバッガーをアタッチしてコードをステップ実行します。

Start:
mov r0, #1
cmp r0, 0 /* change r0 to 0 in register view */
bne Start /* Capture after power-on reset */

MPU は system.c で無効に CAN します。MPU 領域が領域のサイズに揃っていない場合、予期しない動作が発生するCANがあります。


RMにリストされているクロックオプションの1つだけを使用してください。例:表158.オプション B - 低速モード (CORE_CLK @ 120 MHz)、その他の構成では予期しない動作が発生するCANがあります。


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

ダニエル

Re: HardFault during startup on S32K324 M7 core

こんにちは、ダニエル。

申し訳ありませんが、当初は問題は解決したと思っていましたが、さらにテストを行ったところ、特定の条件下では問題がまだ残っています。

S32K344 FEE デモを参照して、S32K324 で FEE 機能をテストしています。システムは、main() に到達する前に、起動フェーズ中に HardFault に入ります。リンカー ファイルおよびその他の構成は変更されていません。

観察された動作:

  • 最初に NXP S32K344 FEE デモをフラッシュし、次に S32K324 プロジェクトをフラッシュすると、プログラムは正常に起動します。

  • S32K324 プロジェクトを直接フラッシュすると、電源投入時にシステムが常に HardFaults になります。

試みと観察:

  • CPU 周波数を 80 MHz に下げても問題は解決しません。

  • FEE/Flash 初期化 (つまり、MemAcc_Init と Fee_Init) をコメント アウトしても、HardFault が発生します。

  • Core0 と Core1 のフラッシュ順序は現象に影響しません。

  • 短い電源サイクルでは一貫して動作しますが、長期間の電源オフ (数日間) の後、電源オン時にシステムが再び HardFaults になります。

この問題は、起動メモリ、MPU/キャッシュ/TCM 構成、または電源投入時のフラッシュの準備状況に関連している可能性があると思われます。

S32K3xx デバイスで同様の動作に遭遇した方はいらっしゃいますか? また、推奨されるトラブルシューティング手順は何でしょうか?

ご指導いただければ幸いです。

よろしくお願いいたします。
チャンユケ

回复: HardFault during startup on S32K324 M7 core

こんにちは、ダニエル。
MEMACC 設定を更新し、FEE メイン関数の期間を調整したところ、すべて正常に動作するようになりました。助けてくれてありがとう!

Re: HardFault during startup on S32K324 M7 core

こんにちは、ダニエル。

早速のご返信ありがとうございます。

HardFault 中に障害ステータス レジスタをチェックしました。

  • CFSR = 0x00000400 (PRECISERR、正確なデータバスエラー)

  • HFSR = 0x40000000 (強制)

  • MMFAR = 0

  • 外径 = 0

コンテキスト: FEE モジュールを統合する前は、プログラムは HardFault なしで正常に実行されます。この障害は、デモに従って FEE を設定および統合した後にのみ発生するため、問題は FEE 初期化シーケンスに関連していると考えられます。

また、デフォルトのリンカー ファイルやスタートアップ コードは変更していません。これらは SDKs の元のコードのままです。

よろしくお願いいたします。
チャンユケ

Re: HardFault during startup on S32K324 M7 core

こんにちは@Changyukeさん

それはどのような障害例外ですか?

CAN 構成可能障害ステータス レジスタ (CFSR) を読み取りますか?

https://developer.arm.com/documentation/ddi0403/d/System-Level-Architecture/System-Address-Map/Syste...


デフォルトのリンカー ファイルとスタートアップ コードを変更しましたか?

もしSOなら、ファイルを共有してください。


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

ダニエル

标记 (1)
无评分
版本历史
最后更新:
‎11-20-2025 12:46 PM
更新人: