임베디드 펌웨어 개발에 관심 있는 분들을 위해 ARM Cortex-M 프로세서의 핵심 레지스터와 실행 모드에 대한 내용을 정리해보았다.
CPU의 상태와 동작 방식을 파악하는 것은 안정적이고 효율적인 펌웨어 개발을 위해 반드시 이해해야 할 주제라고 생각한다.
xPSR
은 ARM Cortex-M의 단 하나의 32비트 상태 레지스터.
다음의 세 가지 논리적 레지스터를 포함:
이들은 각각 독립된 레지스터가 아니라 xPSR
의 일부 비트 영역을 의미.
ALU 연산 결과에 따른 플래그를 포함:
N (Negative)
: 연산 결과가 음수Z (Zero)
: 연산 결과가 0C (Carry)
: 캐리 발생 여부V (Overflow)
: 오버플로우 발생 여부Q (Saturation)
: 포화 연산 발생 여부조건 분기(BEQ, BNE 등)에 직접적인 영향을 준다.
EPSR은 소프트웨어에서 직접 읽을 수 없음, 디버거를 통해 확인 가능하다.
V-flag
: 부호 있는 정수 연산에서 범위 초과 시 1C-flag
: 부호 없는 정수 연산에서 캐리 발생 시 1Q-flag
: 포화 연산 발생 시 1 (예: QADD)유닉스의
PID 0
과 같은 개념으로 볼 수 있습니다.
main()
+ 인터럽트 구조만 사용할 때비트 | 이름 | 기능 |
---|---|---|
Bit 2 | FPCA | FPU 컨텍스트 활성화 여부 |
Bit 1 | SPSEL | 스택 선택 (0: MSP, 1: PSP) |
Bit 0 | NPRIV | Thread mode 권한 (0: Privileged, 1: Unprivileged) |
Name | Type | Privilege | Reset Value | Description |
---|---|---|---|---|
R0-R12 | Read-Write | Either | Unknown | General-purpose registers |
MSP | Read-Write | Privileged | See desc. | Main Stack Pointer |
PSP | Read-Write | Either | Unknown | Process Stack Pointer |
LR | Read-Write | Either | 0xFFFFFFFF | Link Register |
PC | Read-Write | Either | See desc. | Program Counter |
PSR | Read-Write | Privileged | 0x01000000 | Program Status Register (xPSR alias) |
APSR | Read-Write | Either | 0x00000000 | Application PSR |
IPSR | Read-Only | Privileged | 0x00000000 | Interrupt PSR |
EPSR | Read-Only | Privileged | 0x01000000 | Execution PSR |
PRIMASK | Read-Write | Privileged | 0x00000000 | Priority Mask Register |
FAULTMASK | Read-Write | Privileged | 0x00000000 | Fault Mask Register |
BASEPRI | Read-Write | Privileged | 0x00000000 | Base Priority Mask Register |
CONTROL | Read-Write | Privileged | 0x00000000 | Control Register |
ARM Cortex-M의 xPSR, 특수 레지스터, MSP/PSP 구조를 명확히 이해하면,
에 강력한 기반을 갖출 수 있습니다.
깊이 있는 이해는 단순한 지식 습득이 아니라, 문제를 해결하고 설계할 수 있는 역량으로 이어진다.