大家好,我是ST。
今天主要和大家聊一聊,如何使用高端芯片的中斷系統(tǒng)的方法。
第一:中斷的基本簡介
中斷系統(tǒng)是一個處理器重要的組成部分,中斷系統(tǒng)極大的提高了CPU的中斷執(zhí)行效率。芯片本身也有中斷向量表,中斷向量表也是在代碼的最前面。A7內(nèi)核有8個異常中斷,這8個異常中斷的中斷向量表如圖:
中斷向量表中都是中斷服務(wù)函數(shù)的入口地址,因此芯片有什么中斷都是可以從中斷向量表中看出來的。難道A7系列只有7個中斷嗎?顯然是不可能的。A內(nèi)核的CPU所有的外部中斷都屬于這個IRQ中斷,當(dāng)任意一個外部中斷發(fā)生的時候都觸發(fā)這個IRQ中斷。在IRQ中斷服務(wù)函數(shù)里面就可以讀取指定的寄存器來判斷發(fā)生的具體是什么中斷,進而根據(jù)具體的中斷做出相應(yīng)的處理。
在左側(cè)都是Software0_IRQn~PMU_IRQ2_IRQ都是外設(shè)IRQ中斷,中斷任意一個發(fā)生的時候IRQ中斷都會被觸發(fā),需要在IRQ中斷服務(wù)函數(shù)中判斷究竟是哪個中斷發(fā)生了,然后再做出具體的處理。
常用的復(fù)位中斷和IRQ中斷,需要編寫這兩個中斷的中斷服務(wù)函數(shù),稍后會講解如何編寫對應(yīng)的中斷服務(wù)函數(shù)。首先要來編寫中斷向量表:
.global _start _start: ldrpc,=Reset_Handler/*復(fù)位中斷 ldr pc, =Undefined_Handler /* 未定義指令中斷 */ ldrpc,=SVC_Handler/*SVC(Supervisor)中斷*/ ldrpc,=PrefAbort_Handler/*預(yù)取終止中斷*/ ldrpc,=DataAbort_Handler/*數(shù)據(jù)終止中斷*/ ldrpc,=NotUsed_Handler/*未使用中斷*/ ldrpc,=IRQ_Handler/*IRQ中斷*/ ldrpc,=FIQ_Handler/*FIQ(快速中斷)未定義中斷*/ /* 復(fù)位中斷 */ Reset_Handler: /*復(fù)位中斷具體處理過程*/ /*未定義中斷*/ Undefined_Handler: ldrr0,=Undefined_Handler bxr0 /*SVC中斷*/ SVC_Handler: ldrr0,=SVC_Handler bxr0 /*預(yù)取終止中斷*/ PrefAbort_Handler: ldrr0,=PrefAbort_Handler bxr0 /*數(shù)據(jù)終止中斷*/ DataAbort_Handler: ldrr0,=DataAbort_Handler bxr0 /*未使用的中斷*/ NotUsed_Handler: ldrr0,=NotUsed_Handler bxr0 /* IRQ 中斷!重點!!!!!*/ IRQ_Handler: /*復(fù)位中斷具體處理過程*/ /*FIQ中斷*/ FIQ_Handler: ldrr0,=FIQ_Handler bxr0
中斷服務(wù)函數(shù)都是用匯編編寫的,我們實際需要編寫的只有復(fù)位中斷服務(wù)函數(shù) Reset_Handler 和 IRQ 中斷服務(wù)函數(shù) IRQ_Handler,其它的中斷沒有用到,所以都是死循環(huán)。
第二:GIC控制器介紹
GIC是ARM公司給Cortex-A內(nèi)核提供的一個中斷控制器,類似Cortex-M內(nèi)核中的NVIC。目前有4個版本:V1~V4,V1是最老的版本,已經(jīng)廢棄。GIC V2 是給 ARMv7-A 架構(gòu)使用的,比如 Cortex-A7、Cortex-A9、Cortex-A15 等,V3 和 V4 是給 ARMv8-A/R 架構(gòu)使用的,也就是 64 位芯片使用的。GIC V2 最多支持 8 個核。ARM 會根據(jù) GIC 版本的不同研發(fā)出不同的 IP 核,那些半導(dǎo)體廠商直接購買對應(yīng)的 IP 核即可,比如 ARM 針對 GIC V2 就開發(fā)出了 GIC400 這個中斷控制器 IP 核。當(dāng) GIC 接收到外部中斷信號以后就會報給 ARM 內(nèi)核,但是ARM 內(nèi)核只提供了四個信號給 GIC 來匯報中斷情況:VFIQ、VIRQ、FIQ和IRQ,他們之間關(guān)系如圖。
GIC接收眾多的外部中斷,然后對其處理,最終就只通過四個信號報給ARM內(nèi)核,這四個信號的含義如下:
VFIQ:虛擬快速 FIQ。VIRQ:虛擬外部 IRQ。FIQ:快速中斷 IRQ。IRQ:外部中斷 IRQ。VFIQ 和 VIRQ 是針對虛擬化的,我們不討論虛擬化,剩下的就是 FIQ 和 IRQ 了。
GIC將眾多的中斷源分為三類:
①、SPI(Shared Peripheral Interrupt),共享中斷,顧名思義,所有 Core 共享的中斷,這個是最常見的,那些外部中斷都屬于 SPI 中斷(注意!不是 SPI 總線那個中斷) 。比如按鍵中斷、串口中斷等等,這些中斷所有的 Core 都可以處理,不限定特定 Core。
②、PPI(Private Peripheral Interrupt),私有中斷,我們說了 GIC 是支持多核的,每個核肯定有自己獨有的中斷。這些獨有的中斷肯定是要指定的核心處理,因此這些中斷就叫做私有中斷。
③、SGI(Software-generated Interrupt),軟件中斷,由軟件觸發(fā)引起的中斷,通過向寄存器GICD_SGIR 寫入數(shù)據(jù)來觸發(fā),系統(tǒng)會使用 SGI 中斷來完成多核之間的通信。
總結(jié):高端芯片中斷系統(tǒng)非常復(fù)雜,分析到這里還有很多細節(jié)沒有分析,等到下回分解,感興趣的可以研究一下。中斷系統(tǒng)對后面靈活使用功能非常有用。
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19899瀏覽量
235421 -
中斷系統(tǒng)
+關(guān)注
關(guān)注
1文章
96瀏覽量
61408 -
高端芯片
+關(guān)注
關(guān)注
0文章
23瀏覽量
3878
原文標(biāo)題:高端芯片中中斷系統(tǒng)的基本操作方法
文章出處:【微信號:嵌入式開發(fā)愛好者,微信公眾號:嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
GPIO引腳操作方法概述
EWB的基本操作方法

評論