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