ARM流水線與異常中斷返回的幾種情況

重要基礎知識:R15(PC)總是指向“正在取指”的指令,而不是指向“正在執行”的指令或正在“譯碼”的指令。一般來說,人們習慣性約定將“正在執行的指令作爲參考點”,稱之爲當前第一條指令,因此 PC總是指向第三條指令。當 ARM 狀態時,每條指令爲 4 字節長,所以 PC 始終指向該指令地址加 8 字節的地址,即:PC 值=當前程序執行位置+8;

   而 ADS 中的 pc,是爲了調試看着方便而修改過的,它指向的是正在執行的指令,即“真正 pc-8”!


提示:ARM在執行跳轉或發生幾種異常情況時,處理器會自動將PC-4的值保存到LR寄存器中(注意:PC的值指的是ARM流水線中當前執行指令的地址+8,另外由於幾種異常情況的發生與當前指令是否被執行的順序有關,如IRQ或FIQ都是等到當前指令被執行完後,纔去執行IRQ或FIQ的處理,因此PC指針會更新到下一條指令,此時LR中保存的將會多出4字節(ARM指令下時),因此在異常返回時,要減去相應多的字節數據再賦值給PC指針,詳見下面說明;而如發生指令中止異常時,由於當前指令還未被執行,因此PC指針還未更新到下一條指令)。此外,由於中止異常發生時,ARM需要返回到中止異常的地址,再重新執行一遍該地址的指令(中止包含兩種類型:預取中止和數據中止。當發生預取中止時,ARM內核將預取的指令標記爲無效,但在指令到達流水線的執行階段時才進入異常。如果指令在流水線中因爲發生分支而沒有被執行,中止將不會發生。 即預取中止發生時,PC指針還未更新,而數據中止發生時已更新到下一條指令的地址)。



1.SWI和和未定義指令異常中斷的返回:

指令地址

A        PC-8  當前指令爲 SWI 或未定義指令 此時發生中斷.PC 的值還沒有更新.

A+4      PC-4  中斷時處理器將PC-4 保存到 LR。       ;lr!

A+8      PC

返回時,從發生中斷的指令 A(PC-8)的下一條指令 A+4(PC-4)處開始執行,所以直接把 LR 的值賦給 PC 就行了,具體指令爲 MOVPC,LR  (PC=A+4=LR)

白話解釋:對於 SWI 和未定義指令異常: 發生異常時 pc 沒有更新,根據 ARM 的三級流水線原理,pc 沒有更新,仍然等於(A+8); lr= pc – 4(這時處理器決定的,無法更改!)即 A+4。

由於這類異常返回後應執行下一條指令(A+4),所以返回時,pc= lr 即可。

2.IRQ和 FIQ 異常中斷處理的返回:

指令地址  對應於 PC

A        PC-8      執行此指令完成後(!)查詢 IRQ 及 FIQ,如果有中斷請求則產生中斷.

A+4      PC-4

A+8      PC         ;lr!

(此時 PC 的值已經更新,指向 A+12.將當前 PC-4,即 A+8 )。

保存到 LR.返回時,要接着執行 A+4(LR-4)處的指令,所以返回指令爲

SUBS  PC,LR,#4(PC=A+4=LR-4)

白話解釋:對於普中斷和快中斷異常,中斷必須在一條指令執行完以後被檢測到,如正在執行指令甲時發生了中斷,不等指令甲執行完是不會處理該中斷的,發生異常時 pc 已經更新(A+12); lr= pc – 4(這時處理器決定的,無法更改!)即 A+8 返回後,應執行被中斷而沒有執行的指令(上面的 A+4),所以返回時,pc = lr-4

3,指令預取中止異常中斷處理的返回:

指令地址

A    PC-8     執行本指令時發生中斷,  

A+4  PC-4     處理器將A+4(PC-4)保存到 LR.    ;lr!

A+8  PC

返回時,發生指令預取中止的指令 A(PC-8)處重新執行,所以返回指令爲

SUBS  PC,LR,#4(PC=A=LR-4)

白話解釋:對於預取指令中止異常,發生預取指令異常時,是在執行時發生的異常,pc 未更新,即 pc= A+8;lr = pc – 4(這時處理器決定的,無法更改!)即 A+4。

由於這類異常返回後應重新執行異常的那個指令(A),所以返回時,pc= lr-4

4,數據訪問中止異常中斷處理的返回:

指令地址

A         PC-8    本指令訪問有問題的數據,產生中斷時,PC 的值已經更新   

A+4       PC-4    中斷髮生時 PC=A+12,處理器將 A+8(PC-4)保存到 LR.

A+8       PC        ;lr!

返回時,要返回到 A 處繼續執行,所以指令爲SUBS  PC,  LR,#8.(PC=A=LR-8)

白話解釋:對於數據訪問中止異常,發生數據訪問中止異常時,是在執行時訪問數據錯誤導致的異常,pc 已經更新,即 pc= A+12

lr=pc – 4(這時處理器決定的,無法更改!)即 A+8。

由於這類異常返回後應重新執行異常的那個指令(A),所以返回時,pc= lr-8

小節:

Ø引起 PC 更新的原因一種是數據中止,還有就是中斷了.

Ø中斷必須是在一條指令執行完畢後才能被檢測到,所以它中斷的只是還未執行的那條指令(pc - 8),所以 pc= lr – 4;

Ø與中斷相同,SWI 和未定義指令異常也是返回到下一條指令(pc - 4),只是他們在執行時,PC 的值並沒有更新,所以 pc= lr;

Ø預取指令中止異常,也沒有發生 pc  更新,但它還得重新執行發生異常的那條指令,所以 pc= lr – 4;

Ø數據訪問中止異常,發生了 pc  更新,並且它也需要重新執行發生異常的那條指令,所以 pc= lr – 8。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章