6

STM32F103(ARM Cortex M3)を使用した組み込みプロジェクトがありますが、リリースモードでときどきハードフォールトが発生します。リカバリの一環として、ハードフォールト前のPC値を取得し、後でデバッグできるようにバッテリバックアップ領域に保存したいと思います。

ハードフォールトのポイントでのプログラムカウンターの値をどのように決定しますか?明らかに、PCはハードフォールト割り込み内のその場所に設定されています。

どこを見ればいいですか?ノーマルモードレジスタバンクのアドレスはありますか?

ありがとう!

4

5 に答える 5

6

Cortex-M3は、「クラシック」ARMとはまったく異なる例外処理モデルを使用します。たとえば、他の投稿で言及されている「中止モード」はありません。このアプリノートを読むことをお勧めします。たとえば、ハードフォールトの場合:

SCB-> BFARの値は、バス障害の原因となったメモリアドレスを示し、SCB->CFSRレジスタのビットBFARVALIDが設定されている場合に有効です。SCB-> MMFARの値は、メモリ管理障害の原因となったメモリアドレスを示し、SCB->CFSRレジスタのビットMMFARVALIDが設定されている場合に有効です。

例外発生時のPC値を決定するには、スタックを調べる必要があります。プロセッサは、ハンドラを実行する前にR0〜R3、R12、PC、およびLRをプッシュします。使用されるスタックは、メイン(LRのビット2が0の場合)またはプロセス(それ以外の場合)のいずれかです。詳細については、アプリノートの13ページを参照してください。

于 2010-09-22T09:31:15.167 に答える
3

例外のセクションにあるARMアーキテクチャリファレンスマニュアルを参照してください。取得するには登録する必要があります。

通常、関連するアドレスはリンクレジスタLR(R14)に配置されますが、正確な意味は例外によって異なり、オフセットも異なります。

ユーザー/システムモードのレジスタバンクにアクセスする場合、アクセスするにはモードを切り替える必要があると思います。

于 2010-09-21T20:31:03.707 に答える
1

例外が発生すると、プロセッサの状態が現在の状態からアボート状態に変わります。アボート状態では、プロセッサはspとlrの新しいレジスタセット(それぞれsp_abtとsp_lr)を使用するようにシフトします。データアボートの場合、問題のある命令はlr_abt+8にあります。 ARMv7 Architecureリファレンスマニュアル)

于 2010-09-21T20:49:47.750 に答える
1

このトピックに関するFAQがあります。FAQからリンクされているページには、スタックからプログラムカウンターを取得するフォールトハンドラーコードが含まれています。

于 2013-06-12T05:43:23.550 に答える
0

これらの問題の一般的な原因は、「forループ」の遅延であることがわかりました。-O3を使用する場合、揮発性変数を参照していない場合は、それらが最適化されます。個人的には、SysTickアプローチが好きです。

于 2010-09-21T20:31:45.717 に答える