ARM(7)IMX6ULL 按鍵控制(輪詢 + 中斷)優化工程

一、硬件介紹

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(上下拉)1122KΩ 上拉(確保開關斷開時為高電平)
    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)模塊的核心寄存器,從上到下依次為

  1. GPIOx_DR:Data Register(數據寄存器)

    • 功能:讀寫 GPIO 引腳的電平狀態(輸出模式下寫值、輸入模式下讀值)。
  2. GPIOx_GDIR:Direction Register(方向寄存器)

    • 功能:配置引腳為輸入(位設為0)或輸出(位設為1)。
  3. GPIOx_PSR:Pin Status Register(引腳狀態寄存器)

    • 功能:實時反映物理引腳的當前電平(與DR可能存在差異,推薦讀取PSR獲取實際狀態)。
  4. GPIOx_ICR1:Interrupt Configuration Register 1(中斷配置寄存器 1)

    • 功能:配置低 16 位引腳的中斷觸發方式(上升沿、下降沿、高電平或低電平)。
  5. GPIOx_ICR2:Interrupt Configuration Register 2(中斷配置寄存器 2)

    • 功能:配置高 16 位引腳的中斷觸發方式(與ICR1功能一致,僅對應引腳范圍不同)。
  6. GPIOx_IMR:Interrupt Mask Register(中斷屏蔽寄存器)

    • 功能:控制是否使能引腳的中斷(對應位設為1則允許中斷,0則屏蔽)。
  7. GPIOx_ISR:Interrupt Status Register(中斷狀態寄存器)

    • 功能:記錄哪些引腳發生了中斷(寫1可清除中斷標志)。
  8. GPIOx_EDGE_SEL:Edge Select Register(邊沿選擇寄存器)

    • 功能:選擇引腳是否使用邊沿觸發(設為1時,ICR1/ICR2配置無效,僅響應邊沿;設為0時,使用ICR1/ICR2的配置)。

這些寄存器共同實現了 GPIO 的輸入輸出控制、中斷配置與狀態管理,是嵌入式開發中操作 GPIO 的核心工具。

2. 中斷處理流程(6 步)

  1. 中斷請求:外設(GPIO)檢測到按鍵按下,發出中斷信號。
  2. 中斷檢查:CPU 判斷是否允許響應中斷(需未被屏蔽)。
  3. 優先級判斷:若存在多個中斷,優先處理高優先級請求。
  4. 保護現場:保存當前 CPU 寄存器狀態(確保后續能恢復原任務)。
  5. 執行中斷服務函數(ISR):處理中斷邏輯(如按鍵觸發的業務)。
  6. 恢復現場:恢復保存的寄存器狀態,回到原任務繼續執行。

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 類:
    中斷類型范圍特點與用途
    SGI0~15軟件中斷(Software-generated),用于多核通信
    PPI16~31私有中斷(Private),每個 CPU 核心獨有
    SPI32~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 核心模塊
  1. Distributor(分發器)
    • 管理所有中斷源(SGI/PPI/SPI)。
    • 功能:中斷屏蔽、優先級設置、向目標 CPU 分發中斷。
  2. 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)代碼編寫邏輯

需嚴格遵循 “中斷流程”,對應代碼步驟(結合上面的圖):

  1. 配置 GPIO 為中斷觸發模式(如下降沿觸發:按鍵按下時電平從高→低)。
  2. 配置 GIC(使能對應 SPI 中斷、設置優先級、綁定 CPU 核心)。
  3. 配置 CP15(設置中斷向量基址 VBAR、使能中斷響應)。
  4. 編寫中斷服務函數(ISR):處理按鍵邏輯(如置位標志、調用業務函數)。
  5. 使能全局中斷(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)原則對代碼的修改是關閉的,對代碼的拓展是開放的

實現措施:

  1. 模塊封裝
    • 封裝 GPIO 模塊:提供GPIO_Init()GPIO_SetInterruptMode()等接口,屏蔽底層寄存器操作。
    • 封裝中斷模塊:提供GIC_Init()Interrupt_Register()等接口,統一管理中斷配置。
  2. 回調函數注冊
    • 中斷服務函數中不直接寫業務邏輯,而是調用 “注冊的回調函數”。
    • 示例:用戶新增按鍵業務時,只需調用Interrupt_Register(KEY_IRQn, User_KeyCallback),無需修改中斷模塊代碼。
  3. 穩定性保障
    • 中斷服務函數需 “快進快出”(避免耗時操作,如 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 的核心功能

  1. 中斷源管理:識別和分類系統中的各種中斷(如外設中斷、軟件觸發中斷、定時器中斷等)。
  2. 優先級控制:為不同中斷分配優先級,確保高優先級中斷優先被處理。
  3. 中斷路由:將中斷分發到指定的 CPU 核心(支持多核系統中中斷的靈活分配)。
  4. 中斷狀態跟蹤:記錄中斷的觸發、處理、完成等狀態,協調 CPU 與中斷源的交互。

GIC 的主要版本

GIC 隨著 ARM 架構的發展迭代了多個版本,每個版本新增了對多核、虛擬化等場景的支持:

  • GICv1:早期版本,支持基本的中斷分發,主要用于單核心或簡單多核系統(如 ARMv7 架構)。
  • GICv2:增加了對多核系統的完善支持,引入了虛擬化相關的基礎功能(如安全擴展),支持最多 8 個 CPU 核心。
  • GICv3/GICv4:針對 ARMv8-A(64 位)架構設計,支持更多核心(最多 255 個),強化了虛擬化能力(如支持虛擬機直接處理中斷),并引入了新的中斷類型和分發機制(如 LPI,Locality-specific Peripheral Interrupt)。

GIC 的核心組件

GIC 的功能通過兩個主要邏輯單元實現:

  1. Distributor(分發器)

    • 全局管理所有中斷源,維護中斷的使能 / 禁用狀態。
    • 對中斷進行優先級排序(優先級由軟件配置)。
    • 根據配置將中斷路由到一個或多個 CPU 核心(支持 “中斷親和性” 設置)。
  2. 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 核心。

工作流程簡述

  1. 外設或軟件產生中斷請求,發送到 GIC 的 Distributor。
  2. Distributor 檢查中斷是否被使能、優先級是否滿足,并根據路由規則選擇目標 CPU。
  3. 目標 CPU 的 CPU Interface 接收中斷,通過 IRQ/FIQ 信號通知 CPU。
  4. CPU 響應中斷,通過 CPU Interface 向 GIC 確認中斷(標記為 “處理中”)。
  5. CPU 處理完中斷后,通過 CPU Interface 通知 GIC 中斷處理完成,GIC 更新中斷狀態。

總結

GIC 是 ARM 系統中中斷管理的 “中樞”,通過標準化的架構支持多核、虛擬化等復雜場景,確保中斷高效、有序地被處理,是嵌入式系統、服務器等 ARM 設備正常運行的核心組件之一。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/100376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/100376.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/100376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【QT隨筆】什么是Qt元對象系統?Qt元對象系統的核心機制與應用實踐

【QT隨筆】什么是Qt元對象系統&#xff1f;Qt元對象系統的核心機制與應用實踐 之所以寫下這篇文章&#xff0c;是因為前段時間自己面試的時候被問到了&#xff01;因此想借此分享一波&#xff01;&#xff01;&#xff01;本文主要詳細解釋Qt元對象系統的概念、作用及實現機制…

從技術視角解析加密貨幣/虛擬貨幣/穩定幣的設計與演進

隨著加密貨幣行情的持續走高&#xff0c;除了資產價值&#xff0c;我想試著從底層程序設計與架構角度解析比特幣、以太坊、穩定幣以及新興公鏈的核心技術方案。作者在2018年設計實施了基于區塊鏈技術的金融項目&#xff0c;并榮獲了國家課題進步獎&#xff0c;對加密貨幣及場景…

[MySQL]Order By:排序的藝術

[MySQL]Order By&#xff1a;排序的藝術 1. 簡介 在數據庫管理中&#xff0c;數據的排序是一項至關重要的操作。MySQL 的 ORDER BY 子句為我們提供了強大而靈活的功能&#xff0c;用于對查詢結果進行排序。無論是按照字母順序排列名稱&#xff0c;還是根據日期或數值進行升序…

【工具代碼】使用Python截取視頻片段,截取視頻中的音頻,截取音頻片段

目錄 ■截取視頻方法 1.下載 ffmpeg-8.0-essentials_build 2.配置到環境變量 3.python代碼 4.運行 5.效果 ■更多 截取視頻中的音頻 截取音頻 Sony的CR3圖片&#xff0c;轉換為JPG ■截取視頻方法 1.下載 ffmpeg-8.0-essentials_build "https://www.gyan.de…

Three.js 平面始終朝向相機

instanceMesh需要讓實例像粒子一樣始終朝向相機 可以如下處理shaderexport const billboarding // billboarding函數的GLSL實現 // 參數: // - position: 頂點動態位置偏移 // - positionLocal: mesh的position // - horizontal: 水平方向是否朝向相機 // - vertical: 垂直方…

旗訊 OCR 識別系統深度解析:一站式解決表格、手寫文字、證件識別難題!

在數字化辦公日益普及的今天&#xff0c;“紙質文檔轉電子”“圖片信息提取” 等需求愈發頻繁&#xff0c;但傳統手動錄入不僅效率低下&#xff0c;還容易出現數據錯誤。近期發現一款實用性極強的工具 —— 旗訊數字 OCR 識別系統&#xff0c;其覆蓋多場景的識別功能、極簡操作…

MissionPlanner架構梳理之(十四)日志瀏覽

概述和目的 Mission Planner 中的日志瀏覽系統提供了加載、查看、分析和解讀 ArduPilot 驅動的飛行器生成的飛行日志的工具。飛行日志包含飛行操作期間記錄的關鍵遙測數據&#xff0c;使用戶能夠查看飛行性能、診斷問題并從過去的飛行中獲取見解。 本頁記錄了日志瀏覽系統的架…

機器學習shap分析案例

在進行數據分析和機器學習時經常用到shap&#xff0c;本文對shap相關的操作進行演示。波士頓數據集鏈接在這里。 SHAP Analysis Guide Set up 導入必要包 import pandas as pd import numpy as np import lightgbm as lgb import matplotlib import matplotlib.pyplot as p…

網絡編程相關函數

1. 套接字操作相關1.1 socketint socket(int domain, int type, int protocol);參數說明int domain協議族&#xff0c;常用 AF_INET&#xff08;IPv4&#xff09;、AF_INET6&#xff08;IPv6&#xff09;int type套接字類型&#xff0c;SOCK_DGRAM&#xff08;UDP&#xff09;、…

ESLint 自定義 Processor(處理器)

ESLint 自定義 Processor&#xff08;處理器&#xff09; &#x1f539; 什么是 Processor&#xff1f; 在 ESLint 中&#xff0c;Processor&#xff08;處理器&#xff09;是一種擴展機制&#xff0c;允許處理非標準 JavaScript/TypeScript 文件。默認情況下&#xff0c;ESLin…

C++語法 | static靜態|單例模式

這里寫目錄標題static 關鍵字靜態局部變量 vs 局部變量靜態全局變量 vs 全局變量靜態成員變量 vs 成員變量靜態成員函數單例模式static 關鍵字 在此之前, 先了解一下 static 關鍵字 靜態局部變量 vs 局部變量 在靜態局部變量中&#xff0c;變量不會在函數調用結束后銷毀&…

KEDA/HPA/VPA 三件套:ABP 后臺作業的事件驅動伸縮

&#x1f680; KEDA/HPA/VPA 三件套&#xff1a;ABP 后臺作業的事件驅動伸縮 &#x1f4da; 目錄&#x1f680; KEDA/HPA/VPA 三件套&#xff1a;ABP 后臺作業的事件驅動伸縮0. TL;DR ?1. 背景與目標 &#x1f3af;2. 架構與協作機制 &#x1f9e9;2.1 系統總覽&#xff08;組…

webRTc 為何深受直播實現的青睞?

WebRTC(Web Real-Time Communication)之所以在直播場景中備受青睞,核心原因在于它天然契合了現代直播對低延遲、實時互動、跨平臺兼容性的核心需求,同時大幅降低了實時音視頻開發的門檻。具體來說,其優勢體現在以下幾個方面: 1. 超低延遲,滿足實時互動需求 傳統直播協…

HarmonyOS迷宮游戲鴻蒙應用開發實戰:從零構建隨機迷宮游戲(初版)

在鴻蒙應用開發中&#xff0c;游戲類應用能很好地鍛煉 UI 布局、狀態管理與邏輯交互能力。本文將以一個隨機迷宮游戲為例&#xff0c;詳細拆解從首頁設計到迷宮生成、角色控制、通關判定的完整開發流程&#xff0c;帶你掌握 ArkUI 框架的核心應用技巧。一、項目整體架構本次開發…

石頭科技出海升級:全球電商業財一體化與OMS實踐

石頭科技作為智能清潔設備領域的獨角獸&#xff0c;2023 年海外收入占比超過 60%&#xff0c;產品銷往全球 60 多個國家。然而&#xff0c;智能硬件出海的復雜性&#xff0c;讓企業在業財管理上面臨前所未有的挑戰。智能硬件業財痛點 產品生命周期管理&#xff1a;研發、生產到…

《URP管線中后處理效果的創新應用與優化實踐》

硬件性能的飛速提升與玩家對畫面品質的高要求形成了相互推動的態勢,而渲染效果作為游戲視覺體驗的核心載體,直接決定了玩家對游戲的第一印象與沉浸感。后處理效果作為URP管線的“點睛之筆”,通過在渲染流程末尾對最終圖像進行二次加工,能夠模擬真實世界的光學現象(如光線散…

【Java 底層】JVM 垃圾回收機制深度剖析:從對象生死判定到收集器實戰

【Java 底層】JVM 垃圾回收機制深度剖析&#xff1a;從對象生死判定到收集器實戰 【Java 底層】JVM 垃圾回收機制深度剖析&#xff1a;從對象生死判定到收集器實戰 Java 之所以被稱為 “開發效率利器”&#xff0c;很大程度上得益于其自動內存管理機制 —— 開發者無需手動分配…

網絡問題排查

網絡連通性測試&#xff1a;ping ip持續性監測&#xff1a;ping -t ipnetstat 可以查看網絡連接狀態&#xff0c;可以看到顯示系統的網絡連接&#xff0c;路由表&#xff0c;接口等信息。netstat -nult 回車-t:顯示的是tcp的連接-u:顯示udp的連接-l:只顯示監聽狀態的端口-n:顯示…

tuple/dict/list 這三個數據類型在取值時候的區別

tuple&#xff08;元組&#xff09;、dict&#xff08;字典&#xff09;、list&#xff08;列表&#xff09;在取值時的區別。 1. list&#xff08;列表&#xff09; &#x1f449; 列表就是“一串有順序的東西”&#xff0c;像排隊的人。 取值方式&#xff1a;用 下標&#xf…

深度解析大模型服務性能評測:AI Ping平臺助力開發者精準選型MaaS服務

深度解析大模型服務性能評測&#xff1a;AI Ping平臺助力開發者精準選型MaaS服務 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#xff…