デバッグ用のコネクタにはJTAG,SWDのどっちかが主流(Cortex-M)
EWARMとCortex-Mマイコンを使用したソフトウェア構成構築ガイド
配線の量考えるとSWDのほうがいいかな.
Cortex-DebugでSVDファイルを渡すとデバッグの際にレジスタの情報を見ることができる。
マイコンがハードウェア的に正常動作が続行不可能に陥った際の例外処理
ARM Cortex-M4コアの例外ハンドラ
これらのフォールトが生じたとき,それぞれに対応した例外処理が動作吸うので,各種割り込みハンドラの中で対応した処理を実施する.
どのフォールトが発生したかは,FSR(Fault Status Register)に反映されるのでこれを読み出す.
Cortex-M4では,HSFR
とCFSR
レジスタがFSRとして用意されている.
HSFR(HardFault Status Register)
: ハードフォールトの状態が反映されるレジスタCFSR(Configurable Fault Status Register)
: 用法フォールト,バスフォールト,メモリ管理フォールトの状態が反映されるレジスタ
CFSR
はハートフォード以外の3つのフォールト状態がまとめて記録されているレジスタである.3つのフォールト・レジスタへはバイト単位,ハーフワード単位のアクセスが可能
UFSR
用法フォールト・ステータス・レジスタBFSR
バスフォールト・ステータス・レジスタMMFSR
メモリ管理フォールト・ステータス・レジスタ
PC : どこを実行していたか
LR : どこにReturnする予定だったか
SCBでフォルト機能の管理が可能.CCR
の4bit(DIV_0_TRP
)を1にセットすると0除算をトラップ可能.
SCB->CCR |= 0x10; // enable div-by-0 trap
0除算が生じると,用法フォールトが発生し,CFSR
の25bit(DIVBYZERO
)フラグが1になる.
Armv7はアンアラインド・アクセスができるけど,CPU効率が悪くなるのでできないならしないプログラムが書ける方がいい
SCBでフォルト機能の管理が可能.CCR
の3bit(UNALIGN_TRP
)を1にセットするとアンアラインド・アクセスをトラップ可能.
SCB->CCR |= 0x08; // enable unaligned access
4バイトアライメントに整合していないアクセスをすると,用法フォールトが発生し,CFSR
の24bit(UNALIGNED
)フラグが1になる.
STM32F4シリーズを使ってみる14 - FatFsとSDカード再考その3(SDIOでDMAした時の不具合対策編) -
アラインされていないデータのアクセス
アンアラインド・データ・アクセス、動作モード、特権アクセス
ある例外が,優先度やそれが無効であることを理由によりできないとき,それらの例外は全部ハードフォールトに昇格される.
この昇格によってハードフォールトが発生したとき,HFSR
の30bit(FORCED
)が1にセットされる
stm32の場合,stm32fyxx_it.c
には割込みハンドラ関数がまとまってる。 HardFault_Handler()
もここに入ってるので
ここで各レジスタをダンプするアセンブリコード書いておく。
void HardFault_Handler(void) { __asm volatile ( " tst lr, #4 \n" " ite eq \n" " mrseq r0, msp \n" " mrsne r0, psp \n" " ldr r1, [r0, #24] \n" " ldr r2, handler2_address_const \n" " bx r2 \n" " handler2_address_const: .word prvGetRegistersFromStack \n" ); } void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress ) { /* These are volatile to try and prevent the compiler/linker optimising them away as the variables never actually get used. If the debugger won't show the values of the variables, make them global my moving their declaration outside of this function. */ volatile uint32_t r0; volatile uint32_t r1; volatile uint32_t r2; volatile uint32_t r3; volatile uint32_t r12; volatile uint32_t lr; /* Link register. */ volatile uint32_t pc; /* Program counter. */ volatile uint32_t psr;/* Program status register. */ r0 = pulFaultStackAddress[ 0 ]; r1 = pulFaultStackAddress[ 1 ]; r2 = pulFaultStackAddress[ 2 ]; r3 = pulFaultStackAddress[ 3 ]; r12 = pulFaultStackAddress[ 4 ]; lr = pulFaultStackAddress[ 5 ]; pc = pulFaultStackAddress[ 6 ]; psr = pulFaultStackAddress[ 7 ]; /* When the following line is hit, the variables contain the register values. */ for( ;; ); }
CrashCatcherが便利なので参照のこと
フォールト(Fault)って何? ~ 種類と解析方法
PM0214 プログラミング・マニュアル Cortex®-M4 プログラミング・マニュアル
Cortex-M3 Devices Generic User Guide Fault types
技術情報:Cortex-M の障害・例外について
How to debug a HardFault on an ARM Cortex-M MCU
Debugging Hard Fault & Other Exceptions
on ARM Cortex-M3 and ARM Cortex-M4 microcontrollers
Cortex-M3 / M4 Hard Fault Handler
Developing a Generic Hard Fault handler for ARM Cortex-M3/Cortex-M4
STM32 microcontroller debug toolbox