チームの皆さん、こんにちは。
私は MIMXRT1040-EVK を使っており、 MCUXpresso IDEとLinkServer/SWDを使っています。
私のアプリケーションはRAMからリンクして実行されると正しく動作するのに、外部FlexSPI NOR Flashから実行するように設定すると、デバッガがmain()に到達しないという問題に直面しています。
RAM構成:
「リンクアプリケーションをRAMに」有効化
アプリケーションダウンロード成功
アプリケーションは正しく実行されます
デバッガーがmain()に到達しました
アプリケーションは通常通りデバッグできます
Flash/XIPビルド:
「リンクアプリケーションをRAMに」無効化
アプリケーションは0x60000000から外部フラッシュと連携されます
ビルドは正常に完了しました
.axf が生成されます
デバッグを開始しても、デバッガーは main() に到達しません。
CPUは、想定される0x600xxxxx XIPアドレス範囲から実行されていないようです。
生成された.mapファイルには、想定されるXIPレイアウトが示されています。
.boot_hdr 0x60000000
.boot_hdr.conf 0x60000000
.boot_hdr.ivt 0x60001000
.boot_hdr.boot_data
0x60001020
.text 0x60002000
.isr_vector 0x60002000
ResetISR 0x6000231C
main 0x60004EF4したがって、アプリケーションには期待されるFlexSPI NORブートヘッダー、IVT、ブートデータ、ベクターテーブル、ResetISR、アプリケーションコードが含まれているように見えます。
私も以下を持っています:
XIP_EXTERNAL_FLASH = 1 XIP_BOOT_HEADER_ENABLE = 1
フラッシュイメージのデバッグ/プログラミングを試みた後、メモリを以下の場所で確認しました。
0x60000000 0x60001000 0x60002000
メモリウィンドウは期待されるアプリケーション内容ではなく、0x00000000/空のデータを表示します。
例えば、次の場所で:
0x60002000
アプリケーションベクターテーブルを期待していましたが、メモリにはゼロが含まれているようです。
デバッグ試行失敗後のCPUレジスタには、以下の情報も表示されていました。
PC = 0x0020E368 SP = 0x20200F70 LR = 0x0020ED49
想定される0x600xxxxx XIP領域にあるPCではなく。
私は以下を使用しています:
Debug Connection: SWD Connect script: RT1040_connect.scp
デバッグ構成には以下が含まれます。
Load image: enabled Use project binary: igpio_led_output.axf Load symbols: enabled Use project binary: igpio_led_output.axf Set breakpoint at: main Request hardware breakpoint: enabled
LinkServerのデバッグ構成が使用されています。
このプロジェクトには、標準的なXIP関連ファイルが含まれています。
xip/ ├── evkmimxrt1040_flexspi_nor_config.c ├── evkmimxrt1040_flexspi_nor_config.h ├── fsl_flexspi_nor_boot.c └── fsl_flexspi_nor_boot.h
生成されたリンカースクリプトは、ブートヘッダーとアプリケーションを0x60000000から始まるBOARD_FLASH領域に配置します。
なぜ外部FlexSPI NORフラッシュがLinkServerデバッグセッションを起動した際に生成されたXIPイメージでプログラムされていないのか、誰か教えていただけませんか?
具体的には:
MIMXRT1040-EVK + LinkServerは、XIPアプリケーションのデバッグに特定のFlexSPI NORフラッシュドライバー/設定が必要ですか?
RT1040_connect.scpは、外部NORフラッシュの接続とプログラミングの両方に十分ですか?
MCUXpressoのデバッグ設定において、追加のFlashプログラミング設定は必要ですか?
デバッグの設定は特定のflexspi_norフラッシュドライバーを使うべきでしょうか、それともフラッシュツールの設定を使うべきでしょうか?
LinkServer + MIMXRT1040 + 外部FlexSPI NOR + XIPデバッグにおいて、.axfファイルがシンボルとしてロードされるものの、外部フラッシュメモリに実際にはプログラムされないという既知の問題はありますか?
動作する MIMXRT1040-EVK FlexSPI または XIP デバッグセッションで比較できる推奨される NXP の例プロジェクトや設定はありますか?
次に何をチェックすべきか、ご助言いただければ幸いです。
よろしくお願いします。
ご回答ありがとうございます。
ご提案通り 、MCU設定→メモリ の詳細を確認しました。スクリーンショットを添付しました。
BOARD_FLASHメモリは以下のように構成されています。
所在地: 0x60000000
サイズ: 0x800000
フラッシュドライバー: MIMXRT1040_SFDP_QSPI.cfx
つまり、特定の 外部フラッシュドライバーはすでにBOARD_FLASHに設定されているようです。
シリアル ダウンロードモード+MCUプロビジョニングツール の手順も試しました。MCUプロビジョニングツールを使ってイメージのビルドとイメージの書き込みを成功させることができました。
しかしその後も、通常のMCUXpresso + LinkServerデバッグフローでFlashからアプリケーションのプログラムやデバッグを行うことができませんでした。
興味深いことに、 その後もう一度コードをフラッシュやデバッグで試したところ、突然動作し、アプリケーションはFlashから正常に動作するようになりました。
失敗と成功の試行の間に、プロジェクト設定、Flashドライバ、リンカー設定、起動設定を意図的に変更したわけではありません。
ですので、現時点ではアプリケーションやリンカーの設定自体ではなく、Flashのプログラミングや初期化、リセットシーケンスに起因する断続的な問題があるのではないかと考えています。
MIMXRT1040-EVKでこの挙動が起きる原因について教えていただけますか?
特に:
同じ構成が意図的な変更なしで最終的に動作したため、以前の故障の原因を理解し、Flashのデバッグやプログラミングの信頼性を高めたいと考えています。
よろしくお願いします。
こんにちは、@Prashanth1 さん。
あなたが提供したスクリーンショットを見る限り、Flashドライバーの設定は問題なさそうです。
まずはボードをシリアルダウンロードモードにして、MCUXpressoのSecure Provisioning Toolを使ってUSBやuartでイメージをFlashにダウンロードしてみてはどうでしょうか?
この方法はデバッガの影響を切り離し、ボードにフラッシュハードウェアの問題がないか確認するために使用できます。さらに、デバッガーを使用して、ダウンロード失敗時のログを提供してください。
私側ではできるだけ早くRT1040-EVKを手配し、以前添付されたプロジェクトパッケージを使って問題を再現しようと思います。
よろしくお願いします、
ギャビン
こんにちは、ギャビンさん。
ご回答ありがとうございます。
ご提案通り、MCUの設定→メモリの詳細を確認しました。スクリーンショットを添付しました。
私のプロジェクトでは、BOARD_FLASHメモリは次のように構成されています。
つまり、FlexSPI NORフラッシュドライバはすでにBOARD_FLASHメモリ領域に関連付けられているようです。
しかし、MCU設定の上部にある 「Default LinkServer Flash Driver」 フィールドが空欄で、BOARD_FLASHのドライバー欄にはMIMXRT1040_SFDP_QSPI.cfxが表示されていることに気づきました。
確認いただけますか:
主な問題は、アプリケーションが0x60000000で正しくXIPリンクされているのに、LinkServerのデバッグセッションを起動した後、メモリウィンドウの0x60000000/0x60002000にアプリケーションの内容が表示されないことです。
同じアプリケーションでもRAMデバッグは正常に動作します。
参考までにMCU設定のスクリーンショットを添付しました。
よろしくお願いします。
こんにちは、@Prashanth1 さん。
NXP MIMXRTシリーズにご関心をお寄せいただきありがとうございます!
外部フラッシュを使用する場合は、専用のフラッシュドライバーが必要です。IDEでFlashドライバーが正しく読み込まれているか確認してください:(私のスクリーンショットはRT1170を例にしていますが、RT1040も同様の手順です。)
よろしくお願いします、
ギャビン
こんにちは、@Prashanth1 さん。
上記の現象に基づくと、最も可能性の高い原因は、以前にフラッシュメモリ内にダーティデータ/イメージが存在していたことである。誤ったFCBヘッダーであれ、実行時にMCUがエラー状態に入るイメージであれ、これらの問題はイメージの再フラッシュ時に失敗につながることがあります。このシナリオでの標準的な復旧方法はシリアルダウンロードモードに入ることです。こちらの記事もご参照ください: https://community.nxp.com/t5/i-MX-RT-Crossover-MCUs-Knowledge/RT-board-recovery-for-debugger-connect...
フラッシュローダーの選択については、IDE内の「Flash」行で適切なフラッシュドライバーを選択するだけで済みます。*.scpファイルはSDKに付属しており、リンクサーバーの事前設定に使用されます。各コマンドラインについて詳しく知りたい場合は、ファイルに入ることができます。
よろしくお願いします、
ギャビン