8. Interrupt Mechanism
8์ฅ Interrupt Mechanism ๊ฐ์
Interrupt๋ ํ๋ก์ธ์์ ์ ์ ์คํ ํ๋ฆ์ ์ค๋จ์ํค๊ณ ํน์ handler routine์ ์คํํ ๋ค ๋ณต๊ทํ๋ ๋ฉ์ปค๋์ฆ. ์ฃผ๋ณ ์ฅ์น, ํ์ด๋จธ, fault ๋ฑ ๋น๋๊ธฐ ์ด๋ฒคํธ์ ์ฆ๊ฐ ๋ฐ์ํ๊ธฐ ์ํด ํ์์ ์ด๋ค.
Interrupt vs Exception
- Interrupt: ๋น๋๊ธฐ (์ธ๋ถ ์ด๋ฒคํธ, ์ฃผ๋ณ ์ฅ์น์์ ๋ฐ์)
- Exception: ๋๊ธฐ (๋ช ๋ น์ด ์คํ ์ค ๋ฐ์ โ SVC, fault)
- ARM์์๋ ๋ ๋ค Exception์ผ๋ก ํต์ผ ์ฒ๋ฆฌ
NVIC (Nested Vectored Interrupt Controller)
Cortex-M์ ํต์ฌ: NVIC์ด interrupt ์ฒ๋ฆฌ.
์ฃผ์ ๊ธฐ๋ฅ
- Vectored interrupts: ๊ฐ IRQ๋ง๋ค ์ ์ฉ vector (์๋ ๋ถ๊ธฐ)
- Nested interrupts: ๋์ ์ฐ์ ์์ IRQ๊ฐ ๋ฎ์ ๊ฒ์ ์ ์ (preemption)
- Priority levels: ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค์ ๊ฐ๋ฅ (M0: 4 levels, M3: 8~256)
- Dynamic priority: runtime์ ๋ณ๊ฒฝ ๊ฐ๋ฅ
- Masking: PRIMASK, FAULTMASK, BASEPRI
Vector Table
๋ฉ๋ชจ๋ฆฌ 0x00000000์ ์์น. ๊ฐ exception์ handler address ์ ์ฅ:
| Offset | Vector | Exception |
|---|---|---|
| 0x00 | Initial SP | โ |
| 0x04 | Reset | Reset |
| 0x08 | NMI | Non-maskable |
| 0x0C | HardFault | Fault escalation |
| ... | ... | ... |
| 0x2C | SVCall | SVC instruction |
| 0x38 | PendSV | Pended Service |
| 0x3C | SysTick | System timer |
| 0x40 ~ | IRQ0 ~ IRQn | External IRQs |
Reset ์ Initial SP ๊ฐ์ด R13์ ๋ก๋๋๊ณ , Reset vector๋ก PC๊ฐ ์ ํ.

Interrupt ์ฒ๋ฆฌ ์์
- External event (์: UART RX) โ Peripheral์ด IRQ signal assert
- NVIC์ด IRQ๋ฅผ ๊ฐ์ง, priority ํ์ธ
- ํ์ฌ ์คํ ์ฝ๋๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ผ๋ฉด preempt
- Stacking: xPSR, PC, LR, R12, R3, R2, R1, R0์ stack์ push (8๊ฐ word)
- Vector fetch: Vector table์์ handler address ์ฝ์
- Handler ์คํ (Handler mode, privileged)
- Exit:
BX LR๋๋POP {..., PC}โ EXC_RETURN ๊ฐ ๋ก๋ - Unstacking: Stack frame์์ ์๋ ๋ณต์, ์๋ ์ฝ๋๋ก ๋ณต๊ท
Exception Priority
- ๊ณ ์ ์ฐ์ ์์: Reset (-3) > NMI (-2) > HardFault (-1)
- ๊ตฌ์ฑ ๊ฐ๋ฅ: ๋๋จธ์ง ๋ชจ๋ exception
- ๋ฎ์ ์ซ์ = ๋์ ์ฐ์ ์์
Cortex-M0์ priority field๋ 2-bit โ 4 level. Cortex-M3๋ 3~8 bit.
Preemption & Nested
Main โ IRQ_A handler ์คํ
โ ๋ ๋์ ์ฐ์ ์์ IRQ_B ๋ฐ์
โ IRQ_A ์ค๋จ (preempted), ์ stack frame push
โ IRQ_B handler ์คํ
โ IRQ_B ์๋ฃ โ IRQ_A๋ก ๋ณต๊ท
โ IRQ_A ์๋ฃ โ Main์ผ๋ก ๋ณต๊ท
Stack์ frame์ด ์์ด๋ฏ๋ก stack ๊น์ด ์ถฉ๋ถํ ํ๋ณด ํ์.
Tail-Chaining
Cortex-M์ ์ต์ ํ: ์ฐ์๋ IRQ ์ฒ๋ฆฌ ์ unstack + restack ์๋ต:
Main โ IRQ_A โ (๋๋์๋ง์ IRQ_B pending)
โ Stack pop ์๋ตํ๊ณ ๋ฐ๋ก IRQ_B handler ํธ์ถ
โ IRQ_B ๋๋๋ฉด ํ ๋ฒ๋ง unstack โ Main ๋ณต๊ท
โ Latency ๊ฐ์, ์ ๋ ฅ ์ ์ฝ.
Late Arrival
IRQ_A ์ฒ๋ฆฌ ์ค stacking ๋์ค์ ๋ ๋์ IRQ_B ๋ฐ์ โ stacking ์๋ฃ๋์๋ง์ IRQ_B๋ก ๋ถ๊ธฐ (IRQ_A๋ pending).
Interrupt Masking
PRIMASK
- bit 0: 1์ด๋ฉด configurable exception ๋ชจ๋ mask (NMI, HardFault ์ ์ธ)
CPSID I/CPSIE I๋ก ์ค์
FAULTMASK (Cortex-M3 ์ด์)
- 1์ด๋ฉด NMI ์ ์ธ ๋ชจ๋ mask
BASEPRI (Cortex-M3 ์ด์)
- ์ด ๊ฐ๋ณด๋ค ๋ฎ์ ์ฐ์ ์์ IRQ mask

NVIC Register
- ISER (Interrupt Set-Enable Register)
- ICER (Interrupt Clear-Enable)
- ISPR (Set Pending)
- ICPR (Clear Pending)
- IP (Interrupt Priority) โ ๊ฐ IRQ์ priority ์ค์
์: IRQ 5 ํ์ฑํ:
NVIC->ISER[0] = (1 << 5);
Exception Handler ์์ฑ
C ์ฝ๋๋ก handler ์์ฑ ๊ฐ๋ฅ. Compiler๊ฐ AAPCS (ARM calling convention) ๋ฐ๋ผ ์๋ ์ฒ๋ฆฌ:
void USART1_IRQHandler(void) {
if (USART1->SR & USART_SR_RXNE) {
uint8_t data = USART1->DR;
// ์ฒ๋ฆฌ
}
}
Vector table์ 0x4C (IRQ 3 ๊ฐ์ )์ handler address๊ฐ ๋ฑ๋ก๋์ด ์์ด์ผ ํจ. Startup ์ฝ๋(linker script)์์ ์ค์ .

์ ๋ฆฌ
| ๊ฐ๋ | ์ค๋ช |
|---|---|
| NVIC | Nested Vectored Interrupt Controller |
| Vector Table | 0x00000000๋ถํฐ ๊ฐ exception handler ์ฃผ์ |
| Priority | ๋ฎ์ ์ซ์ = ๋์ ์ฐ์ ์์ |
| Preemption | ๋์ ์ฐ์ ์์ IRQ๊ฐ ์คํ ์ค์ธ handler ์ ์ |
| Tail-chaining | ์ฐ์ IRQ ์ฒ๋ฆฌ ์ stacking ์๋ต |
| Late-arriving | Stacking ์ค ์ IRQ ๋์ฐฉ ์ ๋ถ๊ธฐ |
| Masking | PRIMASK / FAULTMASK / BASEPRI |
NVIC์ ์ค์๊ฐ ์๋ต์ฑ๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ์ ์ ์ ์ ๊ณตํด Cortex-M์ด ์ค์๊ฐ ์๋ฒ ๋๋ ์์คํ ์ ํ์ค์ด ๋๊ฒ ํ ํต์ฌ์ด๋ค.

Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.