Configurable Fault Status Register (0xE000ED28). HardFault 를 추측이 아니라 근거로 잡는 출발점이다.
세 부분으로 나뉜다
MMFSR 메모리 관리 폴트 MPU 위반, 실행 불가 영역 실행
BFSR 버스 폴트 존재하지 않는 주소 접근, 정밀·비정밀 구분
UFSR 사용 폴트 정렬 위반(UNALIGNED), 0 나눗셈, 잘못된 상태
함께 보는 레지스터가 더 있다.
| 레지스터 | 내용 |
|---|---|
| HFSR | HardFault로 승격됐는지(FORCED) |
| MMFAR / BFAR | 문제가 된 주소 |
실전 절차
void HardFault_Handler(void) {
volatile uint32_t cfsr = SCB->CFSR;
volatile uint32_t bfar = SCB->BFAR;
for (;;) { } /* 디버거로 멈춰 값을 본다 */
}
1. CFSR 에서 어떤 종류인지 확인 (예: UNALIGNED 비트)
2. BFAR/MMFAR 로 문제의 주소 확인 (예: 0x00000003 → 널 포인터 근처)
3. 스택 프레임에서 원래 PC 를 꺼낸다 (예외 진입 시 R0-R3, R12, LR, PC, xPSR 이 쌓인다)
4. PC 를 맵 파일과 대조해 함수를 특정한다
왜 이걸 해두면 좋은가
"디버깅 어떻게 하세요"는 거의 반드시 나오는 질문이다. 일부러 폴트를 내고 원인을 역추적해 본 경험은 이 질문의 완성된 답이 된다. 평소에 로그로만 디버깅한 지원자와 확실히 갈린다.