๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ณต๋ถ€

Embedded ํŽŒ์›จ์–ด ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ, ์ธํ„ฐ๋ŸฝํŠธ(Interrupt) ๋™์ž‘ ์›๋ฆฌ

by greenbrachio 2026. 5. 15.

ํŽŒ์›จ์–ด ์—”์ง€๋‹ˆ์–ด์—๊ฒŒ ์ธํ„ฐ๋ŸฝํŠธ๋ž€?

์ž„๋ฒ ๋””๋“œ ์‹œ์Šคํ…œ์—์„œ CPU๋Š” ์ฃผ๋ณ€ ์žฅ์น˜(์„ผ์„œ, ๋ฒ„ํŠผ, ํ†ต์‹  ๋ชจ๋“ˆ ๋“ฑ)์™€ ๋Š์ž„์—†์ด ์ƒํ˜ธ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ CPU๊ฐ€ ์ฃผ๋ณ€ ์žฅ์น˜์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ณ„์† ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ์ผ์„ ํ•˜๋‹ค๊ฐ€ ์‹ ํ˜ธ๊ฐ€ ์™”์„ ๋•Œ๋งŒ ๋ฐ˜์‘ํ•  ๊ฒƒ์ธ์ง€๋Š” ์‹œ์Šคํ…œ์˜ ํšจ์œจ์„ฑ์„ ๊ฒฐ์ •์ง“๋Š” ๋งค์šฐ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ๋Š” ๋ง ๊ทธ๋Œ€๋กœ CPU์˜ ์ •์ƒ์ ์ธ ์‹คํ–‰ ํ๋ฆ„์„ '๋ฐฉํ•ด(Interrupt)'ํ•˜์—ฌ ๊ธด๊ธ‰ํ•œ ์ผ์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํŽŒ์›จ์–ด ์ฝ”๋”ฉ์˜ ์ ˆ๋ฐ˜์€ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ณธ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ธํ„ฐ๋ŸฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ๋‚ด๋ถ€ ๋™์ž‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด ์ ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ๊นŒ์ง€ ์ƒ์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. ์ธํ„ฐ๋ŸฝํŠธ(Interrupt) vs ํด๋ง(Polling)

์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ๋น„๊ตํ•ด์•ผ ํ•  ๊ฐœ๋…์ด 'ํด๋ง'์ž…๋‹ˆ๋‹ค.

1.1. ํด๋ง(Polling): ๋ฌดํ•œ ๋Œ€๊ธฐ ๋ฐฉ์‹

ํด๋ง์€ CPU๊ฐ€ ์ง์ ‘ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ์ฃผ๋ณ€ ์žฅ์น˜์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ๋น„์œ : ํƒ๋ฐฐ๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ 5๋ถ„๋งˆ๋‹ค ํ˜„๊ด€๋ฌธ์„ ์—ด์–ด ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ : ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์•˜์Œ์—๋„ CPU ์ž์›์„ ๊ณ„์† ์†Œ๋ชจํ•˜๋ฏ€๋กœ ์ „๋ ฅ ํšจ์œจ์ด ๋‚ฎ๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

1.2. ์ธํ„ฐ๋ŸฝํŠธ(Interrupt): ์ด๋ฒคํŠธ ์•Œ๋ฆผ ๋ฐฉ์‹

์ธํ„ฐ๋ŸฝํŠธ๋Š” ์ฃผ๋ณ€ ์žฅ์น˜๊ฐ€ CPU์—๊ฒŒ "๋‚˜ ๋ฐ์ดํ„ฐ ์ค€๋น„๋์–ด!"๋ผ๊ณ  ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ๋น„์œ : ํƒ๋ฐฐ ๊ธฐ์‚ฌ๋‹˜์ด ์ดˆ์ธ์ข…์„ ๋ˆ„๋ฅผ ๋•Œ๊นŒ์ง€ ๋ฐฉ์—์„œ ๊ณต๋ถ€(๋‹ค๋ฅธ ์ž‘์—…)๋ฅผ ํ•˜๋‹ค๊ฐ€, ๋ฒจ์ด ์šธ๋ฆฌ๋ฉด ๋‚˜๊ฐ€์„œ ํƒ๋ฐฐ๋ฅผ ๋ฐ›๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์žฅ์ : CPU ํšจ์œจ๊ณผ ์‘๋‹ต ์†๋„๊ฐ€ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

 

2. ์ธํ„ฐ๋ŸฝํŠธ์˜ ๋‚ด๋ถ€ ๋™์ž‘ ๊ณผ์ • (Step-by-Step)

CPU๊ฐ€ ์ธํ„ฐ๋ŸฝํŠธ ์‹ ํ˜ธ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋งค์šฐ ์ •๊ตํ•œ ๊ณผ์ •์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

Step 1. ์ธํ„ฐ๋ŸฝํŠธ ์š”์ฒญ(IRQ) ๋ฐœ์ƒ

์™ธ๋ถ€ ๋ฒ„ํŠผ ํด๋ฆญ์ด๋‚˜ ํƒ€์ด๋จธ ์™„๋ฃŒ ๋“ฑ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•˜๋“œ์›จ์–ด ๋ผ์ธ์„ ํ†ตํ•ด CPU์— ์ธํ„ฐ๋ŸฝํŠธ ์š”์ฒญ ์‹ ํ˜ธ๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

Step 2. ์ปจํ…์ŠคํŠธ ์ €์žฅ(Context Save)

CPU๋Š” ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ด๋˜ ์ž‘์—…์œผ๋กœ ๋‚˜์ค‘์— ๋‹ค์‹œ ๋Œ์•„์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ์˜ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’(PC, ์ƒํƒœ ๋ ˆ์ง€์Šคํ„ฐ ๋“ฑ)์„ ์Šคํƒ(Stack) ๋ฉ”๋ชจ๋ฆฌ์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ '์ปจํ…์ŠคํŠธ ๋ฐฑ์—…'์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Step 3. ์ธํ„ฐ๋ŸฝํŠธ ๋ฒกํ„ฐ ํ…Œ์ด๋ธ”(IVT) ์ฐธ์กฐ

CPU๋Š” ๋ฐœ์ƒํ•œ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ์–ด๋–ค ์ข…๋ฅ˜์ธ์ง€ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ๋ฏธ๋ฆฌ ์ •์˜๋œ ์ธํ„ฐ๋ŸฝํŠธ ๋ฒกํ„ฐ ํ…Œ์ด๋ธ”์„ ์ฐพ์•„๊ฐ€ ํ•ด๋‹น ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ•จ์ˆ˜์˜ ์ฃผ์†Œ(Pointer)๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

Step 4. ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด(ISR) ์‹คํ–‰

์‹ค์ œ ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•˜๋Š” ์ฝ”๋“œ์ธ ISR์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ์œผ๋‹ˆ LED๋ฅผ ์ผœ๋ผ"๋Š” ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

Step 5. ์ปจํ…์ŠคํŠธ ๋ณต์› ๋ฐ ๋ณต๊ท€(Context Restore)

ISR์ด ์ข…๋ฃŒ๋˜๋ฉด ์Šคํƒ์— ์ €์žฅํ•ด๋‘์—ˆ๋˜ ์ด์ „ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’๋“ค์„ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. CPU๋Š” ๋ฐฉํ•ด๋ฐ›๊ธฐ ์ „์˜ ์ž‘์—… ์ง€์ ์œผ๋กœ ๋Œ์•„๊ฐ€ ์•„๋ฌด ์ผ๋„ ์—†์—ˆ๋‹ค๋Š” ๋“ฏ์ด ์›๋ž˜ ์ž‘์—…์„ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค.

 

3. ์ธํ„ฐ๋ŸฝํŠธ์˜ ์ข…๋ฅ˜: ํ•˜๋“œ์›จ์–ด vs ์†Œํ”„ํŠธ์›จ์–ด

  • ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ: ์™ธ๋ถ€ ํ•€์— ์ „๊ธฐ ์‹ ํ˜ธ๊ฐ€ ๋“ค์–ด์˜ค๊ฑฐ๋‚˜(External), ํƒ€์ด๋จธ/UART ๊ฐ™์€ ๋‚ด๋ถ€ ์ฃผ๋ณ€ ์žฅ์น˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ์ž…๋‹ˆ๋‹ค.
  • ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ: ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์˜ˆ์™ธ ์ƒํ™ฉ(0์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ, ์ž˜๋ชป๋œ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ)์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ์‹œ์Šคํ…œ ์ฝœ(System Call)์„ ํ˜ธ์ถœํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ”ํžˆ ํŠธ๋žฉ(Trap) ๋˜๋Š” ์˜ˆ์™ธ(Exception)๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

 

4. ์‹ค๋ฌด ํŽŒ์›จ์–ด ๊ฐœ๋ฐœ ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  ํ•ต์‹ฌ ํฌ์ธํŠธ

ํšŒ์‚ฌ์—์„œ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋‹ค์Œ ์›์น™์„ ์ง€ํ‚ค์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4.1. ISR์€ ์ตœ๋Œ€ํ•œ ์งง๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ!

ISR์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์—๋Š” (์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ) ๋‹ค๋ฅธ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ISR ๋‚ด๋ถ€์—์„œ printf๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ๊ธด ๋ฃจํ”„๋ฅผ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์€ ๊ธˆ๋ฌผ์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ๊ธฐ๋กํ•˜๊ณ , ์‹ค์ œ ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ๋Š” ๋ฉ”์ธ ๋ฃจํ”„์—์„œ ํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4.2. ์žฌ์ง„์ž…์„ฑ(Reentrancy)๊ณผ ์›์ž์„ฑ(Atomicity)

๋ฉ”์ธ ๋ฃจํ”„์™€ ISR์ด ๊ฐ™์€ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 32๋น„ํŠธ ๋ณ€์ˆ˜๊ฐ’์„ ์ฝ๋Š” ๋„์ค‘์— ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•ด ๊ฐ’์ด ๋ณ€ํ•ด๋ฒ„๋ฆฌ๋ฉด ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ž ์‹œ ๋„๊ฑฐ๋‚˜(Critical Section) volatile ํ‚ค์›Œ๋“œ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4.3. ์ธํ„ฐ๋ŸฝํŠธ ์šฐ์„ ์ˆœ์œ„(Priority) ์„ค๊ณ„

์—ฌ๋Ÿฌ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋™์‹œ์— ํ„ฐ์งˆ ๋•Œ ๋ฌด์—‡์„ ๋จผ์ € ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธด๊ธ‰ํ•œ ์•ˆ์ „ ์žฅ์น˜ ์ธํ„ฐ๋ŸฝํŠธ๋Š” ํ†ต์‹  ์ธํ„ฐ๋ŸฝํŠธ๋ณด๋‹ค ๋†’์€ ์ˆœ์œ„๋ฅผ ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ•˜๋“œ์›จ์–ด ์ œ์–ด์˜ ์ง„์ •ํ•œ ์‹œ์ž‘

์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜๊ณ  ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด, ์—ฌ๋Ÿฌ๋ถ„์€ ๋‹จ์ˆœํ•œ ์ฝ”๋”๋ฅผ ๋„˜์–ด ์‹œ์Šคํ…œ ์ „์ฒด์˜ ํ๋ฆ„์„ ์„ค๊ณ„ํ•˜๋Š” ํŽŒ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋กœ ์„ฑ์žฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ค๋ฌด ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์‹œํŠธ์˜ 'Interrupt Controller' ์„น์…˜์„ ๊ฐ€์žฅ ๋จผ์ € ๋ถ„์„ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ธํ„ฐ๋ŸฝํŠธ์™€ ์ฐฐ๋–ก๊ถํ•ฉ์ธ 'ํ†ต์‹  ํ”„๋กœํ† ์ฝœ(UART, I2C, SPI)'์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.