Interrupt controller collects interrupt events, prioritizes them and routes them to eligible processor cores or execution contexts. It lets CPUs respond efficiently to timers, storage, networks, GPUs and peripherals without continuously polling every device. Legacy PICs provide limited lines; x86 APIC families support local and I/O routing; ARM GIC distributes shared/private interrupts with priority and security; MSI/MSI-X encodes interrupts as memory writes. A production specification names the hardware and software boundary, clock and reset domains, address map, data widths, endianness, ordering and coherency, interrupt and error behavior, power states, security domains, performance targets, configuration discovery, lifecycle owner, and verification evidence. Marketing names and nominal link rates are insufficient without exact revision, mode, topology, payload, and environmental conditions. Specify source type, trigger/polarity, ID/vector, priority, target affinity, masking, preemption, security/virtualization, acknowledgment/end-of-interrupt, wake and latency.
Architecture, protocol behavior, and system integration. Peripheral line or MSI reaches distributor/remapper, pending/active state and priority are tracked, a target CPU interface signals the core, software saves context and runs ISR, clears device cause and signals completion. Controller arbitrates eligible pending events, respects masks and priority, routes by affinity, supports nesting/preemption, and may virtualize interrupts for guests. Drivers must clear source and observe ordering before EOI. PIC, APIC/IOAPIC, GIC, platform interrupt controller, MSI/MSI-X and interrupt remapping differ in scale and platform. A modern embedded system spans processor and accelerator IP, memory hierarchy, on-chip interconnect, peripheral controllers, analog and RF interfaces, clock/reset/power management, boot and firmware, board devices, operating-system discovery and drivers, diagnostics, update infrastructure, and application policy. Data, control, timing, trust, and power paths cross several abstraction levels. Evaluation combines functional correctness with bandwidth and payload efficiency, p50 and tail latency, jitter, outstanding depth, utilization, arbitration fairness, interrupt rate, CPU overhead, memory traffic, error and retry rate, power, thermal behavior, area, firmware footprint, startup time, recovery, interoperability, reliability, security, and total cost. Measurements state workload, clocks, voltages, formats, traffic mix, software, and instrumentation.
Implementation, physical design, and failure modes. Define clean synchronization, avoid lost edge events, implement priority/affinity, rate moderation, secure groups, virtualization and diagnostics; drivers use short top halves and deferred work. Wire delay, synchronization, distributor fan-in, core count, clock/power domains and message fabric set latency and scalability. Interrupt storm, lost edge, level never cleared, wrong polarity/vector, affinity imbalance, priority inversion, EOI ordering, shared-line ambiguity and wake races cause hangs or CPU saturation. Implementation uses versioned interface specifications, register descriptions, generated headers where appropriate, typed driver APIs, clear ownership, bounded waits, idempotent initialization, capability discovery, defensive parsing, timeouts, error injection, telemetry, and safe fallback. Hardware and firmware agree on reset values, write side effects, ordering, cache maintenance, DMA ownership, interrupt acknowledgment, and power transitions. Physical results depend on standard-cell and memory libraries, analog/RF macros, PHYs, clock trees, voltage islands, level shifters, package pins, signal and power integrity, board routing, external components, thermal limits, process variation and test coverage. A protocol block that passes RTL simulation can still fail timing, CDC, analog compliance, EMI, or system integration. Common failures include reset races, clock-domain crossings, metastability, stale descriptors, dropped interrupts, cache incoherence, address aliasing, ordering violations, bus deadlock, DMA use-after-free, malformed firmware data, incompatible revisions, power-state loss, timeout storms, partial updates, security rollback and observability gaps. A working nominal demo does not establish corner correctness.
Verification, security, and lifecycle controls. Inject lines/messages, simultaneous priorities, mask/unmask, affinity changes, nested events, power states, virtualization, storms, malformed MSI and latency under load. Event-to-ISR latency/jitter, service rate, CPU overhead, lost/spurious count, priority fairness, wake latency and storm recovery matter. Interrupt remapping limits malicious DMA devices; secure interrupts, hypervisor ownership and debug controls protect privilege boundaries. Verification combines lint, CDC/RDC, assertions, formal properties, protocol VIP, constrained-random simulation, emulation or FPGA prototypes, firmware unit and integration tests, compliance suites, interoperability matrices, performance and power measurement, fault injection, security review, silicon bring-up, characterization, production test, update/rollback drills, and long-duration stress. Requirements, IP and license versions, RTL, register maps, firmware, boot artifacts, device descriptions, drivers, compiler and OS, validation vectors, timing and power signoff, package/board revisions, fuse policy, manufacturing test, errata, field telemetry, update keys, approvals, incidents and deprecation remain linked. Compatibility rules span hardware generations that cannot be patched physically. Owners define root of trust, secure and measured boot, debug authorization, key and fuse handling, signed updates, anti-rollback, least privilege, DMA isolation, memory protection, data classification, radio and safety compliance, vulnerability response, support lifetime, supplier provenance, export/regional obligations, and auditable release authority.
| Type | Signal model | Scalability | Key feature | Typical use |
|---|---|---|---|---|
| PIC | Physical lines | Low | Simple priority/mask | Legacy/small systems |
| APIC/IOAPIC | Local plus routed vectors | Multicore x86 | Core-local and I/O routing | PC/server |
| ARM GIC | Distributed/private/shared IDs | Many-core ARM | Priority/security/virtualization | Mobile/server/embedded |
| MSI | Memory-write message | Moderate | No shared physical line | PCIe devices |
| MSI-X | Many independent messages | High | Per-queue vectors/affinity | NVMe/NIC/GPU |
<svg viewBox="0 0 760 470" xmlns="http://www.w3.org/2000/svg" font-family="Segoe UI,Arial,sans-serif"><rect width="760" height="470" fill="#0d1117"/><defs><marker id="ab" markerWidth="8" markerHeight="8" refX="6.5" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#60a5fa"/></marker><marker id="ag" markerWidth="8" markerHeight="8" refX="6.5" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#34d399"/></marker><marker id="am" markerWidth="8" markerHeight="8" refX="6.5" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#c4b5fd"/></marker><marker id="ah" markerWidth="8" markerHeight="8" refX="6.5" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#8b949e"/></marker><marker id="ar" markerWidth="8" markerHeight="8" refX="6.5" refY="3" orient="auto"><path d="M0,0 L7,3 L0,6 Z" fill="#f87171"/></marker></defs><text x="20" y="30" fill="#e6edf3" font-size="19" font-weight="700">Interrupt controller: collect, prioritize and deliver to a core</text><text x="20" y="50" fill="#8b949e" font-size="12.5">Devices raise IRQs as wired lines or MSI writes; the controller masks, ranks by priority and affinity, then delivers.</text><rect x="20" y="66" width="226" height="298" rx="7" fill="#0c141d" stroke="#30363d"/><text x="32" y="87" fill="#e6edf3" font-size="13.5" font-weight="600">Sources & routing</text><rect x="267" y="66" width="226" height="298" rx="7" fill="#0c141d" stroke="#30363d"/><text x="279" y="87" fill="#e6edf3" font-size="13.5" font-weight="600">Prioritize & mask</text><rect x="514" y="66" width="226" height="298" rx="7" fill="#0c141d" stroke="#30363d"/><text x="526" y="87" fill="#e6edf3" font-size="13.5" font-weight="600">Deliver & nest</text><rect x="34" y="106" width="58" height="22" rx="3" fill="#12233a" stroke="#60a5fa" stroke-width="1"/><text x="63" y="116" fill="#60a5fa" font-size="8.4" text-anchor="middle" font-weight="600">Timer</text><text x="63" y="125" fill="#8b949e" font-size="6.6" text-anchor="middle">IRQ 30</text><path d="M92,117 L128,117 L138,184" fill="none" stroke="#60a5fa" stroke-width="1.1" opacity="0.75"/><rect x="34" y="136" width="58" height="22" rx="3" fill="#1b1030" stroke="#c4b5fd" stroke-width="1"/><text x="63" y="146" fill="#c4b5fd" font-size="8.4" text-anchor="middle" font-weight="600">NIC</text><text x="63" y="155" fill="#8b949e" font-size="6.6" text-anchor="middle">MSI 0x21</text><path d="M92,147 L128,147 L138,184" fill="none" stroke="#c4b5fd" stroke-width="1.1" opacity="0.75"/><rect x="34" y="166" width="58" height="22" rx="3" fill="#1b1030" stroke="#c4b5fd" stroke-width="1"/><text x="63" y="176" fill="#c4b5fd" font-size="8.4" text-anchor="middle" font-weight="600">NVMe</text><text x="63" y="185" fill="#8b949e" font-size="6.6" text-anchor="middle">MSI-X</text><path d="M92,177 L128,177 L138,184" fill="none" stroke="#c4b5fd" stroke-width="1.1" opacity="0.75"/><rect x="34" y="196" width="58" height="22" rx="3" fill="#12233a" stroke="#60a5fa" stroke-width="1"/><text x="63" y="206" fill="#60a5fa" font-size="8.4" text-anchor="middle" font-weight="600">GPIO</text><text x="63" y="215" fill="#8b949e" font-size="6.6" text-anchor="middle">IRQ 8</text><path d="M92,207 L128,207 L138,184" fill="none" stroke="#60a5fa" stroke-width="1.1" opacity="0.75"/><text x="34" y="234" fill="#8b949e" font-size="7">solid = wired line</text><text x="34" y="244" fill="#c4b5fd" font-size="7">purple = MSI memory write</text><rect x="138" y="162" width="90" height="46" rx="5" fill="#241d33" stroke="#c4b5fd" stroke-width="1.3"/><text x="183" y="177" fill="#d6c7f5" font-size="9" text-anchor="middle" font-weight="700">Distributor</text><text x="183" y="189" fill="#8b949e" font-size="6.8" text-anchor="middle">GIC / APIC</text><text x="183" y="200" fill="#8b949e" font-size="6.8" text-anchor="middle">pending · enable · prio</text><rect x="168" y="254" width="60" height="22" rx="3" fill="#111a24" stroke="#30363d" stroke-width="1"/><text x="198" y="268" fill="#8b949e" font-size="8.4" text-anchor="middle">CPU 0</text><path d="M183,208 L183,265 L168,265" fill="none" stroke="#30475f" stroke-width="0.9"/><rect x="168" y="284" width="60" height="22" rx="3" fill="#153524" stroke="#34d399" stroke-width="1"/><text x="198" y="298" fill="#6ee7b7" font-size="8.4" text-anchor="middle">CPU 1</text><path d="M183,208 L183,295 L168,295" fill="none" stroke="#34d399" stroke-width="1.5" marker-end="url(#ag)"/><rect x="168" y="314" width="60" height="22" rx="3" fill="#111a24" stroke="#30363d" stroke-width="1"/><text x="198" y="328" fill="#8b949e" font-size="8.4" text-anchor="middle">CPU 2</text><path d="M183,208 L183,325 L168,325" fill="none" stroke="#30475f" stroke-width="0.9"/><text x="198" y="350" fill="#34d399" font-size="7" text-anchor="middle">affinity → CPU 1</text><text x="279" y="106" fill="#8b949e" font-size="8.2">pending AND enable, then rank</text><text x="283" y="124" fill="#93c5fd" font-size="7.6">pending</text><rect x="325" y="116" width="15" height="15" rx="2" fill="#12233a" stroke="#60a5fa" stroke-width="0.9"/><text x="332.5" y="127" fill="#60a5fa" font-size="8" text-anchor="middle">1</text><rect x="343" y="116" width="15" height="15" rx="2" fill="#0c141d" stroke="#60a5fa" stroke-width="0.9"/><text x="350.5" y="127" fill="#3a4a5a" font-size="8" text-anchor="middle">0</text><rect x="361" y="116" width="15" height="15" rx="2" fill="#12233a" stroke="#60a5fa" stroke-width="0.9"/><text x="368.5" y="127" fill="#60a5fa" font-size="8" text-anchor="middle">1</text><rect x="379" y="116" width="15" height="15" rx="2" fill="#12233a" stroke="#60a5fa" stroke-width="0.9"/><text x="386.5" y="127" fill="#60a5fa" font-size="8" text-anchor="middle">1</text><rect x="397" y="116" width="15" height="15" rx="2" fill="#0c141d" stroke="#60a5fa" stroke-width="0.9"/><text x="404.5" y="127" fill="#3a4a5a" font-size="8" text-anchor="middle">0</text><rect x="415" y="116" width="15" height="15" rx="2" fill="#12233a" stroke="#60a5fa" stroke-width="0.9"/><text x="422.5" y="127" fill="#60a5fa" font-size="8" text-anchor="middle">1</text><text x="283" y="146" fill="#8b949e" font-size="7.6">enable</text><rect x="325" y="138" width="15" height="15" rx="2" fill="#3a2a17" stroke="#fbbf24" stroke-width="0.9"/><text x="332.5" y="149" fill="#fbbf24" font-size="8" text-anchor="middle">1</text><rect x="343" y="138" width="15" height="15" rx="2" fill="#0c141d" stroke="#fbbf24" stroke-width="0.9"/><text x="350.5" y="149" fill="#3a4a5a" font-size="8" text-anchor="middle">0</text><rect x="361" y="138" width="15" height="15" rx="2" fill="#3a2a17" stroke="#fbbf24" stroke-width="0.9"/><text x="368.5" y="149" fill="#fbbf24" font-size="8" text-anchor="middle">1</text><rect x="379" y="138" width="15" height="15" rx="2" fill="#0c141d" stroke="#fbbf24" stroke-width="0.9"/><text x="386.5" y="149" fill="#3a4a5a" font-size="8" text-anchor="middle">0</text><rect x="397" y="138" width="15" height="15" rx="2" fill="#3a2a17" stroke="#fbbf24" stroke-width="0.9"/><text x="404.5" y="149" fill="#fbbf24" font-size="8" text-anchor="middle">1</text><rect x="415" y="138" width="15" height="15" rx="2" fill="#3a2a17" stroke="#fbbf24" stroke-width="0.9"/><text x="422.5" y="149" fill="#fbbf24" font-size="8" text-anchor="middle">1</text><text x="283" y="168" fill="#6ee7b7" font-size="7.6">active</text><rect x="325" y="160" width="15" height="15" rx="2" fill="#153524" stroke="#34d399" stroke-width="0.9"/><text x="332.5" y="171" fill="#34d399" font-size="8" text-anchor="middle">1</text><rect x="343" y="160" width="15" height="15" rx="2" fill="#0c141d" stroke="#30363d" stroke-width="0.9"/><rect x="361" y="160" width="15" height="15" rx="2" fill="#153524" stroke="#34d399" stroke-width="0.9"/><text x="368.5" y="171" fill="#34d399" font-size="8" text-anchor="middle">1</text><rect x="379" y="160" width="15" height="15" rx="2" fill="#0c141d" stroke="#30363d" stroke-width="0.9"/><rect x="397" y="160" width="15" height="15" rx="2" fill="#0c141d" stroke="#30363d" stroke-width="0.9"/><rect x="415" y="160" width="15" height="15" rx="2" fill="#153524" stroke="#34d399" stroke-width="0.9"/><text x="422.5" y="171" fill="#34d399" font-size="8" text-anchor="middle">1</text><text x="477" y="149" fill="#8b949e" font-size="7" text-anchor="end">AND</text><text x="279" y="196" fill="#e6edf3" font-size="9.2" font-weight="600">Priority arbiter (lower = higher)</text><text x="281" y="220" fill="#cdd9e5" font-size="8">IRQ2</text><rect x="317" y="210" width="98" height="12" rx="2" fill="#f87171" opacity="0.9"/><text x="419" y="220" fill="#f87171" font-size="7.4">p1</text><text x="467" y="220" fill="#f87171" font-size="7.4" text-anchor="end" font-weight="700">winner →</text><text x="281" y="244" fill="#cdd9e5" font-size="8">IRQ0</text><rect x="317" y="234" width="74" height="12" rx="2" fill="#fbbf24" opacity="0.45"/><text x="395" y="244" fill="#fbbf24" font-size="7.4">p3</text><text x="281" y="268" fill="#cdd9e5" font-size="8">IRQ5</text><rect x="317" y="258" width="38" height="12" rx="2" fill="#60a5fa" opacity="0.45"/><text x="359" y="268" fill="#60a5fa" font-size="7.4">p6</text><rect x="317" y="286" width="150" height="26" rx="4" fill="#3a1717" stroke="#f87171" stroke-width="1.2"/><text x="392" y="297" fill="#fca5a5" font-size="8.6" text-anchor="middle" font-weight="700">IRQ2 → running priority</text><text x="392" y="307" fill="#8b949e" font-size="7" text-anchor="middle">only if above the core’s current level</text><text x="526" y="106" fill="#8b949e" font-size="8.2">CPU priority level over time (lower band = higher prio)</text><line x1="534" y1="122" x2="534" y2="216" stroke="#30363d" stroke-width="1"/><line x1="534" y1="216" x2="724" y2="216" stroke="#8b949e" stroke-width="1" marker-end="url(#ah)"/><text x="724" y="228" fill="#8b949e" font-size="7" text-anchor="end">time →</text><text x="526" y="167" fill="#f87171" font-size="6.6">high</text><text x="526" y="193" fill="#fbbf24" font-size="6.6">low</text><text x="526" y="214" fill="#8b949e" font-size="6.6">idle</text><path d="M534,216 L568,216 L568,190 L614,190 L614,164 L654,164 L654,190 L692,190 L692,216 L724,216" fill="none" stroke="#67e8f9" stroke-width="2"/><line x1="568" y1="176" x2="568" y2="190" stroke="#fbbf24" stroke-width="1" marker-end="url(#ah)"/><text x="568" y="174" fill="#fbbf24" font-size="6.6" text-anchor="middle">IRQ low</text><line x1="614" y1="150" x2="614" y2="164" stroke="#f87171" stroke-width="1" marker-end="url(#ar)"/><text x="614" y="148" fill="#f87171" font-size="6.6" text-anchor="middle">IRQ high</text><text x="656" y="182" fill="#8b949e" font-size="6.2">EOI hi</text><text x="694" y="206" fill="#8b949e" font-size="6.2">EOI lo</text><text x="634" y="162" fill="#fca5a5" font-size="6.6" text-anchor="middle">nested</text><text x="526" y="252" fill="#e6edf3" font-size="9" font-weight="600">Handshake per IRQ</text><circle cx="534" cy="263" r="2" fill="#67e8f9"/><text x="542" y="266" fill="#cdd9e5" font-size="8">assert → CPU acknowledges (IACK)</text><circle cx="534" cy="277" r="2" fill="#67e8f9"/><text x="542" y="280" fill="#cdd9e5" font-size="8">read vector → jump to ISR</text><circle cx="534" cy="291" r="2" fill="#67e8f9"/><text x="542" y="294" fill="#cdd9e5" font-size="8">write EOI → line deasserts, level drops</text><rect x="20" y="384" width="226" height="70" rx="7" fill="#111a24" stroke="#30363d"/><text x="32" y="403" fill="#e6edf3" font-size="12.5" font-weight="700">Wired lines vs MSI</text><text x="32" y="420" fill="#cdd9e5" font-size="10">Old designs pull a dedicated wire per device;</text><text x="32" y="433" fill="#cdd9e5" font-size="10">MSI/MSI-X instead posts a memory write,</text><text x="32" y="446" fill="#cdd9e5" font-size="10">freeing pins and letting one device raise many</text><text x="32" y="459" fill="#cdd9e5" font-size="10">distinct vectors.</text><rect x="267" y="384" width="226" height="70" rx="7" fill="#111a24" stroke="#30363d"/><text x="279" y="403" fill="#e6edf3" font-size="12.5" font-weight="700">Priority and affinity</text><text x="279" y="420" fill="#cdd9e5" font-size="10">Only pending interrupts that are enabled</text><text x="279" y="433" fill="#cdd9e5" font-size="10">compete. The controller picks the highest</text><text x="279" y="446" fill="#cdd9e5" font-size="10">priority and, via affinity, steers it to a</text><text x="279" y="459" fill="#cdd9e5" font-size="10">chosen core.</text><rect x="514" y="384" width="226" height="70" rx="7" fill="#111a24" stroke="#30363d"/><text x="526" y="403" fill="#e6edf3" font-size="12.5" font-weight="700">Nesting and EOI</text><text x="526" y="420" fill="#cdd9e5" font-size="10">A higher-priority IRQ can preempt a running</text><text x="526" y="433" fill="#cdd9e5" font-size="10">ISR. Each handler writes End-Of-Interrupt so</text><text x="526" y="446" fill="#cdd9e5" font-size="10">the core drops back to the level it came from.</text></svg>
Selection and practical application. Use GIC for ARM multicore, APIC for x86, MSI-X for scalable PCIe devices and simple controllers for small MCUs. Timers, NVMe, network, USB, GPU, sensors, DMA completion, interprocessor signaling and real-time systems use interrupts. Interrupt behavior spans peripheral status, controller, CPU architecture, OS scheduler, driver, DMA/cache ordering and power management. The useful design boundary is the complete hardware-software system. Optimizing an IP block, bus, driver, codec, radio, controller or firmware stage can move the bottleneck or weaken correctness, timing, power, safety, security, recoverability and manufacturability elsewhere, so qualification is end to end. A production specification names the hardware and software boundary, clock and reset domains, address map, data widths, endianness, ordering and coherency, interrupt and error behavior, power states, security domains, performance targets, configuration discovery, lifecycle owner, and verification evidence. Marketing names and nominal link rates are insufficient without exact revision, mode, topology, payload, and environmental conditions. Evaluation combines functional correctness with bandwidth and payload efficiency, p50 and tail latency, jitter, outstanding depth, utilization, arbitration fairness, interrupt rate, CPU overhead, memory traffic, error and retry rate, power, thermal behavior, area, firmware footprint, startup time, recovery, interoperability, reliability, security, and total cost. Measurements state workload, clocks, voltages, formats, traffic mix, software, and instrumentation. CFS connects this topic to semiconductor architecture, implementation, verification, manufacturing, packaging, test, and deployed AI-system tradeoffs across the platform.
Explore 500+ Semiconductor & AI Topics
From EUV lithography to CUDA optimization — search the full knowledge base or chat with our AI assistant.