大家好,我是ST。
今天主要和大家聊一聊,如何使用高端芯片的中斷系統的方法。
第一:中斷的基本簡介
中斷系統是一個處理器重要的組成部分,中斷系統極大的提高了CPU的中斷執行效率。芯片本身也有中斷向量表,中斷向量表也是在代碼的最前面。A7內核有8個異常中斷,這8個異常中斷的中斷向量表如圖:
中斷向量表中都是中斷服務函數的入口地址,因此芯片有什么中斷都是可以從中斷向量表中看出來的。難道A7系列只有7個中斷嗎?顯然是不可能的。A內核的CPU所有的外部中斷都屬于這個IRQ中斷,當任意一個外部中斷發生的時候都觸發這個IRQ中斷。在IRQ中斷服務函數里面就可以讀取指定的寄存器來判斷發生的具體是什么中斷,進而根據具體的中斷做出相應的處理。
在左側都是Software0_IRQn~PMU_IRQ2_IRQ都是外設IRQ中斷,中斷任意一個發生的時候IRQ中斷都會被觸發,需要在IRQ中斷服務函數中判斷究竟是哪個中斷發生了,然后再做出具體的處理。
常用的復位中斷和IRQ中斷,需要編寫這兩個中斷的中斷服務函數,稍后會講解如何編寫對應的中斷服務函數。首先要來編寫中斷向量表:
.global _start _start: ldrpc,=Reset_Handler/*復位中斷 ldr pc, =Undefined_Handler /* 未定義指令中斷 */ ldrpc,=SVC_Handler/*SVC(Supervisor)中斷*/ ldrpc,=PrefAbort_Handler/*預取終止中斷*/ ldrpc,=DataAbort_Handler/*數據終止中斷*/ ldrpc,=NotUsed_Handler/*未使用中斷*/ ldrpc,=IRQ_Handler/*IRQ中斷*/ ldrpc,=FIQ_Handler/*FIQ(快速中斷)未定義中斷*/ /* 復位中斷 */ Reset_Handler: /*復位中斷具體處理過程*/ /*未定義中斷*/ Undefined_Handler: ldrr0,=Undefined_Handler bxr0 /*SVC中斷*/ SVC_Handler: ldrr0,=SVC_Handler bxr0 /*預取終止中斷*/ PrefAbort_Handler: ldrr0,=PrefAbort_Handler bxr0 /*數據終止中斷*/ DataAbort_Handler: ldrr0,=DataAbort_Handler bxr0 /*未使用的中斷*/ NotUsed_Handler: ldrr0,=NotUsed_Handler bxr0 /* IRQ 中斷!重點!!!!!*/ IRQ_Handler: /*復位中斷具體處理過程*/ /*FIQ中斷*/ FIQ_Handler: ldrr0,=FIQ_Handler bxr0
中斷服務函數都是用匯編編寫的,我們實際需要編寫的只有復位中斷服務函數 Reset_Handler 和 IRQ 中斷服務函數 IRQ_Handler,其它的中斷沒有用到,所以都是死循環。
GIC是ARM公司給Cortex-A內核提供的一個中斷控制器,類似Cortex-M內核中的NVIC。目前有4個版本:V1~V4,V1是最老的版本,已經廢棄。GIC V2 是給 ARMv7-A 架構使用的,比如 Cortex-A7、Cortex-A9、Cortex-A15 等,V3 和 V4 是給 ARMv8-A/R 架構使用的,也就是 64 位芯片使用的。GIC V2 最多支持 8 個核。ARM 會根據 GIC 版本的不同研發出不同的 IP 核,那些半導體廠商直接購買對應的 IP 核即可,比如 ARM 針對 GIC V2 就開發出了 GIC400 這個中斷控制器 IP 核。當 GIC 接收到外部中斷信號以后就會報給 ARM 內核,但是ARM 內核只提供了四個信號給 GIC 來匯報中斷情況:VFIQ、VIRQ、FIQ和IRQ,他們之間關系如圖。
GIC接收眾多的外部中斷,然后對其處理,最終就只通過四個信號報給ARM內核,這四個信號的含義如下:
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),軟件中斷,由軟件觸發引起的中斷,通過向寄存器GICD_SGIR 寫入數據來觸發,系統會使用 SGI 中斷來完成多核之間的通信。
總結:高端芯片中斷系統非常復雜,分析到這里還有很多細節沒有分析,等到下回分解,感興趣的可以研究一下。中斷系統對后面靈活使用功能非常有用。
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
19160瀏覽量
229115 -
中斷系統
+關注
關注
1文章
96瀏覽量
61006 -
高端芯片
+關注
關注
0文章
23瀏覽量
3755
原文標題:高端芯片中中斷系統的基本操作方法
文章出處:【微信號:嵌入式開發愛好者,微信公眾號:嵌入式開發愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論