5.5.7 · D3 · Coding › Embedded Systems & Real-Time Software › Interrupts — ISR design, NVIC priority, interrupt latency
Intuition Ye page kya hai
Parent note ne tumhe models diye. Yahan hum un models ke har corner ko exercise karte hain — har priority relationship, zero-cases, limiting cases, ek real-world word problem, aur ek exam twist. Agar koi scenario Cortex-M par ho sakta hai, woh neeche appear karta hai.
Koi bhi number se pehle, aao hum har tarah ki situation list karte hain jinse ye formulas survive karni chahiye. Har row ek case class hai; neeche ke worked examples us row ke saath tagged hain jise woh hit karte hain.
#
Case class
Yeh kaunsa sawaal answer karta hai
Degenerate / edge form
A
Priority split (2 p , 2 N − p )
Kitne preempt vs sub levels hain?
p = 0 (no preemption) aur p = N (no sub-levels)
B
Preemption decision
Kya IRQ-X, running IRQ-Y ko interrupt karta hai?
Equal preempt → no preemption
C
Sub-priority tiebreak
Ek saath do pending, equal preempt — pehle kaun run karta hai?
Equal sub bhi → lower IRQ number jeets hai
D
Latency, normal
ISR ki pehli instruction tak ka time
Event fire hota hai jabki IRQs masked hain (worst case)
E
Latency, tail-chaining
Back-to-back IRQs, bacha hua cost
Limiting case: bahut saare queued IRQs
F
Deadline / real-world
Kya hum ek UART byte drop kar dete hain?
Zero slack (exactly meets)
G
Exam twist
Grouping + latency + ek trap combine karo
"higher number = more urgent" trap
Jinhe hum rely karte hain woh formulas, dobara state karte hain taaki koi symbol earn kiye bina na ho:
A1 (normal split). STM32F4 N = 4 priority bits implement karta hai. PRIGROUP p = 2 preempt bits deta hai. Kitne preempt levels aur sub levels hain?
Forecast: dono numbers calculate karne se pehle guess karo — unka product wapas 2 4 = 16 hona chahiye.
Preempt levels = 2 p = 2 2 = 4 . Ye step kyun? p bits 2 p distinct groups encode karte hain; 2 bits → patterns 00 , 01 , 10 , 11 → 4 groups.
Sub levels = 2 N − p = 2 4 − 2 = 2 2 = 4 . Kyun? bacha hua N − p = 2 bits tiebreaker field hai, 2 2 = 4 slots encode karta hai.
Sanity product: 4 × 4 = 16 = 2 4 . Kyun? split ko total levels na banani chahiye na destroy karni chahiye.
Verify: 2 2 ⋅ 2 2 = 16 = 2 4 ✔ aur dono ≥ 1 hain, isliye config legal hai.
A2 (degenerate p = 0 : NO preemption possible). Same chip N = 4 , lekin PRIGROUP aisa set kiya ki saare 4 bits sub-priority hain (p = 0 ).
Forecast: ab kitni cheezein ek running ISR ko preempt kar sakti hain?
Preempt levels = 2 0 = 1 . Kyun? zero preempt bits → ek single group; sabh isko share karte hain.
Sub levels = 2 4 − 0 = 2 4 = 16 . Kyun? saare 16 encodings tiebreakers ban jaate hain.
Consequence: kyunki sirf ek preempt group hai, koi bhi interrupt kabhi doosre ko preempt nahi kar sakta — jab ek ISR start ho jaata hai, woh completion tak run karta hai. Ordering sirf decide karta hai simultaneously pending IRQs mein se pehle kaun run kare .
Verify: 1 × 16 = 16 ✔. Edge behaviour confirmed: preempt levels = 1 ⇒ fully non-nested system.
A3 (degenerate p = N : NO sub-priority, all preemption). N = 4 , p = 4 .
Preempt levels = 2 4 = 16 , sub levels = 2 0 = 1 .
Matlab: har priority difference preemption cause karta hai; koi "runs-first-but-can't-preempt" tie mechanism nahi hai. Ties (identical priority) fixed rule par fall back karte hain: lower IRQ number wins .
Verify: 16 × 1 = 16 ✔.
Yaad rakho golden trap: lower numeric priority = more urgent . Hum har ordering test karte hain.
B1 (strict preemption). Config p = 3 , N = 4 (8 preempt groups, 2 sub). IRQ-A: preempt= 1 . IRQ-B: preempt= 2 , currently running. A fires mid-B. Kya hota hai?
Forecast: kya A wait karta hai, ya cut in karta hai?
Preempt numbers compare karo: 1 < 2 . Inhe kyun compare karte hain? preemption sirf preempt field se decide hoti hai.
Lower number = more urgent ⇒ A preempts B. B stack ho jaata hai (uska context auto-saved), A run karta hai, phir B resume karta hai.
Verify: ordering respected: A finish hone ke baad, B apne saved P C se continue karta hai — koi bhi kaam lost nahi. Correct kyunki 1 < 2 aur lower=urgent.
C1 (equal preempt, sub tiebreak — NO preemption). IRQ-C: preempt= 2 , sub= 0 . IRQ-D: preempt= 2 , sub= 1 . Dono ek hi instant par pending hain, kuch bhi run nahi ho raha abhi.
Forecast: pehle kaun run karta hai, aur kya koi doosre ko preempt karta hai?
Preempt fields equal hain (2 = 2 ) ⇒ na to dono ek doosre ko preempt karte hain . Kyun? preemption ke liye strictly lower preempt number chahiye.
Tie broken by sub-priority: 0 < 1 ⇒ C pehle , phir D. Kyun? sub-priority sirf simultaneously pending IRQs ko order karta hai.
Agar C already running hota aur D pending ho jaata, D wait karta C ke finish hone tak (no preemption).
Verify: run order C→D; aur crucially D kabhi C ko interrupt nahi karta. "Sub-priority kabhi preemption cause nahi karta" ke saath consistent.
C2 (full tie — the very last fallback). IRQ-E aur IRQ-F: identical preempt= 2 , identical sub= 1 , dono pending. E exception/IRQ number 30 hai, F number 12 hai.
Preempt equal, sub equal ⇒ hardware fixed tiebreak use karta hai: lower IRQ number wins .
12 < 30 ⇒ F pehle run karta hai .
Verify: deterministic — NVIC hamesha full tie ko IRQ number se resolve karta hai, isliye behaviour reproducible hai.
D1 (worst-case latency with a critical section). f clk = 100 MHz . Fixed hardware part = 12 cycles. Tumhara longest __disable_irq() critical section 50 cycles tak chalta hai. Event mask hone ke just baad fire hota hai. Worst-case latency ns mein find karo.
Forecast: ye sirf 12 cycles nahi hai — ns figure guess karo.
Ek cycle = 1/ ( 100 × 1 0 6 ) = 10 ns . Kyun? humne ns mein numeric answer assert kiya, isliye cycles→time convert karo.
t blocked = 50 cycles: event ko stacking start hone se pehle poora masked window wait karna hoga. Ise kyun add karte hain? masked hone par, NVIC request ko pending hold karta hai — koi stacking nahi.
Total cycles = t blocked + hardware = 50 + 12 = 62 .
t lat,worst = 62 × 10 ns = 620 ns .
Verify: units: cycles × (ns/cycle) = ns ✔. Numeric: 620 ns = 0.62 μ s , 100 MHz MCU ke liye plausible.
D2 (best-case, nothing masked). Same chip, koi active critical section nahi, event ek 1-cycle instruction execute karte waqt fire hota hai. t blocked = 0 , t finish-instr ≈ 1 cycle.
Total = 12 + 1 = 13 cycles (12 already detect/stack/vector fold kar chuka hai; hum finish-instruction slack add karte hain).
= 13 × 10 = 130 ns .
Verify: best-case < worst-case: 130 < 620 ✔.
E1 (do back-to-back IRQs). IRQ-B phir IRQ-C dono pending hain, B finish ho raha hai. Naive cost: unstack B (≈ 12 ) + stack C (≈ 12 ). Tail-chaining ise ≈ 6 cycles se replace karta hai. Kitne cycles save hue, aur kya fraction?
Forecast: calculate karne se pehle saving guess karo.
Naive transition cost = 12 + 12 = 24 cycles. Kyun? 8 words pop karna phir 8 words push karna.
Tail-chained cost = 6 cycles. Ye kyun kaam karta hai: stacked context abhi bhi valid hai, isliye hardware pop-then-push skip karta hai aur directly B→C jump karta hai.
Saved = 24 − 6 = 18 cycles = 18 × 10 = 180 ns .
Fraction saved = 18/24 = 0.75 = 75% .
Verify: 6 + 18 = 24 ✔; 0.75 0 aur 1 ke beech hai ✔.
E2 (limiting case — k IRQs ka ek burst). k = 5 IRQs back-to-back queued hain. Total transition overhead naive vs tail-chained compare karo (sirf entry costs).
Naive: pehla entry 12 , phir har pair ke beech unstack+stack = 24 . 5 IRQs ke liye 4 gaps hain: 12 + 4 × 24 = 12 + 96 = 108 cycles.
Tail-chained: pehla entry 12 , phir 4 chains mein se har ek ka cost 6 : 12 + 4 × 6 = 12 + 24 = 36 cycles.
Saving = 108 − 36 = 72 cycles = 720 ns .
Verify: zyada queued IRQs ke saath saving linearly grow karta hai (18 cycles per gap) — load ke neeche tail-chaining ka poora point. 72 = 4 × 18 ✔.
F1 (UART at risk). Ek UART bytes 115200 baud par receive karta hai, 8N1 framing (10 bits per byte). Uska RX interrupt service hona chahiye agli byte register overwrite karne se pehle. Tumhara worst-case latency (D1 se) 620 ns hai, aur ISR khud 200 ns leta hai. Kya tum bytes drop karte ho?
Forecast: byte period compute karne se pehle YES ya NO guess karo.
Time per byte = 115200 bits/s 10 bits = 8.68 × 1 0 − 5 s = 86.8 μ s . 10 bits kyun? 8N1 = 1 start + 8 data + 1 stop bit.
Ek byte service karne ka time budget = ek byte period = 86.8 μ s .
Worst service time = t lat,worst + t ISR = 620 + 200 = 820 ns = 0.82 μ s .
Slack = 86.8 − 0.82 = 85.98 μ s > 0 ⇒ koi dropped bytes nahi , bahut bade margin ke saath.
Verify: 0.82 ≪ 86.8 ✔; ratio 0.82/86.8 ≈ 0.94% CPU used per byte — deadline comfortably meet karta hai. Yahi reason hai ki ek short ISR + ring buffer (dekho Ring Buffers / FIFO Queues ) deadlines safe rakhta hai.
F2 (zero-slack / tightened case). Same UART lekin baud 1 Mbaud tak raise kiya aur worst latency ek careless long critical section ki wajah se 80 μ s tak badh gayi. Ab?
Byte period = 10/1 000 000 = 10 μ s .
Service time = 80 + ? — ISR run hone se pehle hi 80 μ s > 10 μ s .
Slack = 10 − 80 = − 70 μ s < 0 ⇒ bytes dropped . Yahi woh race hai jo ek fat critical section create karta hai.
Verify: negative slack ⇒ deadline miss. Fix: critical section ko chhota karo (lower t blocked ) — single most effective latency lever.
G1 (combined trap question). "IRQ-P ka priority number 0 hai, IRQ-Q ka priority number 5 hai. Ek student kehta hai 'Q zyada important hai kyunki 5 > 0.' Config N = 4 , p = 4 (all preempt). Q run ho raha hai; P pending ho jaata hai. (a) Actually zyada urgent kaun hai? (b) Kya P, Q ko preempt karta hai? (c) Agar f clk = 100 MHz aur P ka stacking 12-cycle hardware part hai bina masking ke, P ki pehli instruction kab run karta hai?"
Forecast: step 1 se pehle student ke claim mein trap spot karo.
(a) Cortex-M par, lower number = higher urgency , isliye P (0), Q (5) se zyada urgent hai. Student ki "5>0" reasoning classic inverted-scale mistake hai.
(b) p = 4 ⇒ saare bits preempt hain, sub levels = 2 0 = 1 . Preempt numbers 0 < 5 ⇒ P, Q ko preempt karta hai . Q stack ho jaata hai, P ke baad resume hota hai.
(c) Koi masking nahi, hardware part = 12 cycles, = 12 × 10 = 120 ns P ki pehli instruction tak (Q ki current instruction already ek interruptible point par assumed).
Verify: P pehli instr 120 ns par; 0 < 5 confirm karta hai P urgent hai aur preempt kar raha hai. Trap correctly reject kiya gaya.
Recall Self-test — answer karne ke baad reveal karo
N = 4 , p = 0 ke saath, kitni cheezein running ISR ko preempt kar sakti hain? ::: Preempt levels = 2 0 = 1 , isliye koi nahi — fully non-nested.
Do IRQs equal preempt, equal sub, numbers 12 aur 30 — pehle kaun run karta hai? ::: IRQ 12 (lower IRQ number final tiebreak hai).
100 MHz par worst-case latency 12 fixed + 50 masked cycles ke saath? ::: 62 × 10 ns = 620 ns .
Ek B→C transition ke liye tail-chaining saving (24 naive vs 6)? ::: 18 cycles = 180 ns (75% ).
115200 baud, 8N1 par ek byte ka time? ::: 10/115200 ≈ 86.8 μ s .
Mnemonic Do cheezein jo kabhi invert nahi karni
"Low number, high stakes; equal preempt, no cut-in." Lower priority number = more urgent, aur equal-preempt IRQs order karte hain lekin kabhi preempt nahi karte.