Cortex-M3的異常處理機(jī)制研究
出處:方安平,蔡俊宇 發(fā)布于:2012-05-22 16:04:56
摘要 詳細(xì)闡述CortexM3異常的分類、優(yōu)先級(jí)、進(jìn)入和退出,以及在CortexM3異常處理機(jī)制中使用的新技術(shù)--遲到(latearriving)和尾鏈(tailchaining);,比較CortexM3和ARM7異常控制機(jī)制的區(qū)別,并量化分析遲到和尾鏈技術(shù)在異常處理中的優(yōu)越性。
引言
CortexM3是ARM公司款基于ARMv7M的微控制器內(nèi)核,在指令執(zhí)行、異??刂?、時(shí)鐘管理、跟蹤調(diào)試和存儲(chǔ)保護(hù)等方面相對于 ARM7有很大的區(qū)別。尤其在異常處理機(jī)制方面有很大的改進(jìn),其異常響應(yīng)只需要12個(gè)時(shí)鐘周期。NVIC(Nested Vectored Interrupt Controller,嵌套向量中斷控制器)是CortexM3處理器的一個(gè)緊耦合部件,可以配置1~240個(gè)帶有256個(gè)優(yōu)先級(jí)、8級(jí)搶占優(yōu)先權(quán)的物理中斷,為處理器提供出色的異常處理能力[1].同時(shí),搶占(preemption)、尾鏈(tailchaining)、遲到 (latearriving)技術(shù)的使用,大大縮短了異常事件的響應(yīng)時(shí)間。
異?;蛘咧袛嗍翘幚砥黜憫?yīng)系統(tǒng)中突發(fā)事件的一種機(jī)制。當(dāng)異常發(fā)生時(shí),CortexM3通過硬件自動(dòng)將編程計(jì)數(shù)器(PC)、編程狀態(tài)寄存器(xPSR)、鏈接寄存器(LR)和R0~R3、R12等寄存器壓進(jìn)堆棧。在Dbus(數(shù)據(jù)總線)保存處理器狀態(tài)的同時(shí),處理器通過Ibus(指令總線)從一個(gè)可以重新定位的向量表中識(shí)別出異常向量,并獲取ISR函數(shù)的地址,也就是保護(hù)現(xiàn)場與取異常向量是并行處理的。一旦壓棧和取指令完成,中斷服務(wù)程序或故障處理程序就開始執(zhí)行。執(zhí)行完ISR,硬件進(jìn)行出棧操作,中斷前的程序恢復(fù)正常執(zhí)行。圖1為CortexM3處理器的異常處理流程[2].

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

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

圖2 異常搶占流程
2.2 異常的返回
CortexM3異常返回的操作[2]如圖3所示。當(dāng)從異常中返回時(shí),處理器可能會(huì)處于以下情況之一[4]:
◆ 尾鏈到一個(gè)已掛起的異常,該異常比棧中所有異常的優(yōu)先級(jí)都高;
◆ 如果沒有掛起的異常,或是棧中優(yōu)先級(jí)的異常比掛起的優(yōu)先級(jí)異常具有更高的優(yōu)先級(jí),則返回到近一個(gè)已壓棧的ISR;
◆ 如果沒有異常已經(jīng)掛起或位于棧中,則返回到Tread模式。
為了應(yīng)對異常返回階段可能遇到的新的更高優(yōu)先級(jí)異常,CortexM3支持完全基于硬件的尾鏈機(jī)制,簡化了激活的和未決的異常之間的移動(dòng),能夠在兩個(gè)異常之間沒有多余的狀態(tài)保存和恢復(fù)指令的情況下實(shí)現(xiàn)backtoback處理。尾鏈發(fā)生的2個(gè)條件[2]:異常返回時(shí)產(chǎn)生了新的異常;掛起的異常的優(yōu)先級(jí)比所有被壓棧的異常的優(yōu)先級(jí)都高。
尾鏈發(fā)生后,CortexM3處理過程如圖3中尾鏈分支所示。這時(shí),CortexM3處理器終止正在進(jìn)行的出棧操作并跳過新異常進(jìn)入時(shí)的壓棧操作,同時(shí)通過Ibus立即取出掛起異常的向量。在退出前一個(gè)ISR返回操作6個(gè)周期后,開始執(zhí)行尾鏈的ISR.

圖3 異常的返回
3 CortexM3和ARM7中斷控制器比較
在過去的十年中,基于ARMv4的ARM7系列微控制器廣泛應(yīng)用在各個(gè)領(lǐng)域。在ARM7系列中,并沒有對中斷進(jìn)行獨(dú)立的服務(wù),而是通過犧牲處理器一定的性能來換取有效的中斷響應(yīng)和中斷處理機(jī)制。CortexM3高度耦合的NVIC可以實(shí)現(xiàn)硬件中斷處理,同時(shí)支持遲到和尾鏈機(jī)制,加快了異常響應(yīng)的速度,充分發(fā)揮了處理器的性能。
圖4 為CorexM3和ARM7在中斷控制器結(jié)構(gòu)方面的差異。
比較可知,NVIC是直接作為CortexM3處理器的一部分,集成在處理器核內(nèi)部;而VIC只是游離在ARM7內(nèi)核的外圍,這樣就必然占用內(nèi)核資源,影響了處理速度。CortexM3和ARM7中斷控制器在功能和實(shí)現(xiàn)方式上的差異如表2所列。

圖4 CortexM3和ARM7中斷控制器結(jié)構(gòu)的差異
表2 CortexM3和ARM7中斷控制器功能和實(shí)現(xiàn)方式的差異

3.1 處理器響應(yīng)單個(gè)異常
CortexM3和ARM7異常處理過程如圖5所示。

圖5 CortexM3和ARM7異常處理過程
ARM7處理器的異常開銷:

CortexM3處理器的異常開銷:

其中,TARM7為ARM7處理異常的時(shí)間開銷;TARM7_PUSH和TARM7_POP為ARM7進(jìn)行壓棧和出棧的操作時(shí)間;TCoretxM3為CortexM3處理異常的時(shí)間開銷;TM3_PUSH和TM3_POP為CortexM3進(jìn)行壓棧和出棧的操作時(shí)間。
可見,由于采用處理器狀態(tài)硬件保存,CortexM3處理器少用了18周期,節(jié)省了42.8%的異常開銷。
3.2 處理器響應(yīng)遲到異常
CortexM3和ARM7在處理遲到高優(yōu)先級(jí)異常時(shí)的差異如圖6所示。
當(dāng)IRQ2正在為執(zhí)行ISR2保存處理器狀態(tài)時(shí),遲到了一個(gè)優(yōu)先級(jí)更高的異常IRQ1.這時(shí)ARM7繼續(xù)進(jìn)行壓棧操作。在壓棧操作完成后,ARM7繼續(xù)為執(zhí)行ISR1進(jìn)行壓棧操作,然后執(zhí)行ISR1.其實(shí),兩次壓棧操作所保存的內(nèi)容是一樣的。因此,CortexM3對這個(gè)階段的操作進(jìn)行了優(yōu)化,引進(jìn)了遲到異常技術(shù),只進(jìn)行的壓棧操作。并且在ISR1執(zhí)行完成之后,CortexM3沒有進(jìn)行出棧操作,而是通過一個(gè)6周期的尾鏈,直接進(jìn)入ISR2的執(zhí)行。

圖6 NVIC對遲到的具有更高優(yōu)先級(jí)異常的響應(yīng)
在上面的例子中,ARM7處理器的異常開銷:

CortexM3處理器的異常開銷:

其中,TARM7_later和TM3_later分別為ARM7和CortexM3處理遲到異常所用的時(shí)間開銷;Ttailchaining為CortexM3處理尾鏈所用的時(shí)間。
通過計(jì)算可以看出,CortexM3少用了44周期,節(jié)省65%的異常開銷。
3.3 處理器處理backtoback異常
若一個(gè)新的異常在上一個(gè)異常寄存器出棧時(shí)到來,ARM7和CortexM3的處理方式也有很大不同。CortexM3和ARM7在處理 backtoback異常時(shí)的差異如圖7所示。ARM7繼續(xù)當(dāng)前的出棧操作,在出棧操作完成后,處理器為執(zhí)行ISR2進(jìn)行壓棧操作,然后執(zhí)行 ISR2.其實(shí),這時(shí)候處理器出棧和壓棧的內(nèi)容是一致的。CortexM3同樣優(yōu)化了這個(gè)階段的操作,引進(jìn)了尾鏈機(jī)制。當(dāng)IRQ2到來時(shí),CortexM3立即中止已經(jīng)進(jìn)行了8個(gè)周期的出棧操作,轉(zhuǎn)而進(jìn)行尾鏈操作,然后執(zhí)行ISR2.

圖7 NVIC搶占出棧
在處理backtoback異常時(shí),ARM7處理器用在ISR1到ISR2轉(zhuǎn)換的異常開銷:

CortexM3處理器用在ISR1到ISR2轉(zhuǎn)換的異常開銷:

其中,TARM_btb和TM3_btb分別為ARM7和CortexM3處理backtoback異常轉(zhuǎn)換所用的時(shí)間開銷;Tcancel為發(fā)生尾鏈時(shí)CortexM3已用于狀態(tài)恢復(fù)的時(shí)間。
通過計(jì)算可以看出,CortexM3少用了28周期。其實(shí),CortexM3處理器用在ISR1到ISR2轉(zhuǎn)換的異常開銷可以優(yōu)化到只用6個(gè)周期, 這樣就極大地提高了backtoback異常的響應(yīng)能力。
結(jié)語
本文闡述了CortexM3處理器的異常處理機(jī)制。通過和ARM7進(jìn)行比較,量化分析了CortexM3在異常處理方面的優(yōu)勢,對工程師使用CortexM3的異常處理會(huì)有一定參考和幫助。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實(shí)踐指南2026/1/6 10:40:19
- 嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計(jì)實(shí)踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時(shí)代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識(shí)2025/7/14 16:59:04
- PCB電源完整性(PI)設(shè)計(jì)核心實(shí)操規(guī)范
- 多層PCB疊層設(shè)計(jì)核心實(shí)操規(guī)范
- 提高M(jìn)OSFET效率的電路優(yōu)化方法
- 電源管理IC在智能家居中的應(yīng)用
- 差分信號(hào)連接器設(shè)計(jì)要點(diǎn)
- PCB焊盤與過孔設(shè)計(jì)核心實(shí)操規(guī)范(含可焊性與可靠性保障)
- 汽車電子常用電子元器件選型指南
- MOSFET驅(qū)動(dòng)與隔離方案設(shè)計(jì)
- 高溫環(huán)境下電源IC選型建議
- 安防監(jiān)控設(shè)備連接器應(yīng)用分析









