點(diǎn)擊藍(lán)字 ╳ 關(guān)注我們
開源項(xiàng)目 OpenHarmony是每個(gè)人的 OpenHarmony蔣衛(wèi)峰
深圳開鴻數(shù)字產(chǎn)業(yè)發(fā)展有限公司
OS內(nèi)核開發(fā)工程師
一、前言
OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)采用多內(nèi)核架構(gòu),支持Linux內(nèi)核的標(biāo)準(zhǔn)系統(tǒng)、LiteOS-A的小型系統(tǒng)、LiteOS-M的輕量系統(tǒng)。 其中LiteOS-A要求設(shè)備具備一定的處理能力,對(duì)比LiteOS-M,LiteOS-A支持以下特性: (1)MMU支持:通過MMU支持內(nèi)核態(tài)和用戶態(tài)分離,支持虛擬單元; (2)支持獨(dú)立進(jìn)程:調(diào)度對(duì)象分別為進(jìn)程、線程; (3)支持文件系統(tǒng):包括虛擬文件和塊設(shè)備等; (4)支持更復(fù)雜的IPC:包括LiteIPC等; (5)支持多核調(diào)度:支持雙核MCU,支持雙核調(diào)度; (6)支持POSIX接口:為APP開發(fā)提供更多幫助。 LiteOS-A內(nèi)核特性都是建立在CPU硬件的基礎(chǔ)上,而中斷控制器在支持LiteOS-A內(nèi)核的CPU中發(fā)揮著巨大的作用:它管理和控制可屏蔽中斷并對(duì)可屏蔽中斷進(jìn)行優(yōu)先權(quán)判定,減少CPU的負(fù)載,使得CPU更加專注于計(jì)算。 在嵌入式領(lǐng)域,ARM公司提供的芯片目前是市場的主流,OpenHarmony LiteOS-M內(nèi)核目前支持的ARM公司的Cortex-M系列的芯片,而LiteOS-A內(nèi)核支持的則是ARM公司功能更強(qiáng)大的Cortex-A/R系列的芯片,GIC是ARM公司給Cortex-A/R系列芯片提供的一個(gè)中斷控制器,在移植OpenHarmony LiteOS-A內(nèi)核到特定板子的實(shí)踐中,我們遇到了很多GIC中斷控制器相關(guān)的技術(shù)問題,所以需要深入了解ARM體系架構(gòu)下GIC中斷控制器的原理和使用方法,特此總結(jié)并共享給各位網(wǎng)友。二、GIC控制器概述
1、GIC簡介 GIC是ARM公司給Cortex-A/R核提供的一個(gè)中斷控制器,類似Cortex-M中的NVIC。目前GIC有4個(gè)版本:V1~V4:V1是最老的版本,已經(jīng)被廢棄了;V2~V4目前正在被大量地使用。GIC V2是給ARMv7-A架構(gòu)使用的,比如Cortex-A5,Cortex-A7、Cortex-A9、Cortex-A15等,V3和V4是給ARMv8-A/R架構(gòu)使用的,也就是64位芯片使用的。 GIC V2最多支持8個(gè)核。ARM會(huì)根據(jù)GIC版本的不同研發(fā)出不同的IP核,半導(dǎo)體廠商直接購買對(duì)應(yīng)的IP核即可,比如ARM針對(duì)GIC V2就開發(fā)出了GIC400中斷控制器IP核。注意,具體產(chǎn)品是GIC400,設(shè)計(jì)規(guī)范是V2。當(dāng)GIC接收到外部中斷信號(hào)以后匯報(bào)給ARM內(nèi)核,但是ARM內(nèi)核只提供四個(gè)信號(hào)給GIC來匯報(bào)中斷情況:VFIQ、VIRQ、FIQ和IRQ,他們之間的關(guān)系如圖所示: ? 在圖中,GIC接收眾多的外部中斷,并對(duì)其進(jìn)行處理,最終只通過四個(gè)信號(hào)報(bào)給 ARM 內(nèi)核,這四個(gè)信號(hào)的含義如下:●VFIQ: 虛擬快速 FIQ●VIRQ: 虛擬外部 IRQ●FIQ: 快速中斷 IRQ●IRQ: 外部中斷 IRQ 2、GIC整體實(shí)現(xiàn) 下圖左側(cè)部分是中斷源,中間部分是GIC控制器,最右側(cè)是中斷控制器向處理器內(nèi)核發(fā)送中斷信息。我們重點(diǎn)要看的是中間的 GIC 部分,GIC 將眾多的中斷源分為三類: ①SPI(Shared Peripheral Interrupt),共享中斷,即所有Core共享的中斷,外部中斷都屬于SPI中斷。比如按鍵中斷、串口中斷等,這些中斷所有的Core都可以處理,不限定特定Core。在圖中,每個(gè)SPI設(shè)計(jì)是共享的,在SMP系統(tǒng)中每個(gè)SPI都需要連接一個(gè)線到各個(gè)CPU中。 ②PPI(Private Peripheral Interrupt),私有中斷,GIC是支持多核的,每個(gè)核有自己獨(dú)有的中斷,需要指定的核心處理。在圖中,每個(gè)CPU都有屬于自己的PPIs,對(duì)應(yīng)關(guān)系是1對(duì)1。 ③SGI(Software-generated Interrupt),軟件中斷,由軟件觸發(fā)引起的中斷,通過向寄存器GICD_SGIR寫入數(shù)據(jù)來觸發(fā),系統(tǒng)使用SGI中斷來完成多核之間的通信。在圖中,SGI是軟件(軟件運(yùn)行在CPU上)觸發(fā),所以SGI中斷源頭是各個(gè)CPU上的應(yīng)用,另外SGI和PPI一樣,每個(gè)CPU都有屬于自己的SGI,所以必須指定CPU。 ?3、中斷 ID 中斷源有很多,為了區(qū)分不同的中斷源要給它們分配唯一ID,也就是中斷ID。每一個(gè)CPU最多支持1020個(gè)中斷ID,中斷ID號(hào)為ID0~ID1019。1020 個(gè)ID包含了PPI、SPI和SGI,那么這三類中斷是如何分配這 1020 個(gè)中斷 ID 的呢?分配如下:●ID0~ID15:這16個(gè)ID分配給SGI●ID16~ID31:這16個(gè)ID分配給PP●ID32~ID1019:這988個(gè)ID分配給SPI,像GPIO中斷、串口中斷等這些外部中斷 至于具體到某個(gè)ID對(duì)應(yīng)哪個(gè)中斷,那就由半導(dǎo)體廠商根據(jù)實(shí)際情況去定義。比如 I.MX6U 的總共使用了128個(gè)中斷ID,加上前面屬于PPI和SGI的32個(gè)ID,I.MX6U的中斷源共有128+32=160個(gè)。 ?4、GIC邏輯模塊 GIC架構(gòu)分為了兩個(gè)邏輯塊:Distributor和CPU Interface,也就是分發(fā)器端和CPU接口端。 Distributor(分發(fā)器端):參考GIC整體實(shí)現(xiàn)的圖,此邏輯塊負(fù)責(zé)處理各個(gè)中斷事件的分發(fā)問題,確定中斷事件應(yīng)該發(fā)送到哪個(gè)CPU Interface上去。分發(fā)器收集所有的中斷源,可以控制每個(gè)中斷的優(yōu)先級(jí),它總是將優(yōu)先級(jí)最高的中斷事件發(fā)送到CPU接口端。分發(fā)器端要做的主要工作如下: ① 全局中斷使能控制 ② 控制每一個(gè)中斷的使能或者關(guān)閉 ③ 設(shè)置每個(gè)中斷的優(yōu)先級(jí) ④ 設(shè)置每個(gè)中斷的目標(biāo)處理器列表 ⑤ 設(shè)置每個(gè)外部中斷的觸發(fā)模式:電平觸發(fā)或邊沿觸發(fā) ⑥ 設(shè)置每個(gè)中斷屬于組0還是組1,此設(shè)置涉及到另外一個(gè)領(lǐng)域安全領(lǐng)域 CPU Interface(CPU接口端):CPU接口端和CPU Core相連接,因此每個(gè)CPU Core都可以在GIC中找到一個(gè)與之對(duì)應(yīng)的CPU Interface。CPU接口端是分發(fā)器和CPU Core之間的橋梁,CPU接口端主要工作如下: ① 使能或者關(guān)閉發(fā)送到CPU Core的中斷請(qǐng)求信號(hào) ② 應(yīng)答中斷 ③ 通知中斷處理完成 ④ 設(shè)置優(yōu)先級(jí)掩碼,通過掩碼來設(shè)置哪些中斷不需要上報(bào)給CPU Core ⑤ 定義搶占策略 ⑥ 當(dāng)多個(gè)中斷到來的時(shí)候,選擇優(yōu)先級(jí)最高的中斷通知給CPU Core三、GIC400原理
1、整體框架圖 GIC-400實(shí)現(xiàn)了以下的中斷類型:●16個(gè)軟件產(chǎn)生的中斷(SGI)●每個(gè)處理器有6個(gè)外部私有外設(shè)中斷(PPI)●每個(gè)處理器有1個(gè)內(nèi)部PP●可配置的共享外設(shè)中斷(SPI)的數(shù)量 GIC-400的BD如下圖所示,GIC-400從中斷輸入信號(hào)中檢測PPI和SPI。每個(gè)處理器的每個(gè)PPI中斷ID都有一個(gè)信號(hào)。每個(gè)SPI中斷ID只有一個(gè)輸入信號(hào),與SoC中處理器的數(shù)量無關(guān)。SGI沒有輸入信號(hào),在GIC-400中使用AXI編程接口生成。 ? ?2、輸入信號(hào) ? 上圖中左邊就是來自外設(shè)的interrupt source輸入信號(hào)。分成兩種類型,分別是PPI(Private Peripheral Interrupt)和SPI(Shared Peripheral Interrupt)。PPI中斷信號(hào)是CPU私有的,每個(gè)CPU都有其特定的PPI信號(hào)線。而SPI是所有CPU之間共享的。通過寄存器GICD_TYPER可以配置SPI的個(gè)數(shù)(最多480個(gè))。GIC-400支持多少個(gè)SPI中斷,其輸入信號(hào)線就有多少個(gè)SPI interrupt request signal。同樣的,通過寄存器GICD_TYPER也可以配置CPU interface的個(gè)數(shù)(最多8個(gè)),GIC-400支持多少個(gè)CPU interface,其輸入信號(hào)線就提供多少組PPI中斷信號(hào)線。一組PPI中斷信號(hào)線包括6個(gè)實(shí)際的signal: ? (1)nLEGACYIRQ信號(hào)線。對(duì)應(yīng)interrupt ID 31,在bypass mode下(這里的bypass是指bypass GIC functionality,直接連接到某個(gè)processor上),nLEGACYIRQ可以直接連到對(duì)應(yīng)CPU的nIRQCPU信號(hào)線上。在這樣的設(shè)置下,該CPU不參與其他屬于該CPU的PPI以及SPI中斷的響應(yīng),而是特別為這一根中斷線服務(wù)。 (2)nCNTPNSIRQ信號(hào)線。來自Non-secure physical timer的中斷事件,對(duì)應(yīng)interrupt ID 30。 (3)nCNTPSIRQ信號(hào)線。來自secure physical timer的中斷事件,對(duì)應(yīng)interrupt ID 29。 (4)nLEGACYFIQ信號(hào)線。對(duì)應(yīng)interrupt ID 28。概念與nLEGACYIRQ信號(hào)線相同。 (5)nCNTVIRQ信號(hào)線。對(duì)應(yīng)interrupt ID 27。Virtual Timer Event,和虛擬化相關(guān),這里不予描述。 (6)nCNTHPIRQ信號(hào)線。對(duì)應(yīng)interrupt ID 26。Hypervisor Timer Event,和虛擬化相關(guān),這里不予描述。 ?3、輸出信號(hào) 所謂輸出信號(hào),就是GIC和各個(gè)CPU直接的接口,這些接口包括: (a)觸發(fā)CPU中斷的信號(hào)。nIRQCPU和nFIQCPU信號(hào)線,主要用來觸發(fā)ARM CPU進(jìn)入IRQ mode和FIQ mode。 (b)Wake up信號(hào)。nFIQOUT和nIRQOUT信號(hào)線,協(xié)助ARM CPU的電源管理模塊,用來喚醒CPU。 (c)AXI slave interface signals。AXI(Advanced eXtensible Interface)是一種總線協(xié)議,屬于AMBA規(guī)范的一部分。通過這些信號(hào)線,ARM CPU可以和GIC硬件block進(jìn)行通信(例如寄存器訪問)。 4、觸發(fā)路徑 下面總結(jié)下SGI、PPI、SPI三種類型中斷的觸發(fā)路徑: SGI(ID0-ID15):是由CPU內(nèi)部軟件觸發(fā),所以從CPU CORE-->CPU interface-->Distributor-->CPU Interface-->CPU CORE。 PPI(ID16-ID31):是由外部器件觸發(fā),從Peripheral-->Distributor-->CPU interface-->CPU CORE。 SPI(ID32-ID1019):也是外部器件觸發(fā),從Peripheral-->Distributor-->CPU interface-->CPU CORE。 5、中斷狀態(tài)遷移圖 對(duì)于每一個(gè)中斷而言,有以下4個(gè)狀態(tài): inactive:中斷處于無效狀態(tài)。 pending:中斷處于有效狀態(tài),但是cpu沒有響應(yīng)該中斷。 active:cpu在響應(yīng)該中斷。 active and pending:cpu在響應(yīng)該中斷,但是該中斷源又發(fā)送中斷過來。 PS:對(duì)于電平觸發(fā)的中斷而言,一個(gè)中斷的處理階段也會(huì)有active and pending的階段,這是比較特殊的。 ? 下面是官方提供中斷遷移的條件和場景說明,要注意的是文中either表示轉(zhuǎn)移條件滿足其一即可: ? ?四、GIC400寄存器
1、GIC-400寄存器地圖 所有GIC-400寄存器都有短名稱。在這些名稱中,前三個(gè)字符是GIC,第四個(gè)字符表示 GIC-400 的功能塊:●GICD_ 分配器●GICC_ 中央處理器接口●GICH_ 虛擬接口控制塊●GICV_ 虛擬CPU接口。 GIC-400寄存器是內(nèi)存映射的,下表列出了地址范圍: ? 內(nèi)存映射的含義:對(duì)于ARM體系架構(gòu)而言,IO和內(nèi)存是統(tǒng)一編制,寄存器會(huì)占用內(nèi)存的地址范圍。至于GIC-400寄存器首地址映射在哪個(gè)內(nèi)存地址上,這是硬件廠商設(shè)計(jì),并通過CP15協(xié)處理器來獲取。 ?2、具體寄存器 下面解釋幾個(gè)經(jīng)典的寄存器,更多的寄存器請(qǐng)參考ARM出品的官方文檔。(1)GICD_CTRL寄存器 ?寄存器GICD_CTRL各個(gè)位的含義如下:-------------------------------------GICD_CTRL_reserved_0:保留。-------------------------------------EnableGrp1:Global enable for forwarding pending Group 1 interrupts from the Distributor to the CPU interfaces:-------------------------------------EnableGrp0:Global enable for forwarding pending Group 0 interrupts from the Distributor to the CPU interfaces:-------------------------------------個(gè)人見解:第一,EnableGrp1和EnableGrp0是全局開關(guān),第二,這是Distributor側(cè)的開關(guān),至于CPU interfaces側(cè)繼續(xù)參考其它寄存器。------------------------------------- (2)2 GICD_TYPER ?-------------------------------------GICD_TYPER_reserved_0:個(gè)人見解:保留字段,不使用-------------------------------------LSPI:If the GIC implements the Security Extensions, the value of this field is the maximum numberof implemented lockable SPIs, from 0 (0b00000) to 31 (0b11111), see Configuration lockdown on page 4-82. If this field is 0b00000 then the GIC does not implement configuration lockdown. If the GIC does not implement the Security Extensions, this field is reserved.個(gè)人見解:在不使能ARM安全體系的功能前提下,此處保留,安全體系的功能暫時(shí)不使用。-------------------------------------SecurityExtn:Indicates whether the GIC implements the Security Extensions.0 Security Extensions not implemented.1 Security Extensions implemented.個(gè)人見解:ARM安全體系的功能,使能后,0組和1組含義不一樣,具體需要另外篇幅來闡述-------------------------------------GICD_TYPER_reserved_1:-------------------------------------CPUNumber:Indicates the number of implemented CPU interfaces. The number of implemented CPUinterfaces is one more than the value of this field, for example if this field is 0b011, thereare four CPU interfaces. If the GIC implements the Virtualization Extensions, this is also the number of virtual CPU interfaces.個(gè)人見解:the number of implemented CPU interfaces = CPUNumber+1,域值是從0開始,含義卻是從1開始。-------------------------------------ITLinesNumber:Indicates the maximum number of interrupts that the GIC supports. If ITLinesNumber=N, the maximum number of interrupts is 32(N+1). The interrupt ID range is from 0 to (number of IDs - 1).For example: 0b00011 Up to 128 interrupt lines, interrupt IDs 0-127.The maximum number of interrupts is 1020 (0b11111). See the text in this section for more information. Regardless of the range of interrupt IDs defined by this field, interrupt IDs 1020-1023 are reserved for special purposes.個(gè)人見解:最大的中斷數(shù)量是32*(ITLinesNumber +1)------------------------------------- (3)GICD_IDDR ?-------------------------------------ProductID:個(gè)人見解:值0x020意味著GIC-400-------------------------------------GICD_IDDR_reserved_0:個(gè)人見解:reserved-------------------------------------Variant:An IMPLEMENTATION DEFINED variant number. Typically, this field is used to distinguishproduct variants, or major revisions of a product.個(gè)人見解:產(chǎn)品主版本號(hào),0x2代表版本為2.0-------------------------------------Revision:An IMPLEMENTATION DEFINED revision number. Typically, this field is used to distinguish minor revisions of a product.個(gè)人見解:產(chǎn)品小版本號(hào),0x1代表修訂版為r0p1。-------------------------------------Implementer:Contains the JEP106 code of the company that implemented the GIC Distributor:Bits [11:8] The JEP106 continuation code of the implementer. For an ARM implementation, this field is 0x4. Bits [7] Always 0. Bits [6:0] The JEP106 identity code of the implementer. For an ARM implementation, bits[7:0] are 0x3B.個(gè)人見解:實(shí)現(xiàn)CPU接口的公司代碼,0x43B代表ARM公司。------------------------------------- (4)GICD_IGROUPn_0 ?-------------------------------------Group_Status_Bits:The GICD_IGROUPR registers provide a status bit for each interrupt supported by the GIC.Each bit controls whether the corresponding interrupt is in Group 0 or Group 1. Accessible by Secure accesses Only.For each bit:0 The corresponding interrupt is Group 0.1 The corresponding interrupt is Group 1.For interrupt ID m, when DIV and MOD are the integer division and modulo operations:a. the corresponding GICD_IGROUPRn number, n, is given by n = m DIV 32b. the offset of the required GICD_IGROUPR is (0x080 + (4*n))c. the bit number of the required group status bit in this register is m MOD 32.個(gè)人見解:① 組狀態(tài)位,對(duì)于每個(gè)位:“0”表示相應(yīng)的中斷為Group 0;“1”表示相應(yīng)的中斷為Group 1。② 問:對(duì)于一個(gè)中斷,如何設(shè)置它的Group?答:首先找到對(duì)應(yīng)的GICD_IGROUPRn寄存器,即n是多少?還要確定使用這個(gè)寄存器里哪一位。對(duì)于interrtups ID m,如下計(jì)算:n = m DIV 32,GICD_IGROUPRn里的n就確定了;③ GICD_IGROUPRn在GIC內(nèi)部的偏移地址是多少?答:0x080+(4*n),這個(gè)信息是為了定位到具體寄存器。④ 使用GICD_IPRIORITYRn中哪一位來表示?答:bit = m mod 32。⑤ GICD_IGROUPn_0只是GICD_IGROUPn寄存器組的第一個(gè),總共有4個(gè)寄存器:GICD_IGROUPn_0到GICD_IGROUPn_3------------------------------------- (5)GICD_ISENABLER0 ?-------------------------------------Set_Enable_Bits:The GICD_ISENABLERs provide a Set-enable bit for each interrupt supported by the GIC. For SPIs and PPIs, each bit controls the forwarding of the corresponding interrupt from the Distributor to the CPU interfaces:Reads:0 Forwarding of the corresponding interrupt is disabled.1 Forwarding of the corresponding interrupt is enabled.Writes:0 Has no effect.1 Enables the forwarding of the corresponding interrupt.After a write of 1 to a bit, a subsequent read of the bit returns the value 1. For interrupt ID m, when DIV and MOD are the integer division and modulo operations:a.the corresponding GICD_ISENABLER number, n, is given by n = m DIV 32b.the offset of the required GICD_ISENABLER is (0x100 + (4*n))c.the bit number of the required Set-enable bit in this register is m MOD 32.個(gè)人見解:① 對(duì)于SPI和PPI類型的中斷,每一位控制對(duì)應(yīng)中斷的轉(zhuǎn)發(fā)行為:從Distributor轉(zhuǎn)發(fā)到CPU interface:讀:“0”表示當(dāng)前是禁止轉(zhuǎn)發(fā)的;“1”表示當(dāng)前是使能轉(zhuǎn)發(fā)的;寫:“0”表示無效;“1”表示使能轉(zhuǎn)發(fā)。 ② 對(duì)于一個(gè)中斷,如何找到GICD_ISENABLERn并確定相應(yīng)的位?答:對(duì)于interrtups ID m,如下計(jì)算:n = m DIV 32,GICD_ISENABLERn里的n就確定了;GICD_ISENABLERn在GIC內(nèi)部的偏移地址是多少?計(jì)算方法為0x100+(4*n),因?yàn)橐粋€(gè)寄存器大小為4個(gè)字節(jié)。使用GICD_ISENABLERn中哪一位來表示?計(jì)算方法為?bit = m mod 32。 ③ 這里的開關(guān)也是Distributor側(cè)的開關(guān),GICV硬件設(shè)計(jì)思想和軟件設(shè)計(jì)思想類似。④ GICD_ISENABLER0是此類寄存器組的第一個(gè),總共是4個(gè)。------------------------------------- (6)GICD_ICFGR0 ?-------------------------------------Int_Config:The GICD_ICFGRs provide a 2-bit Int_config field for each interrupt supported by the GIC.For Int_config[1], the most significant bit, bit [2F+1], the encoding is:0 Corresponding interrupt is level-sensitive.1 Corresponding interrupt is edge-triggered.Int_config[0], the least significant bit, bit [2F], reservedFor SGIs: Int_config[1] Not programmable, RAO/WI.For PPIs: Int_config[1] Not programmable, RAZ/WI.For SPIs: Int_config[1] this bit is programmable.A read of this bit always returns the correct value to indicate whether the corresponding interrupt is level-sensitive or edge-triggered.For interrupt ID m, when DIV and MOD are the integer division and modulo operations: a. the corresponding GICD_ICFGR number, n, is given by n = m DIV 16b. the offset of the required GICD_ICFGRn is (0xC00 + (4*n))c. the required Priority field in this register, F, is given by F = m MOD 16, where field 0 refers to register bits [1:0], field 1 refers to bits [3:2], up to field 15 that refers to bits [31:30].個(gè)人見解:對(duì)于每一個(gè)中斷,都有對(duì)應(yīng)的2位數(shù)據(jù)用來描述:它的邊沿觸發(fā),還是電平觸發(fā)。對(duì)于Int_config [1](即高位[2F + 1]),含義為:“0”表示相應(yīng)的中斷是電平觸發(fā);“1”表示相應(yīng)的中斷是邊沿觸發(fā)。對(duì)于Int_config [0],即低位[2F],是保留位,這一位就是以后才使用。-------------------------------------五、問題與建議
1、ARM芯片設(shè)計(jì)了FIQ和IRQ的2個(gè)處理模式,移植過程中沒有用到FIQ。 2、虛擬中斷相關(guān)的功能也沒有用到。 3、安全相關(guān)的中斷功能前期我們也沒有用到,后續(xù)在可信執(zhí)行環(huán)境中會(huì)用到。 4、如果代碼對(duì)中斷保護(hù)寫得不好的話,會(huì)出現(xiàn)Systick發(fā)生多次中斷,中斷狀態(tài)為active &pending,在移植過程中OpenHarmony版本不支持嵌套中斷。 5、中斷處理分為邊沿觸發(fā)處理和電平觸發(fā)處理。這就給我們不同的應(yīng)用功能提供了選擇,使得我們可以在不同個(gè)工作下選擇適合的模式,邊沿觸發(fā)適用于對(duì)時(shí)間要求高的,比如中斷中有計(jì)數(shù)之類的(GATE門控位置1時(shí)),而電平觸發(fā)則適合報(bào)警裝置。 6、在基于ARM的嵌入式應(yīng)用系統(tǒng)中,存儲(chǔ)系統(tǒng)通常是通過系統(tǒng)控制協(xié)處理器CP15完成的。ARM處理器使用協(xié)處理器15(CP15)的寄存器來控制cache、TCM和存儲(chǔ)器管理。CP15包含16個(gè)32位的寄存器,其編號(hào)為0~15,具體請(qǐng)參考ARM官方文檔。 7、givc2將中斷分成了group0和group1,默認(rèn)情況下,所有中斷都是組0中斷,并使用IRQ向連接的處理器發(fā)送信號(hào)中斷請(qǐng)求。個(gè)人理解如果都改為組1也是沒有問題的,但是沒有驗(yàn)證。 8、GIC-400通用初始化流程: (1)設(shè)置distributor和CPU interface寄存器組的基地址; (2)讀取GICD_TYPER寄存器,計(jì)算當(dāng)前GIC最大支持多少個(gè)中斷源; (3)初始化distributor: a.disable distributor; b.設(shè)置中斷分組; c.設(shè)置SPI中斷的路由; d.設(shè)置SPI中斷的觸發(fā)類型; e.disactive和disable所有中斷源; f.enable distributor; (4)初始化CPU Interface: a.設(shè)置GIC_CPU_PRIMASK,設(shè)置中斷優(yōu)先級(jí)mask level; b.enable CPU interface;六、總結(jié)
本篇文章從GIC控制器概述、GIC400原理、GIC400寄存器等方面介紹了OpenHarmony內(nèi)核之基礎(chǔ)硬件——中斷控制器GIC400的內(nèi)容,希望開發(fā)者能從中學(xué)有所獲,學(xué)以致用。關(guān)于OpenHarmony內(nèi)核的內(nèi)容,之前我還介紹了內(nèi)核對(duì)象隊(duì)列的算法、OpenHarmony LiteOS-M內(nèi)核事件的運(yùn)作機(jī)制,以及內(nèi)核IPC機(jī)制數(shù)據(jù)結(jié)構(gòu)、OpenHarmony Liteos-A內(nèi)核之iperf3移植方法,感興趣的讀者可以點(diǎn)擊閱讀:《OpenHarmony——內(nèi)核對(duì)象隊(duì)列之算法詳解(上)》、《OpenHarmony——內(nèi)核對(duì)象隊(duì)列之算法詳解(下)》、《OpenHarmony——內(nèi)核對(duì)象事件之源碼詳解》、《OpenHarmony——內(nèi)核IPC機(jī)制數(shù)據(jù)結(jié)構(gòu)解析》、《OpenHarmony Liteos_A內(nèi)核之iperf3移植心得》。
原文標(biāo)題:淺談OpenHarmony LiteOS-A內(nèi)核之基礎(chǔ)硬件——中斷控制器GIC400
文章出處:【微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
OpenHarmony
+關(guān)注
關(guān)注
25文章
3635瀏覽量
16061
原文標(biāo)題:淺談OpenHarmony LiteOS-A內(nèi)核之基礎(chǔ)硬件——中斷控制器GIC400
文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論