IDE が私をトローリングしているという問題に遭遇しました。
ITM (SWO) を介して mcu からトレースバックする単純なプロジェクトがあります。基本的に、STlink デバッガーを起動すると、デバイスフラッシュプログラムに接続され、IDE はすべてのブレークポイントを無視します。手動で停止して、リセット ハンドラーからデフォルト ハンドラーに変更したことを確認しました。hardfault を除くすべてのハンドラーにエイリアスを設定しました。
それで、奇妙なたわごとが起こり始めました。私は自分のコードをチェックしました...犯罪者はいません。まったく..メモリをチェックしたところ、すべてが本来あるべき場所にありました。ベクトルテーブルのメモリをチェックしました...再びスタックポインタが最初で、次にリセットハンドラのアドレスです(サムモード)。すべて順調。デバッガーを再度起動すると、魅力的に動作します。
そのため、コードを何も変更せずにデバッガーを再起動することにしましたが、最終的にハードフォールトになりました...その後、ハードフォールトなしで再度起動しましたが、デフォルトのハンドラーにいます。ランダムに障害が発生したり、実行されたりします。私は2〜3時間かけて、すべてのビットと指示をチェックして、何がうまくいかないかを確認しました. しかし、どこに行くかをランダムに選択するように見えます-ハードフォールト、通常の実行、またはデフォルトハンドラーが必要であると決定しました。
このメモリによると、少なくともリセットハンドラーに移動しようとする必要があります
0x20010000 スタック ポインター - アドレスは正当です。確認しました。
0x080001D5 は、0x080001D4 のリセット ハンドラーを指します。
0x080001C9 デフォルトのハンドラー アドレスで、次はハードフォールトです。
さらに奇妙なこと...デバッガーをOPENOCDに切り替えて...
xPSR: 0x61000000 pc: 0x20000084 msp: 0x20010000
明らかに、RAM からの起動が困難であり、リセット ハンドラで何が起こっているのかが明確にわかりません。その後、デバッガーを数回再起動すると、正常に実行されます。
アップデート:
私は今、それが IDE のファンキーな動作であると 100% 確信しています。スタンドアロンのopenOCDクライアントでプログラム全体をステップ実行すると、魅力的に動作します。ハンドラーへのハードフォールトやその他の予期しないジャンプはありません。