volatile:易變的,防止系統優化
對寄存器做處理的時候使用,在進行寫1清零操作時,防止該操作被系統優化;
一、GIC通用中斷控制器
1.GIC通用中斷控制器
????????GIC接收眾多外部中斷,然后對其進行處理,最終通過VFIQ、VIRQ、FIQ 和 IRQ給內核;這四個 信號的含義如下: VFIQ:虛擬快速 FIQ。 VIRQ:虛擬 IRQ。 FIQ:快速中斷 IRQ。 IRQ:中斷 IRQ。
2,GIC中斷分類:
- SPI(Shared Peripheral Interrupt),共享中斷, (注意!不是 SPI 總線那個中斷),這類中斷泛指所有的 外設中斷;
- PPI(Private Peripheral Interrupt),私有中斷,我們說了 GIC 是支持多核的,每個核肯定有自己獨有 的中斷。這些獨有的中斷肯定是要指定的核心處理,因此這些中斷就叫做私有中斷;
- SGI(Software-generated Interrupt),軟件中斷,由軟件觸發引起的中斷,通過向寄存器GICD_SGIR 寫入數據來觸發,系統會使用 SGI 中斷來完成多核之間的通信。
中斷優先級數字越小,優先級越高;
3,GIC組成
? ? ? ? 由分發器 (1個)、cPU接口(幾核就幾個);
(1)分發器:
- 全局中斷使能控制;
- 控制每一個中斷的使能或者關閉;
- 設置每個中斷的優先級;
- 設置每個中斷的目標處理器列表;
- 設置每個外部中斷的觸發模式:電平觸發或邊沿觸發;
- 設置每個中 斷屬于組 0 還是組 1;
(2)CPU接口
- 使能或者關閉發送到 CPU Core 的中斷請求信號;
- 應答中斷;
- 通知中斷處理完成;
- 設置優先級掩碼,通過掩碼來設 置哪些中斷不需要上報給 CPU Core;
- 定義搶占策略;
- 當多個中斷到來的時候,選擇優先級最高的 中斷通知給 CPU Core;
4.協處理器
(1)總共由16個,cp0~cp15;其中最常使用的cp15;
cp10,cp11:浮點型運算
5.cp15
(1)作用:
- 獲取GIC的基地址(CBAR)
- MMU的配置(使能/禁用;SCTLR)
- cache的配置
- 監控系統性能
- 配置中斷控制器(優先級、分組、使能/禁用,VBAR:設置中斷向量表基地址)
- 訪問寄存器(mrc讀、mcr寫)
- 獲取或結束中斷(IAR、EOIR)
(2)mrc:將從cp15里面讀出來放寄存器里面
MRC{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>
mcr:把寄存器里面的東西往cp15里面寫
MCR{cond} p15, <opc1>, <Rt>, <CRn>, <CRm>, <opc2>


????????簡單總結一下,通過 MIDR 寄存器可以獲取到處理器內核信息;通過 SCTLR 寄存器可以使能或禁止 MMU、I/D Cache 等;通過 VBAR 寄存器可以設置中斷向量偏移;通過CBAR 寄存器可以獲取 GIC 基地址。
二、外部中斷
1.設置GIC
? ? ? ? (1)讀取SCTLR,將V位置0(軟件可以通過 VBAR來重新映射這個基地址)I位置1(I cache使能)

? ? ? ? (2)通過GIC查詢當前中斷ID;先獲取GIC基地址(CBAR);對其進行偏移(IAR),獲得中斷ID,然后進入中斷處理函數

2.中斷服務函數? ? ? ?
(1)中斷初始化;重新定位異常向量表的位置到0x87800000;并且調用GIC_Init函數

(2)對于GPIO1->ICR2(觸發方式)、GPIO1->IMR(該中斷使能)在中斷源初始化進行配置
(4)中斷服務函數
?



注意:先要在相對應的中斷源的初始化函數里面注冊在中斷向量數組中;例子:注冊完中斷之后,中斷發生就會調用中斷服務函數
內斂函數:INLINE,定義被放在頭文件中
三、OCP原則
1.OCP:開閉原則,對程序代碼的添加是開放的,對程序的修改是關閉的
2.基于OCP原則對代碼的修改
- ????????應用于中斷服務函數的處理