關於ARM核異常與中斷處理機制研究

2021-08-25 18:15:46 字數 2665 閱讀 3230

一.arm

處理器異常及其對應的模式

當乙個異常發生時,arm

處理器總是切換到arm

狀態(即非thumb

狀態)。thumb

指令集沒有包含進行異常處理時需要的一些指令,因此在異常中斷時,還是要使用arm

指令。

每種異常都導致核心進入一種特定的模式。此外,可以通過修改cpsr

,進入任何arm

處理器模式。使用者和系統模式是僅有的可不通過相應異常進入的2

中模式。

當乙個異常導致模式的改變時,核心自動的: l

把cpsr

儲存到相應異常模式下的spsr l

把pc儲存到相應模式下的lr l

設定cpsr

為相應異常模式 l

設定pc

為相應異常處理程式的入口位址

二.向量表

異常發生時,arm

跳轉位址組成的表。

三.異常優先順序

復位異常是優先順序最高的異常,一旦復位異常產生,總是會發生復位異常。注意:當一條不屬於arm

或thumb

指令集的指令到達流水線的執行階段時,若此時沒有其它異常發生,就會產生未定義指令異常。arm

處理器會「詢問」協處理器,看它能否將其作為一條協處理器指令來處理。由於協處理器在流水線之後,所以指令確認可以在核心的執行階段進行。如果這條指令不屬於任何乙個協處理器,則會產生未定義指令異常。

四.中斷

中斷延時是指:從外部請求訊號發出到取出對應的中斷服務程式(isr

)的第一條指令,這期間的間隔時間。

五.中斷源及其識別方法

s3c2440a

有60個中斷源,irq

有兩種中斷識別方法:向量中斷和非向量中斷。fiq

只有非向量中斷。在irq

各個中斷源中的某乙個中斷源的中斷請求被響應時,cpu

轉至0x18

處自動載入一條轉移指令轉至相應中斷源的固定中斷向量處。irq

各個中斷源的向量位址是固定的,每個占用乙個字單元。irq

各個中斷源若採用非向量中斷,任意乙個中斷源發出中斷請求,都認為發生了irq

中斷請求,並自動轉入irq

中斷服務程式執行。irq

中斷服務程式主要功能是將軟體設定的中斷向量表中相應的中斷源服務程式入口位址送給pc

,並轉其執行。在非向量中斷模式下,一般在irq

處放置一條轉移指令:b isrirq

。其中,isrirq

為所有irq

中斷服務程式的總入口位址,也是非向量中斷模式的中斷源判別及散轉程式。

六.中斷堆疊設計

在堆疊設計時,須確定2點:

l位置決定了在儲存器對映中,堆疊從何處開始。大多數基於arm

系統設計的堆疊是採用向下遞減式的,棧頂位於儲存器的高階位址。 l

堆疊大小

依賴於處理程式的型別-

巢狀的還是非巢狀的。乙個巢狀中斷處理程式需要更多的儲存器空間,因為堆疊將隨中斷巢狀的深度而增加。

第一種方式a

,說明了乙個傳統的堆疊安排,中斷的堆疊位於**段之下。第二種方式b

,中斷堆疊在使用者堆疊之上,位於儲存器的頂端。b

優於a之處是,b

在堆疊溢位時不會破壞向量表,因此系統在確認堆疊溢位後,還有機會糾正自己的錯誤。每一種處理器模式都要建立乙個堆疊,這是在處理器每次復位時完成的。因為系統復位是從管理模式開始的,所以不用再切換到管理模式,而其他模式堆疊的建立要切換到相應模式。用於模式堆疊-

通常是最後設定的,因為當處理器處於使用者模式時,沒有直接修改cpsr

的方法。由於系統模式和使用者模式共享暫存器,所以可以強制處理器進入系統模式來設定使用者模式堆疊。

七.中斷處理方法 1

)非巢狀中斷處理

最簡單的中斷處理是非巢狀的:只有當控制權回到被中斷的任務或過程時,才允許再次相應中斷。由於乙個非巢狀的中斷處理程式在乙個時段內只能為乙個中斷處理程式服務,所以這種形式的中斷處理程式不適合需要為多個不同優先順序中斷服務的複雜嵌入式系統。

2)巢狀中斷處理

在處理程式完成當前中斷的服務前重新允許中斷,可以實現中斷巢狀。巢狀的中斷處理程式入口**與簡單的非巢狀中斷處理程式類似。不同之處在於,在推出時,處理程式要測試被isr

更新過的乙個標誌。這個標誌表明,是否需要做進一步的處理,如果不要求更多的處理,那麼這個中斷服務例程就完成了,處理程式也可以退出;如果需要進一步處理,處理程式可能要採取若干措施:重新允許中斷,並/

或執行一次上下文切換。重新允許中斷包括把irq

模式切換到svc

或系統模式。在irq

模式下,不能簡單的允許中斷,因為這可能會導致鏈結暫存器r14_irq

遭到破壞,特別是在執行完bl

後即發生一次中斷。執行上下文切換包括復位(清空)irq

堆疊,因為當irq

堆疊中還有資料的時,處理程式不會執行上下文切換。所有儲存在irq

堆疊的暫存器必須轉移到任務堆疊,典型地是放在管理模式堆疊上。然後,其餘的暫存器也必須被儲存到任務堆疊。在那裡,他們會被轉移到堆疊中乙個稱為堆疊幀的保留儲存塊上。

如下恢復現場的指令:

ldmfd r13

!,(r0

~r3,pc)^

這裡,暫存器列表後(其中必須包括pc

)的後面的「^

」表示這是一條特殊形式的指令。在從儲存器裝入pc

的同時,cpsr

也得到恢復。

異常處理機制

異常處理的三個步驟 檢查異常,丟擲異常,處理異常 異常處理基本原理 把需要檢測的程式放到try塊中,把異常處理的程式放在catch塊中。如果執行乙個函式出現了異常,可以丟擲異常資訊。然後查詢try塊下面的catch塊是否可以處理該異常。如果該函式不處理該異常,將傳遞給它的上一級函式 呼叫函式 如果它...

異常處理機制

1 c 中異常處理機制使得異常的引發和異常的處理不必在同乙個函式中。2 異常是專門針對抽象程式設計中的一系列錯誤處理的,c 的函式機制是棧結構,先進後出,依次訪問,無法跳躍。3 異常超脫於函式機制,決定了其對函式的跨越式回跳。4 異常跨越函式 普通用法 基本用法 void add int a,int...

異常處理機制

異常處理機制分為以下2點 異常處理五個關鍵字 try catch finally throw throws 用了try catch程式出現異常不會終止,會丟擲異常繼續執行下面任務 public static void main string args catch error e catch exce...