개요
MCU 정확히는 STM32 모델에서 어떤식으로 인터럽트를 처리하고 우선순위를 구분하는지에 대해서 적어보려한다.
이때 RTOS가 아닌 기본적으로 Bare-metal 어플리케이션으로 사용되는 기본 루틴과 인터럽트에 대해서 알아본다.
다시 말하지만 이는 RTOS에서 인터럽트를 처리하는 방식이 아닌 Bare-metal에서 처리하는 방식을 다룬다.
RTOS는 기회가 된다면 다른 글에서 다루기로 한다.
Bare-metal의 루틴
아래 이미지는 각각 Bare-metal에서 프로세스를 처리하는 방식과 RTOS에서 처리하는 방식을 나눠서 보여준다.
Bare-metal에서는 Thread라는 개념 없이 모든 루틴이 순차적으로 동작하며 인터럽트가 발생할 경우 ‘메인 루프’에서 실행중이던 PC, 범용 레지스터 정보, xPSR 등등 현재 위치의 복원을 위한 정보를 스택에 저장하고 ISR에 따라서 인터럽트를 처리하고 이후 원래 ‘루프’로 복귀하며 동작한다. (UnStacking)
Info
ISR은 인터럽트 핸들러와 의미가 거의 동일하다. 같다고 보면 된다.
여기서 xPSR은 각각
- APSR: 조건 분기와 플래그 복원.
- EPSR: 프로세서의 실행 상태(Thumb 모드)를 복원.
- IPSR: 현재 실행 중인 인터럽트 번호를 복원.
위 와 같은 것들을 의미하며 IPSR은 인터럽트 중첩 상황에서 필요하게 된다.
NVIC

- NMI (Non-Maskable Interrupt)
- NMI는 비마스크 가능 인터럽트로, 시스템의 가장 긴급한 상황에서 처리되는 인터럽트이다. NVIC를 거쳐 코어로 전달되며, 일반 인터럽트와는 달리 우선순위가 고정되어 있고, 비활성화(masking)할 수 없다.
- Up to 32 IRQs (Interrupt Requests)
- 최대 32개의 외부 인터럽트 요청(IRQ) 신호가 NVIC로 전달된다.
- 각 IRQ는 주변 장치(UART, Timer, ADC 등)에서 발생한 이벤트에 의해 트리거된다.
- NVIC는 다음을 수행한다:
- IRQ의 우선순위를 확인.
- 우선순위가 높은 IRQ를 선별하여 코어에 전달.
- 다중 IRQ를 처리하기 위해 중첩(Nesting) 지원.
결론적으로 NVIC에서는 인터럽트를 받고 이에 대한 우선순위를 확인하고 IRQ(Interrupt Request)를 Core에 전달하고 이를 받아서 vector table을 확인하고 인터럽트를 처리하는 방식으로 동작한다.
이제 인터럽트 발생시 일어나는 흐름을 살펴보자.
Systick은 IRQs와 다른 체계로 동작하므로 일단 제외하고 설명하도록 한다. 이는 RTOS의 처리와 연관이 있다.
인터럽트 발생시 흐름
- Stacking
- Vector Fetch
- Resister Update
- ISR excute
- Unstacking