Cortex-M 4 HardFault原因の検索方法
3216 ワード
Cortex-M 4 HardFault原因の検索方法
文書ディレクトリ
このブログの背景を書く
ここ数日、GithubでArminkという大神がCortex-MシリーズのHardFaultプロジェクトを追跡しているのを見た.
思想を簡単に述べる.
簡単に言えば、HardFaultが発生した後、HardFaultジャンプが中断する前にスタック情報を保存し、カーネルFaultレジスタの状態に基づいて現在どのFaultであるかを判断する.死亡前の現場を保存する.
私のやり方
Step 1:
startup_stm32f407xx.s
のHardFault割込み処理部分コードを修正し、私が指定した関数にジャンプしてスタック情報をグローバル変数に保存することで、デバッグを停止した後、Keilのwatch 1
にグローバル変数の値を表示することができます.HardFult_Handler PROC
; EXPORT HardFault_Handler
IMPORT call_back_fault ; C ,
MOV R0, LR
MOV R1, SP
LDR R2, =call_back_fault
BLX R2
B .
ENDP
Step 2:
void call_back_fault(uint32_t fault_lr,uint32_t fault_sp);
が完了する後に.hファイルで宣言します.uint32_t stack_add[20] = {0};
uint32_t stack_data[20] = {0};
void call_back_fault(uint32_t fault_lr,uint32_t fault_sp)
{
uint8_t i = 0;
uint32_t stack_pointer = fault_sp;
for(i = 0;i<16;i++)
{
stack_add[i] = stack_pointer;
stack_data[i] = *(uint32_t *)stack_pointer;
stack_pointer += 4;
}
}
Step 3:
void fault_test(void)
{
volatile int * SCB_CCR = (volatile int *)0xE000ED14;
int x,y,z;
*SCB_CCR |= (1<<4);
x = 10;
y = 0;
z = x / y;
}
Step 4:
void fault_test(void);
Step 5:
Peripherals --> Core Peripherals --> Fault Reports
ビューダイアログボックスの次の点を開きます:View --> Watch Windows --> Watch 1
を開き、2つのグローバル変数をウィンドウに追加し、2つのグローバル変数配列の値を表示します.Step 5:
addr2line -e XXX.axf -a -f addr1 addr 2 addr3 addr4 addr5 addr6
解釈コマンド
MinGW
ソフトウェアをインストールできる場合、そのインストールディレクトリの下にbin
フォルダ内にこのコマンドがあり、このコマンドパスをシステム環境変数に追加すればよい.インストールが完了した後、コマンドライン実行addr2line --help
コマンドでインストールに成功したかどうかを確認することができる.Watch 1
ウィンドウで観察されたグローバル変数stack_data[]
における0 x 0800 xxxに関する値である.