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