用戶模式(user模式),運行應用的普通模式;
快速中斷模式(fiq模式),用于支持數(shù)據(jù)傳輸或通道處理;
中斷模式(irq模式),用于普通中斷處理。
超級用戶模式(svc模式),操作系統(tǒng)的保護模式
?異常中斷模式(abt模式),輸入數(shù)據(jù)后登入或預取異常中斷指令
?系統(tǒng)模式(sys模式),是操作系統(tǒng)使用的一個有特權的用戶模式
?未定義模式(und模式),執(zhí)行了未定義指令時進入該模式
外部中斷,異常操作或軟件控制都可以改變中斷模式。大多數(shù)應用程序都時是在用戶模式下運行。進入特權模式是為了處理中斷或異常請求或操作保護資源服務的。
這些工作模式是芯片硬件提供的程序運行的不同環(huán)境,不同的模式有不同的硬件訪問權限,使用不同的寄存器。這就給不同的程序提供了不同的權限機制,你比如說你的操作系統(tǒng)代碼運行在權限比較高的模式下,而你的應用程序運行在權限比較低的模式下。這樣就起到了對操作系統(tǒng)代碼的保護作用。
寄存器,各個模式下可見的寄存器以及各個寄存器的功能:
ARM共有37個32位的寄存器,其中31個是通用寄存器,6個是狀態(tài)寄存器。但在同一時間,
對程序員來說并不是所有的寄存器都可見。在某一時刻存儲器是否可見(可被訪問),是處
理器當前的工作狀態(tài)和工作模式?jīng)Q定的。其各個模式下的寄存器如圖1所示:
其中系統(tǒng)模式和用戶模式所用的寄存器是一樣的。畫三角陰影的寄存器表示在不同模式下
有不同的物理寄存器。
以下對其進行分類說明:
通用寄存器
ARM的通用寄存器包括R0~R15,其中R0~R7是屬于未分組寄存器,各個模式下都使用同樣的寄
存器。R8~R14在FIQ模式下是有獨立的物理寄存器,其目的是加快中斷響應速度,從硬件上
保存程序執(zhí)行現(xiàn)場。R13和R14這兩個寄存器在每種模式下都有自己的獨立寄存器。R15只有
一個,所有模式公用。
下對這些寄存器中的比較有特殊功能的做一下介紹:
?寄存器R13:在ARM指令中,常用R13做堆棧指針用。每種運行模式都有自己獨立的堆棧,用于保存中斷發(fā)生時的程序運行環(huán)境和C語言執(zhí)行時進行過程控制。
?寄存器R14:專職持有返回點的地址,在系統(tǒng)執(zhí)行一條“跳轉并鏈接(link)”(BL)指令
的時候,R14將收到一個R15的拷貝。其他的時候,它可以用作一個通用寄存器。相應的它
在其他模式下的私有寄存器R14_svc,R14_irq,R14_fiq,R14_abt和R14_und都同樣用來保
存在中斷或異常發(fā)生時,或時在中斷和異常中執(zhí)行了BL指令時,R15的返回值。
?寄存器R15是程序計數(shù)器(PC)。在ARM狀態(tài)下,R15的bits[1:0]為0,bits[31:2]保存了PC
的值。在Thumb狀態(tài)下,bits[0]為0同時bits[31:1]保存了PC值。
FIQ模式擁有7個私有寄存器R8-14(R8_fiq-R14_fiq)。在ARM狀態(tài)下,多數(shù)FIQ處理都不需要保存任何寄存器。用戶、中斷、異常中止,超級用戶和未定義模式都擁有2個私有寄存器,R13和R14。允許這些模式都可擁有1個私有堆棧指針和鏈接(link)寄存器。
程序狀態(tài)寄存器
ARM920T具有一個當前程序狀態(tài)寄存器(CPSR),另外還有5個保存程序狀態(tài)寄存器(SPSRs)用于異常中斷處理。這些寄存器的功能有:
?保留最近完成的ALU操作的信息;
控制中斷的使能和禁止;
?設置處理器的操作模式。
下圖2顯示了程序狀態(tài)寄存器的位定義:
關于這些位的具體含義請參見datasheet。
異常:
當正常的程序執(zhí)行流程因一些原因發(fā)生暫時的停止時,稱之為異常。比如芯片取到了一條不認識的指令,當這條指令執(zhí)行時就會發(fā)生Abort異常中止,從而進入Abort模式。也就是說不通的條件會發(fā)生不通的異常,而不同的異常就會使處理器進入不同的處理模式。
你想知道異常什么時候發(fā)生,怎么發(fā)生的?發(fā)生后芯片都要干些什么?怎么從這些異常中返回?異常向量表是什么?那就請你仔細閱讀datasheet的第二章program’s model,這一章對這些問題都做了詳細的說明和講解。
當然,這些和后面的UCOS是有關系的,比如UCOS和用戶的應用程序是統(tǒng)一編譯的,都運行在SVC模式下,當外部中斷來時會切換到中斷模式。
請看下面的異常(中斷)向量表:
地址
異常中斷類型
進入時處理器模式
0x00000000
Reset
Supervisor
0x00000004
Undefined instruction
Undefined
0x00000008
Software Interrupt
Supervisor
0x0000000C
Abort (prefetch)
Abort
0x00000010
Abort (data)
Abort
0x00000014
Reserved
Reserved
0x00000018
IRQ
IRQ
0x0000001C
FIQ
FIQ
異常向量表是一個填好了的跳轉指令表,中斷向量表就位于內存地址的0開始處。當相應的異常發(fā)生時,CPU最后要把PC值改成向量表里的跳轉指令實現(xiàn)跳轉去執(zhí)行相應的服務程序。當然這時CPU的運行模式就更改了。我們看IRQ中斷異常,這個地址向量是外部中斷的入口地址,那我們知道ARM9芯片上支持的中斷源有很多,那中斷入口就一個,怎么識別到底是哪一個具體中斷源發(fā)生了那。這一部分知識就是中斷控制器的內容了,請參加下面的文章或者參加datasheet的十四章interrupt controller。
關于更詳細的資料請參考920t的datasheet!?。。?!
關于arm中斷系統(tǒng)請參考arm920t中斷系統(tǒng)詳解。和ucos相關的arm芯片知識講完了,當然arm芯片知識還很多,參考920t的datasheet!?。?!