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๊ฐ€ ์ ํ”„.

NVIC ๋ฐ Vector Table

Interrupt ์ฒ˜๋ฆฌ ์ˆœ์„œ

  1. External event (์˜ˆ: UART RX) โ†’ Peripheral์ด IRQ signal assert
  2. NVIC์ด IRQ๋ฅผ ๊ฐ์ง€, priority ํ™•์ธ
  3. ํ˜„์žฌ ์‹คํ–‰ ์ฝ”๋“œ๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์œผ๋ฉด preempt
  4. Stacking: xPSR, PC, LR, R12, R3, R2, R1, R0์„ stack์— push (8๊ฐœ word)
  5. Vector fetch: Vector table์—์„œ handler address ์ฝ์Œ
  6. Handler ์‹คํ–‰ (Handler mode, privileged)
  7. Exit: BX LR ๋˜๋Š” POP {..., PC} โ€” EXC_RETURN ๊ฐ’ ๋กœ๋“œ
  8. 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

Interrupt ์ฒ˜๋ฆฌ ๋ฐ Masking

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)์—์„œ ์„ค์ •.

Interrupt Handler ์˜ˆ

์ •๋ฆฌ

๊ฐœ๋… ์„ค๋ช…
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์ด ์‹ค์‹œ๊ฐ„ ์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€์ด ๋˜๊ฒŒ ํ•œ ํ•ต์‹ฌ์ด๋‹ค.

Interrupt ์ข…ํ•ฉ

๋น„์Šทํ•œ ๊ธ€ ์ถ”์ฒœ

Comments (0)

No comments yet. Be the first to comment!