ARM架构——面试了菊厂,中兴,MTK,鼎桥,总结了ARM Cortex-M3中断
一、中斷和異常概述
中斷和異常的作用是指示系統中的某個地方發生一些事件,需要引起處理器(包括正在執行中的程序和任務)的注意.。當中斷和異常發生時,典型的結果是迫使處理器將控制從當前正在執行的程序或任務轉移到另一個歷程或任務中去。該例程叫做中斷處理程序,或者異常處理程序。如果是一個任務,則發生任務切換。
ARM架構的中斷就是異常的一種,它一般由外設或外部輸入產生,也可軟件觸發。中斷的異常處理也被稱作中斷服務程序(ISR)。
二、Cortex-M3處理器中的嵌套向量中斷控制器(NVIC)
本產品選用STM32L1系列單片機其處理器為Cortex-M3,在Cortex-M3處理器中存在一個嵌套向量中斷控制器(NVIC)的中斷控制器,它是可編程的且寄存器經過存儲器映射,NVIC支持可編程中斷優先級的數量。NVIC的地址是固定的且NVIC的編程模板與目前Cortex-M系列處理器都是一樣的。
NVIC還支持多個系統異常,包括不可屏蔽中斷(NMI)和處理器內部其他異常源。
嵌套向量中斷控制器(NVIC)特性:
詳細系統異常如下表:
中斷類型如下表:
?上面兩個表詳細闡述了異常/中斷的編號、類型、優先級狀態和具體的作用。
上圖可知NVIC可以處理多個中斷請求(IRQ)和一個不可屏蔽中斷(NMI)請求,IRQ可由片上外設或外部中斷輸入通過I/O端口產生,NMI可由看門狗和掉電檢測。處理器自身也是一個中斷和異常源,比如處理器內部SysTick(系統節拍)定時器周期性產生中斷或者系統錯誤事件狀態。注:在Cortex-M3和Cortex-M4中斷等待只有12個周期。
NVIC可以處理多種類型的中斷源:
- 脈沖中斷請求。中斷請求至少持續一個時鐘周期,NVIC會在收到該中斷時,掛起狀態保持到中斷得到處理。
- 電平觸發中斷請求。中斷得到處理前需要將中斷源請求保持為高。
注:NVIC輸入信號為高電平有效,實際外部中斷輸入設計會有所不同,片上系統邏輯會轉換為有效高電平信號。
異常/中斷入口:Cortex-M處理器會痛存儲器的向量表中自動定位異常處理入口。
異常/中斷搶占:每個異常都有優先級,當異常產生是MVIC會將輸入異常優先級與當前運行任務優先級相比較,若新異常優先級較高,當前任務暫停,相關寄存器保存在??臻g,處理器開始處理新異常,當處理完成后,異常返回終止操作,處理器自動從棧恢復寄存器內容,并執行之前暫停任務。
中斷屏蔽:NVIC有許多中斷屏蔽寄存器。例如PRIMASK寄存器禁止除HardFault和NMI外所有異常;BASEPRI寄存器屏蔽低于特定優先級的異常或中斷。
根據上圖分析實際中異常/中斷類型,NMI外設一般是看門狗或者掉電檢測,IRQ外設一般是芯片自帶ADC,DAC,比較器等,IRQ的I/O端口一般是外部芯片或者外圍硬件電路產生的信號,SysTick(系統節拍)定時器產生中斷用于有OS的芯片進行任務調度。
外設或I/O端口產生中斷需要處理器處理服務流程如下:
面經:
1.異常與中斷之間的關系。
2.記住三個優先級最高的異常:復位(最高),NMI(第二)和硬件錯誤(第三)。
3.外設或I/O端口產生中斷后,處理器接收到的處理流程。
4.中斷源的信號類型:電平觸發(高電平還是低電平?),脈沖觸發(觸發中斷需要多少時間?),
?三、優先級
在使用中斷之前一般進行以下操作:
Cortex-M3優先級配置寄存器為8位寬具有3個固定最高優先級(詳見異常列表:復位,NMI,硬件錯誤)和256個可編程優先級(最多有128個搶占等級),但是實際可編程優先級數量遠遠低于256個,優先級越多會增加NVIC復雜度而且會增加功耗(增加邏輯門數)。優先級寄存器一般是高位有效(MSB),這樣方便芯片間移植應用程序。
搶占等級劃分:
優先級配置寄存器有8位寬為什么只有128個搶占等級?如下表所示:
優先級配置寄存器分為:搶占優先級和子優先級,從表中可以看出搶占優先級域最大只有7位,所以只有128個搶占優先級。因此在處理器判斷如何執行中斷時先判斷搶占優先級,如果搶占優先級相同再判斷子優先級。?
面經:
1.中斷初始化流程
2.可編程優先級個數?為什么這么多個?
3.搶占優先級(組優先級)與子優先級關系?搶占等級多少個?為什么搶占優先級有這么多個?
4.搶占優先級與子優先級哪個優先級更高?
四、向量表重定位
默認向量表地址從0開始。向量地址則為異常編號乘以4,向量表如下所示:
在CMSIS庫中給SCB->VTOR賦予新地址進行重定位。
注:向量表基地址必須為下一個大小為2的整數次方
面經:
1.知道有向量表這個概念
2.向量表能否重定位?怎么定位?基地址有什么要求?
?五、HAL庫中斷開發示例
設置中斷流程三部曲:
HAL庫代碼示例:
/*初始化端口操作這里不贅述*/
/*第一個參數:設置中斷號,需要查詢IO端口或者外設的中斷號,
第二個參數:搶占優先級
第三個參數:子優先級*/
HAL_NVIC_SetPriority( EXTI0_IRQn, 6, 0 );
/*使能該中斷號*/
HAL_NVIC_EnableIRQ( EXTI0_IRQn );
注:HAL庫將設置搶占優先級和子優先級封裝為一個接口,代碼就縮減為兩行代碼。
?
總結
以上是生活随笔為你收集整理的ARM架构——面试了菊厂,中兴,MTK,鼎桥,总结了ARM Cortex-M3中断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Class_fileAndroid应用调
- 下一篇: Hadoop环境搭建