問題タブ [zephyr-rtos]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gdb - Zephyr の GDB ツール
私は zephyr OS でプロジェクトに取り組んでおり、コードをデバッグしたいと考えています。ウェストフラッシュまたはビルドでGDBデバッグツールを使用する方法を知っている人はいますか? 通常、デバッグを開始するには、zephyr west と組み合わせます。
c++ - NXP MIMXRT1061 CVL5Aで正しく実行できません
バグの説明
現在、MCU: NXP MIMXRT1061 CVL5A を搭載した開発ボードで Zephyr7.0 を実行しようとしています。サンプルをコンパイルしました: \samples\basic\blinky ですが、正しく実行できませんでした。最初は、Zephyr が正しく起動しない原因は XIP 形式の問題だと思っていましたが、SWD を使用してデバッグしたところ、正しく起動することがわかりました。ただし、呼び出し時: /zephyr/arch/arm/core/aarch32/prep_c.c: z_bss_zero(); 関数 Zephyr が失敗しました
コンパイルプロセス
私が使用しているボードは mimxrt1060_evk です。1061 は 1060 をベースにしているため、理論的には問題ありません。
- west build -p auto -b mimxrt1060_evk .\samples\basic\blinky\
- ウェストフラッシュ
デバッグプロセス
最初のデバッグは z_interrupt_stacks で中断されました
その後、シングルステップ デバッグを使用したところ、Zephyr が z_bss_zero に到達したことがわかりました。
最終的に memset 関数で問題を特定しました。この関数が呼び出されると、無限ループに陥り、プログラムがクラッシュします。
後で memset 関数をデバッグしようとしたところ、ループ中に dest アドレスが変更されないことがわかりました。非常に奇妙です。gdb の問題なのか、zephyr の問題なのかは特定していません。アドレスは、インクリメント前は 0x80000030、インクリメント後は 0x80000031 で、次のサイクルが繰り返されると 0x80000030 に戻ります。
z_bss_zero 関数を変更してみました
サイズ丈を変更しました
しかし、gdbでデバッグしていると、memset内のwhileループが止まらずに3回超えてしまい、無限ループに陥ってしまいました。これら 2 行のコードの後のインクリメントされたコードに問題があると推測します。なぜなら、gdb print コマンドを使用してインクリメントごとに変数の値を出力すると、変数の値が変化しないからです。
もう 1 つの奇妙な点は、gdb を使用してデバッグすると、ポインターがあることがわかります。Gdb はこちら側にブレークすることはありませんが、このコードをスキップして実行します。コンパイラが私にそれをしているとは思えません。コードは最適化されていますか?
詳細
next を使用して z_bss_zero を実行すると、gdb は 0xdeadbeee の不確定なアドレスにブレークします。おそらく、メモリの初期化時に Zephyr がスタックを破壊したのでしょう。
同時に、Jlink デバッガーもエラー ログを出力します。
Jlink出力
以下は、Jlink が出力する MCU 情報です。このバージョンが Zephyr でサポートされているかどうかはわかりません
私は 7 日間懸命に努力しましたが、まだこの問題を解決できません。Zephyr のバージョンを切り替えてみたり、プラットフォーム IO を使用して elf ファイルと bin ファイルを生成したりしましたが、いずれも効果がありませんでした。私を助けてください。どうもありがとうございました。