Threadx 中斷處理-ARM


基於arm v7分析Threadx操作系統的中斷處理。

ARM寄存器

ARM V7體系結構共有37個32位寄存器,其中r0-r12爲通用寄存器;r13(sp)爲棧寄存器,指向棧頂,向下(低地址)增長;r14(LR)是連接寄存器,用來函數調用時存儲返回地址,或者中斷異常點;r15(pc)爲程序計數器,存儲當前執行指令下一條指令地址;CPSR寄存器保存程序執行時處理器狀態信息;SPSR寄存器用來存儲CPSR備份值。
ARM有多種工作模式,每種模式下有自己特殊寄存器,例如,每種模式下都有自己的SPSR物理寄存器。
任何模式下都可以訪問R0-R12和CSPR寄存器,只有一份物理寄存器。FIQ模式下可以訪問R8_fiq-R14_fiq, 是物理寄存器。
每種模式下(除了sys模式)都有自己的物理寄存器SP,LR,只能在自己的模式下訪問對應寄出器。模式切換是,SPSR寄存器用來備份CPSR寄存器。
例如:當前ARM從User模式切換到FIQ模式時,CPSR寄出器值備份到SPSR_fiq,使用SP_fiq,LR_fiq作爲當前模式下程序執行的棧寄存器和鏈接寄存器。
總之,R0-R12爲通用寄存器,每種模式都可以訪問,每種模式下又有自己的棧寄存器和鏈接寄存器,以及特有寄存器。
每種模式下特有寄存器好處時,模式切換時可以使用之前寄存器中存儲的值,不需要保存或恢復,加快模式切換速率。
在這裏插入圖片描述
** CPSR寄存器 **
在這裏插入圖片描述
所有處理器模式下都可訪問當前程序狀態寄存器CPSR。CPSR中包含條件碼標誌、中斷禁止位、當前處理器模式以及其他狀態和控制信息。在每種異常模式下都有一個對用的程序狀態寄存器SPSR。當異常出現時,SPSR用於保存CPSR的狀態,以便異常返回後恢復異常發生時的工作狀態。

條件碼標誌

N、Z、C、V,最高4位稱爲條件碼標誌。ARM的大多數指令可以條件執行的,即通過檢測這些條件碼標誌來決定程序指令如何執行。

各個條件碼的含義如下:

N:在結果是有符號的二進制補碼情況下,如果結果爲負數,則N=1;如果結果爲非負數,則N=0。

Z:如果結果爲0,則Z=1;如果結果爲非零,則Z=0。

C:其設置分一下幾種情況:

           對於加法指令(包含比較指令CMN),如果產生進位,則C=1;否則C=0。

           對於減法指令(包括比較指令CMP),如果產生借位,則C=0;否則C=1。

           對於有移位操作的非法指令,C爲移位操作中最後移出位的值。

           對於其他指令,C通常不變。

V:對於加減法指令,在操作數和結果是有符號的整數時,如果發生溢出,則V=1;如果無溢出發生,則V=0;對於其他指令,V通常不發生變化。

ARM兩種狀態

ARM狀態:32位,ARM狀態執行字對齊的32位ARM指令。
Thumb狀態,16位,執行半字對齊的16位指令。
用Bx Rn指令來進行兩種狀態的切換:
其中Bx是跳轉指令,而Rn是寄存器(1個字,32位),如果Rn的位0爲1,則進入Thumb狀態;如果Rn的位爲0,這進入ARM狀態。
原 因:ARM指令的後兩位始終爲0,沒有用,而Thumb指令的後一位始終爲0,沒有用,因此採用位0來表示ARM指令與Thumb指令的切換標誌位。
注:ARM和Thumb兩種狀態之間的切換不影響處理器的工作模式和寄存器的內容。
ARM處理器在處理異常時,不管處理器處於什麼狀態,則都將切換到ARM狀態。

ARM 工作模式

ARM體系架構有7種工作模式,CPSR的低5位定義了當前的處理器模式。

M[4:0] 模式 意義
10000 User 用戶模式
10001 FIQ FIQ快速中斷模式
10001 IRQ IRQ普通中斷模式
10011 SVC 管理模式
10111 ABORT 中止模式
11011 UND 未定義模式
11111 SYS 系統模式

用戶模式 User
用戶模式通常用來執行普通程序,在改模式下不能訪問系統寄存器,所以這種模式通常被操作系統來執行應用程序。

快速中斷模式 FIQ
快速中斷模式用來處理fiq類型中斷,通常是高頻或低延遲中斷。FIQ模式有特有的r8_fiq-r12_fiq等寄存器,因此可以不用存儲和恢復自身的環境就可以執行,能夠提升處理中斷的速度。

普通中斷模式 IRQ
大部分中斷在普通中斷模式處理,中斷髮生時不能自動備份某些寄存器內容,需要軟件在堆棧中備份寄存器,再判斷中斷來源並處理中斷。

管理模式 SVC
管理模式運行操作系統的保護模式,高權限,可以操作系統寄存器。linux系統中內核運行在SVC模式,中斷髮生後進入FIQ或IRQ,保存好環境會切換到SVC模式,繼續進行中斷處理。
這裏多說一下,linux內核可以運行在SVC,FIQ, IRQ模式,因爲從程序角度看,底層代碼包括BSP都屬於內核,而應用程序運行在用戶模式,權限低。
Threadx應用程序和操作系統都運行在SVC模式。

中止模式 ABORT
中止模式用來處理指令預取中止和數據內存訪問中止,中止的地址保存在r14_abt中。

未定義模式 UND
未定義模式用來處理由未定義的指令產生的錯誤,未定義指令保存在r14_abt中。

系統模式 SYS
運行具有特權的任務

工作模式切換

ARM 異常

異常是指是指打斷當前處理流程的異步事件或錯誤條件。發生異常後,ARM處理器試圖執行完當前指令,然後暫停指令執行去處理異常,異常處理完後返回繼續處理指令。異常又成爲中斷,中斷向量。
arm有七種異常,異常的處理地址從0x0000000到0x000001c,每個字(32位)存放一箇中斷向量。

異常 地址 工作模式 描述
reset 0x0000000 SVC 復位異常,復位或上電後,arm此開始執行指令
Undefine(undefined instruction) 0x0000004 UND 未定義,當arm試圖執行未定義指令時,arm跳轉到此處執行
Swi(Software Interrupt ) 0x0000008 SVC 軟中斷,swi指令執行後,arm跳轉到此處執行
Prefetch Abort 0x00000C ABT 當指令預取失敗時,arm跳轉到此處執行
Data Abort 0x000010 ABT 當數據訪問失敗時,arm跳轉到此處執行
IRQ (Interrupt Request ) 0x000018 IRQ 當普通中斷髮生時,arm跳轉到此處執行
FIQ(Fast Interrupt Request) 0x00001C FIQ 當快速中斷髮生時,arm跳轉到此處執行

ARM異常處理

發生異常後處理器硬件執行:
1 ,保存CPSR到新模式的SPSR寄存器中
2,修改CPSR中模式位,切換到新模式
3,修改CPSR:清除Thumb位,中斷必須在32位模式處理;如果異常是IRQ,則置I位,禁止IRQ中斷;如果異常是FIQ,則置F位和I位,禁止IRQ和FIQ中斷。
4,保存PC值到新模式下r14寄存器
5,把對應異常中斷向量地址保存到PC程序計數器,後續軟件開始處理,從PC地址開始執行。

軟件處理;

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