一、硬件介紹
1. 開關功能定義
- 共 3 個開關(兩紅一黃),功能分工明確:
- 中間開關:復位按鈕
- 左邊開關:低功耗按鈕
- 右邊開關:用戶獨立控制的試驗按鍵(核心控制對象)
2. 核心電平邏輯(原理圖關鍵信息)
- 開關狀態與電平對應關系:
- 開關斷開時:引腳輸出高電平
- 開關按下時:引腳輸出低電平(代碼中判斷按鍵狀態的核心依據)
二、輪詢方式按鍵控制
輪詢方式通過 “反復查詢引腳電平” 判斷按鍵狀態,適用于簡單、無實時性要求的場景。
1. 前期準備:手冊查閱
需參考的核心文檔:
- 《IMX6ULL_MINI_V2.2 (Mini 底板原理圖).pdf》(確定引腳連接)
- 《IMX6ULL 參考手冊.pdf》(配置引腳復用、電氣特性、GPIO 寄存器)
2. 關鍵步驟:按鍵初始化
初始化需完成 “引腳復用→電氣特性配置→GPIO 方向→時鐘使能” 四步,以GPIO1_IO18(對應 UART1_CTS_B 引腳復用)?為例:
(1)引腳復用功能配置(IOMUXC)
- 參考手冊章節:Chapter 32(IOMUX Controller)
- 核心寄存器:
IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B
:?低四位(0101) - 配置函數:
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
- 關鍵位解析:
- SION(信號監控)1:0(禁用,輸入路徑由功能決定)
- MUX_MODE(復用模式)4:0101(ALT5,將引腳復用為 GPIO1_IO18)
(2)引腳電氣特性配置(PAD_CTL)
- 參考手冊章節:Chapter?32:IOMUX?Controller?(IOMUXC)
- 核心寄存器:
IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B
- 配置函數:
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF080);
- 配置位拆解(按手冊定義):
配置項 位值 含義說明 HYS(壓擺率) 0 禁用滯后功能(輸入無需開啟) PUS(上下拉) 11 22KΩ 上拉(確保開關斷開時為高電平) PUE(拉 / 保持) 1 選擇 “拉模式”(而非保持模式) PKE(拉 / 保持使能) 1 使能拉功能 ODE(漏極開漏) 0 禁用漏極開漏(輸入場景無需開啟) SPEED(速度) 10 中速(100MHz,滿足按鍵檢測需求) DSE(驅動能力) 000 禁用輸出驅動(引腳為輸入,輸出驅動無效) SRE( slew rate) 0 慢擺率(輸入無影響)
(3)GPIO 方向配置(輸入模式)(GDIR)
- 參考手冊章節:Chapter 28(General Purpose Input/Output)
- 核心寄存器:
GPIOx_GDIR
(GPIO 方向寄存器,x=1 對應 GPIO1 組) - 配置代碼:
GPIO1->GDIR &= ~(1 << 18);
(清第 18 位,0 表示輸入模式;1 為輸出模式)
(4)GPIO 時鐘使能(CCM)
- 參考手冊章節:Chapter 18(Clock Controller Module)
- 核心寄存器:
CCM_CCGR1
(GPIO1 組共用時鐘門控寄存器) - 功能:開啟 GPIO1 組時鐘(外設需時鐘才能工作,默認可能關閉)
3. 運行時:按鍵狀態檢測
通過讀取 GPIO 數據寄存器判斷按鍵狀態:
- 參考手冊章節:Chapter?28:General?Purpose?Input/Output?(GPIO)
- 核心寄存器:
GPIOx_DR
(GPIO 數據寄存器) - 檢測邏輯:
- 若?
(GPIO1->DR & (1 << 18)) != 0
:開關斷開(高電平)→ 按鍵未按下 - 若?
(GPIO1->DR & (1 << 18)) == 0
:開關按下(低電平)→ 按鍵觸發
- 若?
4. 輪詢方式的致命問題:漏查
(1)問題場景
當主程序承擔大量、復雜、耗時的業務(如數據處理、多設備控制)時,輪詢周期被拉長,可能錯過按鍵觸發的 “短暫低電平”(即漏查)。
(2)模擬驗證
用delay(0x7FFFFF);
模擬耗時業務,此時按鍵按下的低電平可能在 delay 期間結束,輪詢無法檢測到。
(3)典型風險場景
在實時性要求高的場景(如汽車剎車信號檢測、工業急停按鈕),漏查會導致嚴重安全事故。
三、中斷方式按鍵控制
中斷可讓 CPU“優先處理緊急任務(如按鍵)”,處理完后返回原業務,解決輪詢漏查問題。
1. 中斷核心概念
- 定義:CPU 可打斷當前執行的任務,轉去處理更緊急的中斷請求,處理完成后恢復現場并繼續原任務。
- 本場景中斷源:GPIO 外部中斷(EINT,由按鍵按下觸發)
- 角色分工:
- Kernel(內核):被中斷的 “原任務執行者”
- 外設(GPIO):發出中斷請求的 “觸發者”
---中斷相關寄存器? ? ? ? ? ? ? ? ? I? 開頭
這些寄存器是 NXP i.MX 系列(如 i.MX6ULL、i.MX RT1062 等)通用 I/O(GPIO)模塊的核心寄存器,從上到下依次為:
GPIOx_DR:Data Register(數據寄存器)
- 功能:讀寫 GPIO 引腳的電平狀態(輸出模式下寫值、輸入模式下讀值)。
GPIOx_GDIR:Direction Register(方向寄存器)
- 功能:配置引腳為輸入(位設為
0
)或輸出(位設為1
)。GPIOx_PSR:Pin Status Register(引腳狀態寄存器)
- 功能:實時反映物理引腳的當前電平(與
DR
可能存在差異,推薦讀取PSR
獲取實際狀態)。GPIOx_ICR1:Interrupt Configuration Register 1(中斷配置寄存器 1)
- 功能:配置低 16 位引腳的中斷觸發方式(上升沿、下降沿、高電平或低電平)。
GPIOx_ICR2:Interrupt Configuration Register 2(中斷配置寄存器 2)
- 功能:配置高 16 位引腳的中斷觸發方式(與
ICR1
功能一致,僅對應引腳范圍不同)。GPIOx_IMR:Interrupt Mask Register(中斷屏蔽寄存器)
- 功能:控制是否使能引腳的中斷(對應位設為
1
則允許中斷,0
則屏蔽)。GPIOx_ISR:Interrupt Status Register(中斷狀態寄存器)
- 功能:記錄哪些引腳發生了中斷(寫
1
可清除中斷標志)。GPIOx_EDGE_SEL:Edge Select Register(邊沿選擇寄存器)
- 功能:選擇引腳是否使用邊沿觸發(設為
1
時,ICR1/ICR2
配置無效,僅響應邊沿;設為0
時,使用ICR1/ICR2
的配置)。這些寄存器共同實現了 GPIO 的輸入輸出控制、中斷配置與狀態管理,是嵌入式開發中操作 GPIO 的核心工具。
2. 中斷處理流程(6 步)
- 中斷請求:外設(GPIO)檢測到按鍵按下,發出中斷信號。
- 中斷檢查:CPU 判斷是否允許響應中斷(需未被屏蔽)。
- 優先級判斷:若存在多個中斷,優先處理高優先級請求。
- 保護現場:保存當前 CPU 寄存器狀態(確保后續能恢復原任務)。
- 執行中斷服務函數(ISR):處理中斷邏輯(如按鍵觸發的業務)。
- 恢復現場:恢復保存的寄存器狀態,回到原任務繼續執行。
3. 關鍵組件:中斷控制器 GIC
GIC(Generic Interrupt Controller,通用中斷控制器)是 ARM 架構中管理中斷的核心模塊,負責中斷分發、優先級控制。
(1)參考文檔
- 《ARM Generic Interrupt Controller (ARM GIC 控制器) V2.0.pdf》
- 《IMX6ULL 參考手冊.pdf》Chapter 3.2(Cortex A7 interrupts)
- 《MCIMX6Y2.h》(定義 IRQn_Type 中斷編號)
(2)GIC V2.0 核心特性
- V2.0設計可以為8個內核提供中斷控制服務,但我們使用的IMX6ULL只有一個內核,圖中所示只有processor?0
- 每個內核能夠相應1020個中斷源,其中0~15是SGI,16~31是PPI,能夠作為外設中斷源的是SPI32~1019
- 支持 8 個 CPU 核心(IMX6ULL 僅用 1 個核心,對應 processor 0)。
- 共 1020 個中斷源,按類型分為 3 類:
中斷類型 范圍 特點與用途 SGI 0~15 軟件中斷(Software-generated),用于多核通信 PPI 16~31 私有中斷(Private),每個 CPU 核心獨有 SPI 32~1019 共享中斷(Shared),外設中斷專用(如 GPIO)
Distributor(分發器):
- (1)SGI(Software-generated Interrupt),軟件中斷:
? ? 由軟件觸發引起的中斷,通過向寄存器GICD_SGIR 寫入數據來觸發,系統會使用 SGI 中斷來完成多核之間的通信。
- (2)PPI(Private Peripheral Interrupt),私有中斷:
? ? 我們說了 GIC 是支持多核的,每個核肯定有自己獨有的中斷。這些獨有的中斷肯定是要指定的核心處理,因此這些中斷就叫做私有中斷;
- (3)SPI(Shared Peripheral Interrupt),共享中斷:
? ? (注意!不是 SPI 總線那個中斷),這類中斷泛指所有
(3)GIC 核心模塊
- Distributor(分發器):
- 管理所有中斷源(SGI/PPI/SPI)。
- 功能:中斷屏蔽、優先級設置、向目標 CPU 分發中斷。
- CPU Interface(CPU 接口):
- 連接 GIC 與 CPU 核心。
- 功能:傳遞中斷請求給 CPU、確認中斷處理完成。
(4)IMX6ULL 中斷編號對應
- 手冊定義:Cortex A7 中斷編號范圍 0~128。
- 頭文件定義:
IRQn_Type
(外設中斷編號 0~159,需與 GIC 的 SPI 編號對應)。
(5) GIC相關(圖)
?core_ca7.h
4. 底層支撐:協處理器 CP15--------主要使用cp10.11.15?
Cortex-A7 的協處理器 CP15(CP0~CP15)負責系統級控制,中斷配置需依賴其關鍵寄存器。
(1)參考文檔
- 架構參考手冊《Cortex-A7 Technical Reference Manual.pdf》Chapter 4(System Control)
(2)CP15 核心功能---------? ? ? ? ?(跟數據存儲相關的)
- 系統控制與配置、MMU(內存管理單元)配置、Cache 配置、虛擬化與安全、性能監控。
(3)CP15 寄存器讀寫指令? MRC
- 讀寄存器:
MRC <coproc>, <opc1>, <Rt>, <CRn>, <CRm>, {, <opc2>}
(如讀取 SCTLR 寄存器:mrc p15,0,r0,c1,c0,0
)- 寫寄存器:
MCR <coproc>, <opc1>, <Rt>, <CRn>, <CRm>, {, <opc2>}
(如寫入 SCTLR 寄存器:mcr p15,0,r0,c1,c0,0
)
(4)中斷相關關鍵寄存器
寄存器 | 功能描述 | 關鍵位 / 配置示例 |
---|---|---|
c0: MIDR | 存儲內核基本信息(如型號、版本) | 調試時確認內核型號 |
c1: SCTLR | 系統控制寄存器(中斷向量、Cache 使能) | bit13(V):0 = 向量基址 0x00000000;1=0xFFFF0000 bit12(I):1 = 使能指令 Cache demo: mrc p15,0,r0,c1,c0,0 bic r0,r0,#(1<<13) orr r0,r0,#(1<<12) mcr p15,0,r0,c1,c0,0 |
c12: VBAR | 中斷向量基地址寄存器(指定中斷服務表地址) | demo:__get_VBAR(0x87800000); (設置基址為 0x87800000) |
c15: CBAR | 存儲 GIC 寄存器的物理基地址(定位 GIC) | demo:mrc p15,4,r0,c15,c0,0 (讀取基地址到 r0) |
(5)相關圖(c0-c15)
c0 - MIDR
c12 - VBAR
?c1 - SCTLR4
5. 中斷代碼設計要點
中斷相關寄存器組
c0 registers:
MIDR(Main ID Register):存儲內核的一些基本信息
c1 registers:
SCTLR(System Control Register)
bit13:V?? ?
bit12:I?? ??? ??? ?
c12 registers:
VBAR(Vector Base Address Register)?? ??? ??? ??? ??? ?
c15 registers:
CBAR(Configuration Base Address Register)
(1)代碼編寫邏輯
需嚴格遵循 “中斷流程”,對應代碼步驟(結合上面的圖):
- 配置 GPIO 為中斷觸發模式(如下降沿觸發:按鍵按下時電平從高→低)。
- 配置 GIC(使能對應 SPI 中斷、設置優先級、綁定 CPU 核心)。
- 配置 CP15(設置中斷向量基址 VBAR、使能中斷響應)。
- 編寫中斷服務函數(ISR):處理按鍵邏輯(如置位標志、調用業務函數)。
- 使能全局中斷(CPU 允許響應中斷)。
(2)完整代碼 (獨立interrupt.c/.h) key5
main.c
key.c
interrupt.c
interrupt.h
start.S
**********************************
啟動代碼中添加對IRQ中斷的handler函數跳轉;
在_start_hander中加入對異常向量表的修改函數
(3)降低程序耦合性(遵循 OCP 原則)
OCP 原則(開放 - 關閉原則):對修改關閉,對拓展開放(避免修改原有代碼即可新增功能)。
降低程序耦合性(1)滿足用戶基本需求(2)程序穩定可靠(3)滿足OCP(open close principle)原則對代碼的修改是關閉的,對代碼的拓展是開放的
實現措施:
- 模塊封裝:
- 封裝 GPIO 模塊:提供
GPIO_Init()
、GPIO_SetInterruptMode()
等接口,屏蔽底層寄存器操作。 - 封裝中斷模塊:提供
GIC_Init()
、Interrupt_Register()
等接口,統一管理中斷配置。
- 封裝 GPIO 模塊:提供
- 回調函數注冊:
- 中斷服務函數中不直接寫業務邏輯,而是調用 “注冊的回調函數”。
- 示例:用戶新增按鍵業務時,只需調用
Interrupt_Register(KEY_IRQn, User_KeyCallback)
,無需修改中斷模塊代碼。
- 穩定性保障:
- 中斷服務函數需 “快進快出”(避免耗時操作,如 printf、delay)。
- 增加中斷標志位(避免中斷嵌套導致的邏輯混亂)。
KEY、中斷模塊優化
//interrupt.c#include "interrupt.h"
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "core_ca7.h"static irq_interrupt_t interrupt_Vector_table[160] = {NULL};void system_interrupt_init(void)
{//基地址映射__set_VBAR(0x87800000);//1.GIC初始化GIC_Init();
}void system_interrupt_register(IRQn_Type irq, irq_interrupt_t handler)
{interrupt_Vector_table[irq] = handler;
}void system_interrupt_handler(IRQn_Type irq)
{if (interrupt_Vector_table[irq] != NULL){interrupt_Vector_table[irq]();}
}//key.c#include "key.h"
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "interrupt.h"
#include "led.h"void key_16_31_handler(void)
{if((GPIO1->ISR & (1 << 18)) !=0){led_nor();//中斷處理GPIO1->ISR |= (1 << 18); }
}void key_init(void)
{//復用功能 配置為GPIO1_18IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);//電氣特性配置IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF0B0);//引腳方向GPIO1->GDIR &= ~(1 << 18);//中斷觸發方式配置GPIO1->ICR2 |= (3 << 4); //中斷源屏蔽寄存器解除屏蔽GPIO1->IMR |= (1 <<18);//注冊中斷處理函數system_interrupt_register(GPIO1_Combined_16_31_IRQn, key_16_31_handler);//2.GIC中斷使能GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);GIC_SetPriority(GPIO1_Combined_16_31_IRQn, 0);
}int key_check(void)
{return (GPIO1->DR & (1 << 18)) == 0;
}
GPIO 模塊優化(支持多引腳擴展)
通過結構體參數傳遞 GPIO 配置,支持多按鍵擴展,無需重復編寫代碼
//gpio.c#include "gpio.h"void gpio_init(GPIO_Type *gpio, int pin, gpio_pin_t *data)
{if (data->dir == gpio_output){gpio->GDIR |= (1 << pin);if(data->def_val == 1){gpio->DR |= (1 << pin);}else{gpio->DR &= ~(1 << pin);}}else{gpio->GDIR &= ~(1 << pin);}
}int gpio_read(GPIO_Type *gpio, int pin)
{return ((gpio->DR & (1 << pin)) != 0);
}void gpio_write(GPIO_Type *gpio, int pin, int data){if (data == 0){gpio->DR &= ~(1 << pin);}else{gpio->DR |= (1 << pin);}
}//interrupt.c#include "interrupt.h"
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "core_ca7.h"static irq_interrupt_t interrupt_Vector_table[160] = {NULL};void system_interrupt_init(void)
{//基地址映射__set_VBAR(0x87800000);//1.GIC初始化GIC_Init();
}void system_interrupt_register(unsigned int irq, irq_interrupt_t handler)
{interrupt_Vector_table[irq] = handler;
}void system_interrupt_handler(IRQn_Type irq)
{if (interrupt_Vector_table[irq] != NULL){interrupt_Vector_table[irq]();}
}//key.c#include "key.h"
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "core_ca7.h"
#include "interrupt.h"
#include "led.h"void key_16_31_handler(void)
{if((GPIO1->ISR & (1 << 18)) !=0){led_nor();//中斷處理GPIO1->ISR |= (1 << 18); }
}void key_init(void)
{//復用功能 配置為GPIO1_18IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);//電氣特性配置IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF0B0);//引腳方向GPIO1->GDIR &= ~(1 << 18);//中斷觸發方式配置GPIO1->ICR2 |= (3 << 4); //中斷源屏蔽寄存器解除屏蔽GPIO1->IMR |= (1 <<18);//注冊中斷處理函數system_interrupt_register(GPIO1_Combined_16_31_IRQn, key_16_31_handler);//2.GIC中斷使能GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn);GIC_SetPriority(GPIO1_Combined_16_31_IRQn, 0);
}int key_check(void)
{return (GPIO1->DR & (1 << 18)) == 0;
}//led.c#include "led.h"
#include "MCIMX6Y2.h"
#include "fsl_iomuxc.h"
#include "gpio.h"void led_init(void)
{IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0);//GPIO1->GDIR |= (1 << 3);//led_off();gpio_pin_t io_3;io_3.dir = gpio_output;io_3.def_val = 1;gpio_init(GPIO1, 3, &io_3);
}void led_on(void)
{gpio_write(GPIO1, 3, 0);
}void led_off(void)
{gpio_write(GPIO1, 3, 1);
}void led_nor(void)
{gpio_write(GPIO1, 3, !gpio_read(GPIO1, 3));
}
(4) 代碼編寫思路歷程(根據框? 圖)
?使能
傳遞中斷號
優先級·0最高---------越小越高
?強制內聯靜態內聯函數
地址訪問問題·
?C_IAR? ?????????基地址 + 0x200C (偏移地址)
?C_EOIR? ? ? ? 基地址 + 0x2010?(偏移地址)
獲取GIC基地址? ? ? ? ?==== 手冊
對照寫------ 把GIC基地址讀到R0寄存器里面(R0? base 基地址)
、
coproc 協處理器?
?
? ? ? ? 存到R1里
c15? CBAR->
當前進度
下面是kernal
mrc p15, 0, r0, c1, c0, 0 ? ? ? ? ? ? ? ?參數對應cp1內容,修改異常向量表映射方式
bic r0, r0, #(1 << 13) ? ? ? ? ? ? ? ? ? ? ? bit13位為V清零,VBAR配置中斷向量基地址
orr r0, r0, #(1 << 12) ? ? ? ? ? ? ? ? ? ? ? bit12位為I 置一,iche使能位打開
mcr p15, 0, r0, c1, c0, 0?對照下圖
??
跳轉
為什么有偏移量?
四、核心對比:輪詢 vs 中斷
對比維度 | 輪詢方式 | 中斷方式 |
---|---|---|
實時性 | 差(易漏查) | 好(優先響應緊急任務) |
CPU 資源占用 | 高(持續查詢) | 低(僅中斷時占用) |
適用場景 | 簡單、無實時性需求(如 LED 閃爍) | 實時性需求高(如剎車、急停) |
代碼復雜度 | 低(無需配置中斷) | 高(需配置 GIC、CP15) |
--------------知識點梳理補充------------------
在 ARM 架構中,GIC(Generic Interrupt Controller,通用中斷控制器)?是負責管理系統中斷的關鍵組件,它統一處理來自外設、軟件或其他硬件的中斷請求,并將其分發到相應的處理器核心(CPU)進行處理。GIC 的存在使得多核心 ARM 系統中的中斷管理更加標準化、高效化。
GIC 的核心功能
- 中斷源管理:識別和分類系統中的各種中斷(如外設中斷、軟件觸發中斷、定時器中斷等)。
- 優先級控制:為不同中斷分配優先級,確保高優先級中斷優先被處理。
- 中斷路由:將中斷分發到指定的 CPU 核心(支持多核系統中中斷的靈活分配)。
- 中斷狀態跟蹤:記錄中斷的觸發、處理、完成等狀態,協調 CPU 與中斷源的交互。
GIC 的主要版本
GIC 隨著 ARM 架構的發展迭代了多個版本,每個版本新增了對多核、虛擬化等場景的支持:
- GICv1:早期版本,支持基本的中斷分發,主要用于單核心或簡單多核系統(如 ARMv7 架構)。
- GICv2:增加了對多核系統的完善支持,引入了虛擬化相關的基礎功能(如安全擴展),支持最多 8 個 CPU 核心。
- GICv3/GICv4:針對 ARMv8-A(64 位)架構設計,支持更多核心(最多 255 個),強化了虛擬化能力(如支持虛擬機直接處理中斷),并引入了新的中斷類型和分發機制(如 LPI,Locality-specific Peripheral Interrupt)。
GIC 的核心組件
GIC 的功能通過兩個主要邏輯單元實現:
Distributor(分發器)
- 全局管理所有中斷源,維護中斷的使能 / 禁用狀態。
- 對中斷進行優先級排序(優先級由軟件配置)。
- 根據配置將中斷路由到一個或多個 CPU 核心(支持 “中斷親和性” 設置)。
CPU Interface(CPU 接口)
- 每個 CPU 核心對應一個 CPU 接口,負責與本核心交互。
- 接收來自 Distributor 的中斷請求,通知 CPU(如通過 IRQ/FIQ 信號)。
- 處理 CPU 對中斷的響應(如中斷確認、處理完成通知)。
中斷類型
GIC 管理的中斷分為三類,以適應不同場景:
- SGI(Software Generated Interrupt,軟件生成中斷):由軟件通過寫寄存器觸發,用于核心間通信(如多核系統中核心 A 通知核心 B 處理任務)。
- PPI(Private Peripheral Interrupt,私有外設中斷):屬于特定 CPU 核心的私有中斷(如每個核心獨立的定時器中斷),僅能被對應的核心處理。
- SPI(Shared Peripheral Interrupt,共享外設中斷):由系統中的共享外設(如 UART、GPIO)產生,可被路由到任意一個或多個 CPU 核心。
工作流程簡述
- 外設或軟件產生中斷請求,發送到 GIC 的 Distributor。
- Distributor 檢查中斷是否被使能、優先級是否滿足,并根據路由規則選擇目標 CPU。
- 目標 CPU 的 CPU Interface 接收中斷,通過 IRQ/FIQ 信號通知 CPU。
- CPU 響應中斷,通過 CPU Interface 向 GIC 確認中斷(標記為 “處理中”)。
- CPU 處理完中斷后,通過 CPU Interface 通知 GIC 中斷處理完成,GIC 更新中斷狀態。
總結
GIC 是 ARM 系統中中斷管理的 “中樞”,通過標準化的架構支持多核、虛擬化等復雜場景,確保中斷高效、有序地被處理,是嵌入式系統、服務器等 ARM 設備正常運行的核心組件之一。