임베디드 용어 사전
디버깅

HardFault

다른 폴트 핸들러가 처리하지 못한 예외가 승격돼 오는 최후의 예외. 대개 잘못된 포인터나 정렬 위반이 원인이다.

"뭔가 크게 잘못됐다" 는 신호다. 원인은 다른 데 있고 여기로 모인다.

네 종류가 있다

MemManage    MPU 위반, 실행 불가 영역에서 실행
BusFault     존재하지 않는 주소 접근, 버스 오류
UsageFault   정렬 위반, 0 나눗셈, 잘못된 상태
HardFault    위 셋이 비활성이거나 처리 중 또 터졌을 때 승격돼 온다

개별 폴트를 활성화해 두면 원인이 어느 종류인지 바로 갈린다. 그렇지 않으면 전부 HardFault 로 온다.

흔한 원인

널 포인터·초기화 안 된 포인터 역참조
스택 오버플로로 엉뚱한 영역을 덮음
배열 범위를 넘긴 쓰기
클럭을 안 켠 주변장치 레지스터 접근
함수 포인터가 쓰레기 값

마지막 둘이 임베디드 특유다. 특히 클럭 게이팅을 안 켜고 레지스터를 만지면 버스 폴트가 난다.

그냥 무한 루프로 두지 않는다

void HardFault_Handler(void) { for (;;) {} }   /* 아무 정보가 없다 */

증거 레지스터를 읽어 남기는 핸들러로 바꾸는 것이 기본이다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 폴트 해독 — HardFault 에서 원인을 찾아내기