Cortex-M3內核的異常處理機制及其新技術研究
引言
本文引用地址:http://www.j9360.com/article/170513.htmCortexM3是ARM公司第一款基于ARMv7M的微控制器內核,在指令執行、異常控制、時鐘管理、跟蹤調試和存儲保護等方面相對于 ARM7有很大的區別。尤其在異常處理機制方面有很大的改進,其異常響應只需要12個時鐘周期。NVIC(Nested Vectored Interrupt Controller,嵌套向量中斷控制器)是CortexM3處理器的一個緊耦合部件,可以配置1~240個帶有256個優先級、8級搶占優先權的物理中斷,為處理器提供出色的異常處理能力[1].同時,搶占(preMemption)、尾鏈(tailMchaining)、遲到 (lateMarriving)技術的使用,大大縮短了異常事件的響應時間。
異常或者中斷是處理器響應系統中突發事件的一種機制。當異常發生時,CortexM3通過硬件自動將編程計數器(PC)、編程狀態寄存器(xPSR)、鏈接寄存器(LR)和R0~R3、R12等寄存器壓進堆棧。在Dbus(數據總線)保存處理器狀態的同時,處理器通過Ibus(指令總線)從一個可以重新定位的向量表中識別出異常向量,并獲取ISR函數的地址,也就是保護現場與取異常向量是并行處理的。一旦壓棧和取指令完成,中斷服務程序或故障處理程序就開始執行。執行完ISR,硬件進行出棧操作,中斷前的程序恢復正常執行。圖1為CortexM3處理器的異常處理流程[2].

圖1 CortexM3異常處理流程
1 CortexM3異常類型
同ARM7相比,CortexM3在異常的分類和優先級上有很大的差異,如表1所列。

表1CortexM3異常類型及優先級
CortexM3將異常分為復位、不可屏蔽中斷、硬故障、存儲管理、總線故障和應用故障、SVcall、調試監視異常、PendSV、 SysTick以及外部中斷等。CortexM3采用向量表來確定異常的入口地址。與大多數其他ARM內核不同,CortexM3向量表中包含異常處理程序和ISR的地址,而不是指令。復位處理程序的初始堆棧指針和地址必須分別位于0x0和0x4.這些值在隨后的復位中被加載到適當的CPU寄存器中。向量表偏移控制寄存器將向量表定位在CODE(Flash)或SRAM中。復位時,默認情況下為CODE模式,但可以重新定位。異常被接受后,處理器通過 Ibus查表獲取地址,執行異常處理程序。
在CortexM3的優先級分配中,較低的優先級值具有較高的優先級。NVIC將異常的優先級分成兩部分:搶占優先級(preMemption priority)部分和子優先級(subMpriority)部分,可以通過中斷申請/復位控制寄存器來確定兩個部分所占的比例。搶占優先級和子優先級共同作用確定了異常的優先級。搶占優先級用于決定是否發生搶占,一個異常只有在搶占優先級高于另一個異常的搶占優先級時才能發生搶占。當多個掛起異常具有相同的搶占優先級時,子優先級起作用[3].通過NVIC設置的優先級權限高于硬件默認優先級。當有多個異常具有相同的優先級時,則比較異常號的大小,異常號小的被優先激活。
2 CortexM3異常處理
2.1 異常的進入
當一個異常出現以后,CortexM3處理器由硬件通過Dbus保存處理器狀態,同時通過Ibus讀取向量表中的SP,更新PC和LR,執行中斷服務子程序。
為了應對堆棧操作階段到來后的更高優先級異常,CortexM3支持遲到和搶占機制,以便對各種可能事件做出確定性的響應。
搶占是一種對更高優先級異常的響應機制。CortexM3異常搶占的處理過程[2] 如圖2所示。當新的更高優先級異常到來時,處理器打斷當前的流程,執行更高優先級的異常操作,這樣就發生了異常嵌套。遲到是處理器用來加速搶占的一種機制。如果一個具有更高優先級的異常在上一個異常執行壓棧期間到達,則處理器保存狀態的操作繼續執行,因為被保存的狀態對于兩個異常都是一樣的。但是,NVIC馬上獲取的是更高優先級的異常向量地址。這樣在處理器狀態保存完成后,開始執行高優先級異常的ISR.

圖2 異常搶占流程
評論