電源(5Vリニア)とMCXE316デバイスのみを搭載したシンプルな基板を起動しようとしています。PE Micro Multilink Universalを使用してコードを添付およびロードすることはできますが、プロセッサが実行を開始するとすぐにsemihost_hardfaultエラーでクラッシュします。デバッガによると、エラーの原因はFPコプロセッサを有効化せずに使用したことである。このクラッシュは毎回発生し、同じ場所に複数のハードウェアボードを設置した場合でも同様の結果となる。
インターネットで調べたところ、浮動小数点演算を行う前に浮動小数点コプロセッサを初期化する必要があることがわかりました(コプロセッサが有効になっていないとVFPレジスタが使用できないため)。私が使用しているテストコードは、基本的にMCUxpressoによってMCXE316用に自動生成されたSDKコードです。コード内では浮動小数点演算は使用されていませんが、この不具合は必ずコードをハードウェアにロードした後に発生します。
__FPU_PRESENT=1 が定義済みシンボルに含まれていることを確認しました。含まれていなかったので追加しました (プロジェクトプロパティ->C/C++ ビルド->設定->ツール設定->MCU C コンパイラ->プリプロセッサ)。SystemInit() の起動コード (system_MCXE316.c 内)生成されたファイル)は、FPユニットを有効にするためにこれをチェックします。
#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
SCB -> CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* CP10、CP11 にフルアクセスを設定 */
#endif
さて、テストのために、条件なしでこのレジスタ設定を強制的に適用してみましたが、同じエラーが発生しました。
プロセッサに障害が発生した際、デバッガは私に次のようなメッセージを表示します。
MCXE316_ハードフォルトHFSR
強制 (30) 設定可能な優先度を持つ障害のエスカレーションによって発生した、強制的なハード障害を示します。
使用エラー (UFSR)
NOCP(3) コプロセッサがありません UsageFault。このプロセッサはコプロセッサ命令をサポートしていません
障害ステータスレジスタ:
IPSR - 0x00000003 - 例外ステータスレジスタ(ハードフォルト)
CFSR - 0x00080000 - 設定可能な障害ステータスレジスタ
UFSR - 0x00000008 - ユーザー障害ステータスレジスタ
HFSR - 0x40000000 - ハードフォルトステータスレジスタ
DFSR - 0x00000008 - デバッグ障害ステータスレジスタ
ABFSR - 0x00000000 - 補助バス障害レジスタ
スタック
MCXE316_SDK.axf
スレッド #1 (中断: シグナル: SIGTRAP:トレース/ブレークポイントトラップ)
semihost_hardfault.c:53 の HardFault_Handler() 0x40677c()
ram_init_done() (0x40145c)()
そこで質問なのですが、初期化に関して何か見落としている点はあるでしょうか?デフォルトのMCUxpressoの定型コードは、そのままハードウェア上で動作するはずだと私は考えています。ハードウェアの問題である可能性も考えられますが、デバッガーツールでは接続とコードのダウンロードが正しく行われていると表示されており、複数のハードウェアで試してみましたが、結果は同じでした。
問題は、MCXE316デバイスを明示的に使用する評価ボードがどこにも存在しないことです。市販されているボードはすべて、上位互換デバイスであるMCXE31Bを使用しています。つまり、ツールの問題なのか、ハードウェアの問題なのか、設定の問題なのか、よく分からないのです。
工場でMCXE316ハードウェアが稼働している場合、MCUxpressoで新しいSDKプロジェクトを作成し、そのハードウェア上で動作するかどうかを確認していただけますでしょうか?もしそうであれば、そのプロジェクトを公開できますか?これは問題解決に大いに役立つだろう。今のところ、私は手探り状態だ。
よろしくお願いします!
こんにちは、 @brucebowling さん、
ご回答とご協力ありがとうございました。あなたの提案に従って、MCXE316 用の新しい C/C++ プロジェクトを作成し、それを(変更せずに)コンパイルして、この空のプロジェクトを読み込んで実行しようとしました。結果は同じで、以前と同じようにコプロセッサのエラーが発生しています。
C/C++プロジェクトの作成者によると、SDKのバージョンはSDK 26.03.00、ビルド番号は2026年3月27日です。
基板を点検し、コア電圧とV2.5電圧が正しく測定されていること、および回路がリファレンスマニュアルに記載されている情報に従っていることを確認しました。いずれの場合も、P&Eツールはフラッシュメモリのダウンロードとプログラミング、正しいチェックサム応答の取得を行っていることを示していますが、実行時にエラーが発生します。実行中に基板の電圧を監視しましたが、安定していました。
メールアドレスを教えていただければ、顧客情報とプロジェクト情報をお送りします。私は現地の販売代理店のFAE(フィールドアプリケーションエンジニア)とNXPのセールスエンジニアと協力しており、彼らは私のプロジェクトを認識しています。サポートのために、返信メールに彼らをCCに追加します。
ご協力ありがとうございました。
こんにちは、 @brucebowling さん、
検査にご協力いただき、また結果を共有していただき、ありがとうございました。この問題をソフトウェアチームに報告し、さらなる検証へのサポートを依頼します。
お客様とプロジェクトに関してですが、お客様専用のCASEを作成し、メールにてご連絡いたします。その後も、そこでフォローアップや返信を続けることができます。
BR
セレステ
こんにちは、
この問題は解決しました。他の人の参考になるように、修正方法をここに共有します。
回避策としては、startup_MCXE316.c の「void Reset_Handler(void)」関数の末尾の前に以下のコードを追加する方法があります。
// Call Reset_Handler_C
__asm volatile ("LDR R0, =Reset_Handler_C \n"
"BLX R0 \n"
);
下の画像をご覧ください。
この問題は次回のSDKリリースで修正いたします。ご質問がございましたら、いつでもお気軽にお問い合わせください。
BR
セレステ