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