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





