異常處理的基本術(shù)語
中斷搶占 Preemption
如果異常的優(yōu)先級(jí)高于當(dāng)前執(zhí)行優(yōu)先級(jí),則可以先發(fā)制人當(dāng)前執(zhí)行。 當(dāng)一個(gè)異常優(yōu)先于另一個(gè)異常時(shí),這些異常被稱為嵌套異常。
中斷返回 Return
當(dāng)異常處理程序完成時(shí),就會(huì)發(fā)生這種情況。 處理器彈出堆棧,并將處理器狀態(tài)恢復(fù)到中斷發(fā)生前的狀態(tài)。
末尾連續(xù)中斷 Tail-chaining
這種機(jī)制加快了異常服務(wù)。在異常處理程序完成后或返回操作期間,如果有符合異常輸入要求的掛起異常,則跳過堆棧彈出,控制直接傳輸?shù)叫碌漠惓L幚沓绦颉?/p>
遲到中斷 Late arriving interrupts
這種機(jī)制可以有效的提高高優(yōu)先級(jí)搶占中斷速度。如果在為上一個(gè)異常保存狀態(tài)期間發(fā)生更高優(yōu)先級(jí)異常,處理器將切換以處理高優(yōu)先級(jí)異常,并啟動(dòng)該高優(yōu)先級(jí)異常的向量獲取。狀態(tài)保存可能會(huì)受到當(dāng)前中斷和遲到的更高優(yōu)先級(jí)中斷的影響,具體取決于原始異常和延遲到達(dá)異常的堆棧要求。從延遲到達(dá)異常的異常處理程序返回時(shí),系統(tǒng)會(huì)通過末尾連續(xù)中斷的方式處理懸起的低優(yōu)先級(jí)中斷。
中斷進(jìn)入
當(dāng)處理器正在處理中斷或者處于線程模式的時(shí)候,如果此時(shí)有更高優(yōu)先級(jí)的異常事件發(fā)生,處理器就會(huì)開始進(jìn)入異常處理流程,在這種情況下,新的中斷會(huì)搶占正在處理的低優(yōu)先級(jí)的中斷。
高優(yōu)先級(jí)中斷打斷低優(yōu)先級(jí)中斷的情況稱為中斷嵌套。
如果處理器在處理中斷的過程中,發(fā)生了優(yōu)先級(jí)較低的中斷,那么這個(gè)低優(yōu)先級(jí)的中斷會(huì)懸起(pending),處理器必須在處理完當(dāng)前中斷之后才會(huì)通過末尾連續(xù)的中斷方式處理低優(yōu)先級(jí)中斷。
當(dāng)處理器接受異常時(shí),除非異常是尾鏈或延遲到達(dá)的異常,否則處理器會(huì)將信息推送到當(dāng)前堆棧中。此操作稱為壓棧,壓入堆棧數(shù)據(jù)結(jié)構(gòu)稱為堆棧Frame。
如果浮點(diǎn)上下文處于活動(dòng)狀態(tài),Cortex-M33處理器可以在中斷處理過程中自動(dòng)將浮點(diǎn)處理的數(shù)據(jù)壓入堆棧。下圖顯示了當(dāng)堆棧上中斷或異常時(shí)Cortex-M33處理器堆棧數(shù)據(jù)結(jié)構(gòu):
- 具有浮點(diǎn)狀態(tài)。
- 沒有浮點(diǎn)狀態(tài)。

堆棧數(shù)據(jù)結(jié)構(gòu)
在未分配浮點(diǎn)狀態(tài)的堆??臻g時(shí),堆棧結(jié)構(gòu)與沒有FPU的Armv8-M實(shí)現(xiàn)相同。
上圖中無論是否處于浮點(diǎn)狀態(tài),處理器狀態(tài)結(jié)構(gòu)體(state context)都會(huì)保存在堆棧中。
如果實(shí)現(xiàn)了安全擴(kuò)展,當(dāng)非安全異常搶占安全狀態(tài)運(yùn)行的軟件時(shí),處理器會(huì)將額外的其他上下文信息將保存到堆棧中,并清除壓入過堆棧的寄存器,以確保非安全軟件沒有不會(huì)讀取到安全數(shù)據(jù),如下圖所示。

有TrustZone時(shí)的堆棧數(shù)據(jù)結(jié)構(gòu)
如果浮點(diǎn)上下文處于活動(dòng)狀態(tài),Cortex-M33處理器會(huì)自動(dòng)將浮點(diǎn)狀態(tài)堆疊到堆棧幀中。有兩種幀格式包含浮點(diǎn)上下文。如果從安全狀態(tài)中提取異常并設(shè)置了FPCR.TS,則系統(tǒng)還需要保存額外的浮點(diǎn)上下文。在所有其他情況下,系統(tǒng)堆棧僅保存標(biāo)準(zhǔn)浮點(diǎn)上下文,如下圖所示。

包含浮點(diǎn)額外上下文的堆棧數(shù)據(jù)結(jié)構(gòu)
處理器將會(huì)根據(jù)不同的觸發(fā)條件決定是否需要保存額外的浮點(diǎn)信息上下文數(shù)據(jù)。
在中斷發(fā)生的時(shí)候,系統(tǒng)總是直接使用當(dāng)前的堆棧指針來進(jìn)行壓棧操作。例如,如果異常從安全狀態(tài)帶到非安全處理程序,則使用安全堆棧指針來保存狀態(tài)。
壓棧后,堆棧指針會(huì)立即指向堆棧幀中的最低地址。
堆棧數(shù)據(jù)包含中斷返回地址。這是中斷程序中下一個(gè)指令的地址。處理器在中斷返回時(shí)候通過這個(gè)值恢復(fù)PC,以便中斷的程序恢復(fù)。
在處理器進(jìn)行壓棧操作的同時(shí),處理器執(zhí)行中斷向量獲取,從中斷向量表中讀取中斷處理程序開始地址。壓棧完成后,處理器開始執(zhí)行中斷處理程序。同時(shí),處理器將EXC_RETURN值寫入LR。此值用于在異常處理程序完成后觸發(fā)異常返回。
如果中斷進(jìn)入期間沒有發(fā)生更高的優(yōu)先級(jí)中斷,處理器將開始執(zhí)行異常處理程序,并自動(dòng)將相應(yīng)掛起中斷的狀態(tài)更改為活動(dòng)狀態(tài)。
如果在中斷處理期間發(fā)生另一個(gè)更高的優(yōu)先級(jí)異常,處理器將開始執(zhí)行此異常的異常處理程序,并且不會(huì)更改早期異常的掛起狀態(tài)。這種狀態(tài)就是中斷延遲。
異常返回
當(dāng)處理器處于處理程序模式,并且執(zhí)行以下指令之一試圖將PC設(shè)置為EXC_RETURN值時(shí),就會(huì)發(fā)生異常返回:
- 加載PC的
POP或LDM指令。 - 加載PC的
LDR指令 - 使用任何寄存器的
BX指令。
使用安全擴(kuò)展實(shí)現(xiàn)中的異常返回
處理器在中斷進(jìn)入時(shí)將EXC_RETURN值保存到LR。異常處理機(jī)制依賴于此值來檢測(cè)處理器何時(shí)完成異常處理程序。當(dāng)處理器將與此模式匹配的值加載到PC時(shí),它會(huì)檢測(cè)到該操作不是正常的分支操作,而是異常是完整的。因此,它開始異常返回序列。EXC_RETURN值的位[6:0]表示所需的返回堆棧、處理器模式、安全狀態(tài)和堆??蚣?,如下表所示。
表2-22異常返回行為
| Bit | Name | Function |
|---|---|---|
| [31:24] | PREFIX | 表示這是一個(gè)EXC_RETURN值。 |
| 此字段讀為0b11111111。 | ||
| [23:7] | — | 保留,RES1。 |
| [6] | S | 指示寄存器是否已推送到安全堆棧或非安全堆棧。0表示使用非安全堆棧。1表示使用安全堆棧。 |
| [5] | DCRS | 指示默認(rèn)堆棧規(guī)則是否適用,或者被調(diào)用方寄存器是否已經(jīng)在堆棧上。0表示跳過被調(diào)用方保存的寄存器的堆棧。1表示遵循堆棧的默認(rèn)規(guī)則。 |
| [4] | FType | 在具有主點(diǎn)和浮點(diǎn)擴(kuò)展的PE中:0表示PE在堆棧上為FP上下文分配了空間。1表示PE沒有為FP上下文在堆棧上分配空間。 |
| 在沒有浮點(diǎn)擴(kuò)展的PE中,此位是保留的,RES1。 | ||
| [3] | Mode | 指示堆疊的模式。0表示Handler模式。1表示線程(Thread)模式。 |
| [2] | SPSEL | 指示哪個(gè)堆棧包含異常堆棧幀。0表示主堆棧指針。1表示進(jìn)程堆棧指針。 |
| [1] | — | 保留,RES0。 |
| [0] | ES | 指示被異常的安全狀態(tài)。0不安全。1安全。 |
沒有安全擴(kuò)展系統(tǒng)中的異常返回
處理器在中斷進(jìn)入時(shí)將EXC_RETURN值保存到LR。處理器的異常處理機(jī)制依賴于此值來檢測(cè)處理器何時(shí)完成異常處理程序。當(dāng)處理器將與此模式匹配的值加載到PC時(shí),它會(huì)檢測(cè)到該操作不是正常的分支操作,而是異常是完整的。因此,它開始異常返回序列。EXC_RETURN值的位[6:0]表示所需的返回堆棧、處理器模式和堆棧幀,如下表所示。
表2-23異常返回行為
| 比特 | 姓名 | 功能 |
|---|---|---|
| [31:24] | PREFIX | 表示這是一個(gè)EXC_RETURN值。 |
| 此字段讀為0b11111111。 | ||
| [23:7] | — | 保留,RES1。 |
| [6] | — | 保留,RES0。 |
| [5] | — | 保留,RES1。 |
| [4] | FType | 在具有主點(diǎn)和浮點(diǎn)擴(kuò)展的PE中:0表示PE在堆棧上為FP上下文分配了空間。1表示PE沒有為FP上下文在堆棧上分配空間。 |
| 在沒有浮點(diǎn)擴(kuò)展的PE中,此位是保留的,RES1。 | ||
| [3] | Mode | 指示堆疊的模式。0表示Handler模式。1表示線程(Thread)模式。 |
| [2] | SPSEL | 指示哪個(gè)堆棧包含異常堆棧幀。0表示主堆棧指針。1表示線程堆棧指針。 |
| [1:0] | — | 保留,RES0。 |
系統(tǒng)的工作模式
線程模式(Thread mode)
處理器復(fù)位或異常退出時(shí)為此模式。此模式下的代碼可以是特權(quán)代碼也可以是用戶代碼,通過CONTROL[0]控制。
處理模式(Handler mode)
出現(xiàn)異常(包括中斷)時(shí)進(jìn)入此模式,此模式下所有代碼為特權(quán)訪問。
特權(quán)訪問
對(duì)處理器資源擁有完全訪問限權(quán);處理器復(fù)位后進(jìn)入此訪問模式;清零 CONTROL[0]進(jìn)入用戶模式。
用戶訪問
禁止訪問多數(shù)系統(tǒng)寄存器。只能通過進(jìn)入異常(中斷)來返回特權(quán)模式。進(jìn)入異常前是用戶級(jí)訪問,則退出異常時(shí)自動(dòng)回到用戶及,除非在異常中修改CONTROL[0]位。
-
處理器
+關(guān)注
關(guān)注
68文章
20253瀏覽量
252237 -
ARM
+關(guān)注
關(guān)注
135文章
9553瀏覽量
391860 -
中斷
+關(guān)注
關(guān)注
5文章
917瀏覽量
43754 -
異常處理
+關(guān)注
關(guān)注
0文章
15瀏覽量
7470
發(fā)布評(píng)論請(qǐng)先 登錄
什么是ARM中斷事件?ARM中斷異常處理具體過程
ARM異常中斷處理流程分析
關(guān)于ARM核異常與中斷處理機(jī)制研究
ARM微處理器編程模型之異常中斷處理分析
ARM中異常中斷問題詳情分析總結(jié)
如何理解ARM異常、中斷和向量表
嵌入式系統(tǒng)原理及應(yīng)用教程之ARM異常中斷處理及編程的資料說明
ARM中斷異常處理的基本術(shù)語
評(píng)論