STM32 마이크로컨트롤러 환경에서 발생할 수 있는 무단 메모리 접근 및 정의되지 않은 영역 침범 시 발생하는 하드웨어 Fault 메커니즘과 이로 인해 HardFault가 유발되는 물리적 과정을 분석한다.
1. 개요
ARM Cortex-M 코어 아키텍처는 시스템 안정성과 무결성을 실시간으로 모니터링하기 위해 하드웨어 기반의 Fault 감지 로직(Fault Detection Logic)을 내장하고 있다. 개발 과정에서 하드웨어 초기화 이전에 특정 메모리 주소를 참조하거나 스택 오버플로우 등의 결함이 발생할 경우, 코어는 이를 감지하여 예외를 발생시킨다.
2. 하드웨어 예외 감시 장치 아키텍처
Cortext-M 코어 내부에는 예외의 성격과 발생 원인에 따라 세분화된 3개의 하드웨어 fault 감지 모듈이 존재한다.
2.1 예외 종류 및 하드웨어적 원인
예외 유형
감시 대상 및 하드웨어적 유발원인
예시
BusFault
버스 매트릭스상에서 존재하지 않는 주소 버스를 디코딩하거나, 응답이 없는 외부 슬레이브 장치에 데이터를 요청할 때 타임아웃 발생
FMC 초기화 시퀀스 완료전 LCD 컨트럴러가 버스를 통해 해당 메모리 주소를 강제 참조할 때
UsageFault
정의되지 않은 명령어를 디코드하거나, 실행 불가능한 주소로 분기 또는 0으로 나누기 연산 수행 시 감지
스택 오버플로우로 인해 함수 리턴 주소가 오염되어 비정상적인 메모리 번지로 코어가 점프할 때 발생
MemManageFault
내부 MPU(Memory Projection Unit)가 정의한 메모리 맵의 속성(Read only 등)을 위반하여 데이터를 쓰거나, 실행 권한이 없는 영역에서 코드를 Fetch할 때 차단
데이터 영역으로 할당된 플래시 메모리 또는 특정 특수 목적 레지스터 영억에 비정상적인 포인터 연산으로 접근 시 발생
3. HardFault Escalation 메커니즘
많은 임베디드 환경에서 위 3가지 개별 fault 상황이 발생했음에도 불구하고 최종적으로 항상 HardFault_Handler로 진입하게 된다. 이는 ARM 코어의 Fault Escalation 시스템 때문이다.
3.1 SHCSR(시스템 핸들러 및 제어 및 상태 레지스터)의 역할
칩이 부팅된 직후(reset 상태), SCB(시스템 제어 블록)의 SHCSR(System Handler control and Status Register) 내부의 BUSFAULTENA, USGFAULTENA, MEMFAULTENA 비트는 모두 0 (Disabled)으로 설정되어 있다.
개별 핸들러가 비활성화된 상태에서 감시 조건이 감지되면, 코어는 하드웨어 수준에서 해당 오류를 최상위 치명적 결함으로 판단하여 즉시 HardFault 등급으로 격상한다. 즉, HardFault는 개별 비상벨이 꺼져 있을 때 동작하는 시스템 전체의 최종 종합 비상 셧다운 루틴이다.
4. 하드웨어 감시 장치의 당위성
만약 아키텍처 내에 이러한 메모리 침범 감시 로직이 존재하지 않는다면, 코어는 잘못된 주소에서 읽어 들인 쓰레기값을 정상 명령으로 인하여 무작위 연상을 지속하게 된다.
이는 전역 변수 영역 오염, 데이터 버스 충돌을 유발하고 외부 액추에이터 및 하드웨어의 오동작으로 이어질 수 있다.
따라서, HardFault를 통한 시스템 정지는 물리적 피해를 막고 시스템을 안전한 상태로 유지하기 위한 필수적인 안전장치이다.