"뭔가 크게 잘못됐다" 는 신호다. 원인은 다른 데 있고 여기로 모인다.
네 종류가 있다
MemManage MPU 위반, 실행 불가 영역에서 실행
BusFault 존재하지 않는 주소 접근, 버스 오류
UsageFault 정렬 위반, 0 나눗셈, 잘못된 상태
HardFault 위 셋이 비활성이거나 처리 중 또 터졌을 때 승격돼 온다
개별 폴트를 활성화해 두면 원인이 어느 종류인지 바로 갈린다. 그렇지 않으면 전부 HardFault 로 온다.
흔한 원인
널 포인터·초기화 안 된 포인터 역참조
스택 오버플로로 엉뚱한 영역을 덮음
배열 범위를 넘긴 쓰기
클럭을 안 켠 주변장치 레지스터 접근
함수 포인터가 쓰레기 값
마지막 둘이 임베디드 특유다. 특히 클럭 게이팅을 안 켜고 레지스터를 만지면 버스 폴트가 난다.
그냥 무한 루프로 두지 않는다
void HardFault_Handler(void) { for (;;) {} } /* 아무 정보가 없다 */
증거 레지스터를 읽어 남기는 핸들러로 바꾸는 것이 기본이다.