アームコルテックスM3困難な障害の前にプログラムのカウンター値を決定するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3764119

質問

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を使用する場合、揮発性変数を参照していない場合、それらは単に最適化されます。個人的には、サイスティックアプローチが好きです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top