アームコルテックスM3困難な障害の前にプログラムのカウンター値を決定するにはどうすればよいですか?
-
04-10-2019 - |
質問
STM32F103(ARM Cortex M3)を使用して埋め込まれたプロジェクトを持っていますが、リリースモードで時折困難な障害を得ています。回復の一環として、ハードフォールトの前からPC値を取得し、後でバッテリーバック領域でデバッグするために保存したいと思います。
困難な障害の時点でプログラムカウンターの価値をどのように判断しますか?明らかに、PCはHardFault割り込み内の位置に設定されています。
どこを見ればいいですか?通常モードレジスターバンクの住所はありますか?
ありがとう!
解決
Cortex-M3は、「クラシック」アームからの例外処理のまったく異なるモデルを使用します。たとえば、他の投稿で言及されている「アボートモード」がありません。読むことをお勧めします このアプリメモ. 。たとえば、困難な障害の場合:
SCB-> BFARの値は、バス障害を引き起こしたメモリアドレスを示し、SCB-> CFSRレジスタのBIT BFARVALIDが設定されている場合に有効です。 SCB-> MMFARの値は、メモリ管理障害を引き起こしたメモリアドレスを示し、SCB-> CFSRレジスタのビットMMFarValidが設定されている場合に有効です。
例外時にPC値を決定するには、スタックを調べる必要があります。プロセッサは、ハンドラーを実行する前に、R0-R3、R12、PC、およびLRをプッシュします。使用されるスタックは、メイン(LRのビット2が0の場合)またはプロセス(それ以外の場合)のいずれかです。詳細については、アプリのメモの13ページを参照してください。
他のヒント
あなたはを調べる必要があります アームアーキテクチャリファレンスマニュアル 例外に関するセクションで。あなたはそれを取得するために登録する必要があります。
通常、関連するアドレスはリンクレジスタLR(R14)に配置されますが、正確な意味は例外によって異なり、オフセットはさまざまです。
WRTユーザー/システムモードレジスタバンクにアクセスすると、モードを切り替えるにはアクセスする必要があると思います。
例外が発生すると、プロセッサ状態は現在の状態から アボート 州。中止状態では、プロセッサがSPとLRの新しいレジスタセットを使用するようにシフトします(SP_ABTおよびSP_LR。データ中止の場合、LR_ABT + 4の知事のLR_ABT + 8では、違反指示はLR_ABT + 8にあります( ARMV7 ArchiteCureリファレンスマニュアル)
このトピックについてFAQがあります。 FAQからリンクされたページには含まれます 障害ハンドラーコード これにより、スタックからプログラムカウンターが得られます。
これらの問題の一般的な原因は、「ループのための」遅延であることを発見しました。 -O3を使用する場合、揮発性変数を参照していない場合、それらは単に最適化されます。個人的には、サイスティックアプローチが好きです。