第9章異常中斷處理_第1頁(yè)
第9章異常中斷處理_第2頁(yè)
第9章異常中斷處理_第3頁(yè)
第9章異常中斷處理_第4頁(yè)
第9章異常中斷處理_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第9章異常中斷處理1AssembleLanguageofARM9.1ARM異常中斷處理概述控制程序的執(zhí)行流程有3種方式:正常情況下,程序每執(zhí)行一條指令,程序計(jì)數(shù)器寄存器pc將增加4或2字節(jié);通過(guò)跳轉(zhuǎn)指令,程序可以跳轉(zhuǎn)到特定的地址標(biāo)號(hào)處執(zhí)行,或者跳轉(zhuǎn)到特定的子程序處執(zhí)行;B指令BL指令BLX指令,BX指令當(dāng)異常中斷發(fā)生時(shí),系統(tǒng)執(zhí)行完當(dāng)前指令后,將跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。2AssembleLanguageofARM異常中斷名稱含義復(fù)位當(dāng)處理器的復(fù)位電平有效時(shí),產(chǎn)生復(fù)位異常,程序跳轉(zhuǎn)到復(fù)位異常處理程序處執(zhí)行。未定義指令當(dāng)ARM處理器或協(xié)處理器遇到不能處理的指令時(shí),產(chǎn)生未定義指令異常。可使用該異常機(jī)制進(jìn)行軟件仿真。軟件中斷(SWI)該異常由執(zhí)行SWI指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權(quán)操作指令??墒褂迷摦惓C(jī)制實(shí)現(xiàn)系統(tǒng)功能調(diào)用。指令預(yù)取中止若處理器預(yù)取指令的地址不存在,或該地址不允許當(dāng)前指令訪問(wèn),存儲(chǔ)器會(huì)向處理器發(fā)出中止信號(hào),但當(dāng)預(yù)取的指令被執(zhí)行時(shí),才會(huì)產(chǎn)生指令預(yù)取中止異常。數(shù)據(jù)訪問(wèn)中止若處理器數(shù)據(jù)訪問(wèn)指令的地址不存在,或該地址不允許當(dāng)前指令訪問(wèn)時(shí),產(chǎn)生數(shù)據(jù)中止異常。外部中斷請(qǐng)求(IRQ)當(dāng)處理器的外部中斷請(qǐng)求引腳有效,且CPSR中的I位為0時(shí),產(chǎn)生IRQ異常。系統(tǒng)的外設(shè)可通過(guò)該異常請(qǐng)求中斷服務(wù)??焖僦袛嗾?qǐng)求(FIQ)當(dāng)處理器的快速中斷請(qǐng)求引腳有效,且CPSR中的F位為0時(shí),產(chǎn)生FIQ異常。9.1.1ARM體系中異常中斷種類3AssembleLanguageofARM中斷向量表指定了各異常中斷及其處理程序的對(duì)應(yīng)關(guān)系,通常放在內(nèi)存的低地址端。在ARM體系中,異常中斷向量表的大小為32字節(jié),其中每個(gè)異常中斷占據(jù)4個(gè)字節(jié),保留4個(gè)字節(jié)。每個(gè)異常中斷對(duì)應(yīng)的中斷向量表中的4個(gè)字節(jié)空間中存放一條跳轉(zhuǎn)指令或者一條向PC寄存器中賦值的數(shù)據(jù)訪問(wèn)指令。9.1.2異常中斷向量表及異常中斷優(yōu)先級(jí)4AssembleLanguageofARM各異常中斷的中斷向量地址及其異常中斷處理優(yōu)先級(jí)表中斷向量地址異常中斷類型異常中斷模式優(yōu)先級(jí)*0x0復(fù)位特權(quán)模式(SVC)10x4未定義的指令未定義指令中止模式(Undef)60x8軟件中斷(SWI)特權(quán)模式(SVC)60x0c指令預(yù)取中止中止模式50x10數(shù)據(jù)訪問(wèn)中止中止模式20x14保留未使用未使用0x18外部中斷請(qǐng)求(IRQ)外部中斷(IRQ)模式40x1c快速中斷請(qǐng)求(FIQ)快速中斷(FIQ)模式3*注:1最高;6最低5AssembleLanguageofARM9.1.3異常中斷使用的寄存器各異常中斷對(duì)應(yīng)著一定的處理器模式。應(yīng)用程序通常運(yùn)行在用戶模式下。各種不同的處理器模式對(duì)應(yīng)于該處理器模式的物理寄存器組。6AssembleLanguageofARM異常處理中的寄存器使用與異常發(fā)生相關(guān)的模式改變意味著所調(diào)用的異常處理程序至少要訪問(wèn):私有的SP_<mode>(stackpointer).私有的LR_<mode>(linkregister).私有的SPSR_<mode>(savedprogramstatusregister).在FIQ異常處理中,另有5個(gè)私有的通用寄存器(r8_fiqtor12_fiq).其它的寄存器是所有模式公用的.異常處理程序必須確保其他的寄存器在退出前恢復(fù)到原來(lái)的狀態(tài)這可以通過(guò)將任何正在使用的寄存器的內(nèi)容保存在堆棧中,并在返回前恢復(fù)來(lái)實(shí)現(xiàn)任何所需寄存器的初始化要由應(yīng)用程序的起始代碼來(lái)完成,參閱:“EmbeddedSoftwareDevelopment”7AssembleLanguageofARM

8AssembleLanguageofARM處理器模式描述用戶模式(usr)正常程序執(zhí)行的模式快速中斷模式(fiq)用于高速數(shù)據(jù)傳輸或通道處理外部中斷模式(irq)用于通用的中斷處理特權(quán)模式(svc)供操作系統(tǒng)使用的保護(hù)模式(復(fù)位或軟中斷)中止模式(abt)當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)。未定義指令中止模式(und)當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持通過(guò)軟件仿真硬件的協(xié)處理器。系統(tǒng)模式(sys)用于運(yùn)行具有特權(quán)級(jí)的操作系統(tǒng)任務(wù)。ARM中的處理器模式9AssembleLanguageofARMVectorTableVectortablecanbeat

0xFFFF0000onARM720T

andonARM9/10familydevicesFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset0x1C0x180x140x100x0C0x080x040x00當(dāng)異常產(chǎn)生時(shí),ARMcore:拷貝CPSR到SPSR_<mode>設(shè)置適當(dāng)?shù)腃PSR位:改變處理器狀態(tài)進(jìn)入ARM狀態(tài)改變處理器模式進(jìn)入相應(yīng)的異常模式設(shè)置中斷禁止位禁止相應(yīng)中斷(如果需要)保存返回地址到LR_<mode>設(shè)置PC位相應(yīng)的異常向量返回時(shí),異常處理需要:從SPSR_<mode>恢復(fù)CPSR從LR_<mode>恢復(fù)PCNote:這些操作只能在ARM態(tài)執(zhí)行.2.9進(jìn)入和退出異常中斷的過(guò)程10AssembleLanguageofARMARM微處理器對(duì)異常的響應(yīng)過(guò)程用偽碼可以描述為:R14_<Exception_Mode>=ReturnLinkSPSR_<Exception_Mode>=CPSRCPSR[4:0]=ExceptionModeNumberCPSR[5]=0

;當(dāng)運(yùn)行于ARM工作狀態(tài)時(shí)If<Exception_Mode>==ResetorFIQthenCPSR[6]=1

;當(dāng)響應(yīng)FIQ異常時(shí),禁止新的FIQ異常

CPSR[7]=1;禁止新的IRQ異常PC=ExceptionVectorAddress

11AssembleLanguageofARM各種中斷響應(yīng)的偽代碼參見(jiàn)教材P.265-26812AssembleLanguageofARM9.2.2

從異常中斷處理程序中返回 從異常中斷處理程序中返回包括以下兩個(gè)基本操作:1、恢復(fù)被中斷的程序的處理器狀態(tài),即將SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。2、返回到發(fā)生異常中斷的指令的下一條指令執(zhí)行,即將lr_mode寄存器的內(nèi)容復(fù)制到程序計(jì)數(shù)器PC中。復(fù)位異常中斷處理程序不需要返回,整個(gè)應(yīng)用系統(tǒng)是從復(fù)位異常中斷處理程序開(kāi)始執(zhí)行的。SUBS

PC,R14_fiq,#4或MOV

PC,R14_svc13AssembleLanguageofARM異常返回指令從SWI和Undef異常返回 MOVS

pc,lr從FIQ,IRQ和預(yù)取異常(PrefectAbort)返回

SUBSpc,lr,#4

從數(shù)據(jù)異常(DataAbort)返回

SUBS

pc,lr,#8

如果LR之前被壓棧的話使用LDM“^”

LDMFDsp!,{pc}^異常返回:使用一數(shù)據(jù)處理指令:相應(yīng)的指令取決于什么樣的異常在特權(quán)模式不僅僅更新PC,而且拷貝SPSR到CPSR設(shè)置CPSR,“S”bitPC做為目的寄存器14AssembleLanguageofARM向量表指令LiteralpoolcontainingaddressofUndefHandlerIRQhandlerwithin32MBytesBranch

instructionrangeSWIExceptionhandlerplacedonapplicableaddressboundaryFIQhandlerfollowsvectortableUndefhandleroutside32MBytes

branchinstructionrange>32Mbytes<4Kbytes0x00x10000x20000000xFFC0x80x180x300000000xFFFFFFFF0x1C0x4MOVPC,#0x30000000BIRQ_handler0x30008000IRQHandlerSWIHandlerFIQHandlerLDRPC,[PC,#+0xFF0]UndefHandler0x3000800015AssembleLanguageofARMARMorThumb?Thumb/ARM混合應(yīng)用程序ARMCodeARMCodeThumb

CodeFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset16AssembleLanguageofARM9.3在應(yīng)用程序中安裝異常中斷處理程序?qū)惓V袛嗵幚沓绦蜃?cè)到異常中斷向量表中有兩種辦法:使用跳轉(zhuǎn)指令使用數(shù)據(jù)讀取指令LDR17AssembleLanguageofARM1.地址0x0處為ROM的情況使用數(shù)據(jù)讀取指令LDR直接向程序計(jì)數(shù)器PC中賦值;使用跳轉(zhuǎn)指令直接跳轉(zhuǎn)到異常中斷處理器程序參見(jiàn)教材P.271的代碼18AssembleLanguageofARM2.地址0x0處為RAM的情況只能使用數(shù)據(jù)讀取指令LDR直接向程序計(jì)數(shù)器PC中賦值;而且必須將中斷向量表從ROM中復(fù)制到RAM的地址0x0開(kāi)始處的存儲(chǔ)空間中。19AssembleLanguageofARM9.4SWI異常中斷處理程序通過(guò)SWI異常中斷,用戶模式的應(yīng)用程序可以調(diào)用系統(tǒng)模式下的代碼。在SWI指令中包括一個(gè)24位的立即數(shù),指示了用戶請(qǐng)求的特定的SWI功能。20AssembleLanguageofARM軟中斷SWI0x01向量表用戶程序(C/ASM)SWI處理程序(ASM)(可選)SWI處理程序(C)用戶程序調(diào)用SWISWI中斷處理程序包含匯編部分和可選用的C部分21AssembleLanguageofARM9.4.2SWI異常中斷調(diào)用執(zhí)行SWI指令后,系統(tǒng)將會(huì)把CPSR寄存器的內(nèi)容保存到寄存器SPSR_svc中,將返回地址保存到LR_svc中。在特權(quán)模式調(diào)用SWI須將原始的寄存器SPSP_svc和寄存器LR_svc值保存在數(shù)據(jù)棧中,以免內(nèi)容被破壞。從應(yīng)用程序中調(diào)用SWI使用匯編指令調(diào)用特定的SWI功能從C程序中調(diào)用特定的SWI功能從應(yīng)用程序中動(dòng)態(tài)調(diào)用SWI直到運(yùn)行時(shí)才能確定需要調(diào)用的SWI功能號(hào)22AssembleLanguageofARMSWI調(diào)用匯編中,SWI調(diào)用使用“SWI中斷號(hào)”實(shí)現(xiàn),e.g:

SWI0x24小心在匯編中如果SWI調(diào)用時(shí)處于Supervisor模式將會(huì)沖掉LR_svc.例如:在SWI處理程序中的二級(jí)調(diào)用解決方法:在SWI調(diào)用之前對(duì)LR_svc壓棧保護(hù)

C中,使用關(guān)鍵詞“__swi”來(lái)定義一個(gè)軟中斷函數(shù).

ForExamplecompilesto:__swi(0x24)voidmy_swi(void);

voidfoo(void){my_swi();} fooSTMFD sp!,{lr}SWI 0x24LDMFD sp!,{pc}23AssembleLanguageofARM傳遞參數(shù)到SWIs參數(shù)傳遞使用:SWI號(hào)(e.g.semi-hosting,使用0x123456(ARM)or0xAB(Thumb)內(nèi)核寄存器匯編中,簡(jiǎn)單設(shè)置需要的寄存器,然后調(diào)用SWI即可:

LDRr1,=Text ;stringpointer

MOVr0,#4 ;SYS_WRITE0

SWI0x123456 ;ARMsemihostingSWI : Text DCB"ARM”,0

C中,關(guān)鍵字“__swi”允許最多4個(gè)參數(shù),使用r0-r3來(lái)傳遞Note:因?yàn)镾WI調(diào)用將切換到supervisor模式,所以不能采用堆棧來(lái)傳遞參數(shù)函數(shù)聲明__swi(0x123456)voidSemihosting(unsignedop,char*s);函數(shù)調(diào)用

Semihosting(0x4,“ARM”);24AssembleLanguageofARM存取SWI號(hào)ARM內(nèi)核不提供直接傳遞軟中斷(SWI)號(hào)到處理程序的機(jī)制:SWI處理程序必須定位SWI指令,并提取SWI指令中的常數(shù)域?yàn)榇?SWI處理程序必須確定SWI調(diào)用是在哪一種狀態(tài)(ARM/Thumb).檢查SPSR的T-bitSWI指令在ARM狀態(tài)下在LR-4位置,Thumb狀態(tài)下在LR-2位置SWI指令按相應(yīng)的格式譯碼:ARM態(tài)格式:Thumb態(tài)格式:283124270

Cond

1111SWInumber231587011011111SWInumber25AssembleLanguageofARM存取SWI參數(shù)匯編中,存取調(diào)用者設(shè)置的寄存器即可.在返回之前,修改寄存器的值,傳回參數(shù)給調(diào)用者.傳參數(shù)給C,通常采用壓棧的方法.將參數(shù)壓棧給調(diào)用的函數(shù)傳遞一個(gè)指向這些參數(shù)的指針也可以通過(guò)將參數(shù)值寫(xiě)回到適當(dāng)?shù)亩褩N恢?,將參?shù)傳回26AssembleLanguageofARM軟中斷(SWI)處理示例

SWI_Handler;中斷向量表中使用BSWI-Handler指令

T_bit EQU0x20 STMFDsp!,{r0-r3,r12,lr}

MOVr1,sp

MRSr0,spsr

STMFDsp!,{r0}

TSTr0,#T_bit

LDRNEHr0,[lr,#-2]

BICNEr0,r0,#0xff00

LDREQr0,[lr,#-4]

BICEQr0,r0,#0xff000000

;r0nowcontainsSWInumber

;r1nowcontainspointertoparametersonstack

BLC_SWI_Handler;根據(jù)中斷號(hào)跳轉(zhuǎn)到相應(yīng)的功能程序

LDMFDsp!,{r1}

MSRspsr_csxf,r1

LDMFDsp!,{r0-r3,r12,pc}^提取SWI指令的常量域(24-bits:如果從ARM中調(diào)用,8-bits:如果從Thumb中調(diào)用)恢復(fù)寄存器并返回取出spsr并壓棧保存寄存器壓棧,設(shè)置堆棧指針調(diào)用CSWI處理程序{}}{27AssembleLanguageofARMSWI異常中斷的處理程序:通常我們把SWI的中斷處理程序分為兩級(jí)分別完成

1)立即數(shù)的讀取和功能

2)調(diào)用的執(zhí)行

其指令代碼如下

stmfdsp!,{r0-r12,lr}

;保護(hù)現(xiàn)場(chǎng)保存寄存器的值

ldrr0,[lr,#-4]

;lr寄存器保存指令

bicr0,r0,#0xff000000

;讀取指令中的24位立即數(shù)

cmpR0,#MaxOfSWI

;判斷立即數(shù)是否有效

ldrlspc,[pc,r0,lsl#2]

bOutOfSWIRange;超出范圍

JumpListofSWI

dcdSWIPro_0

dcdSWIPro_1

;其他所有的軟中斷入口

SWIPro_0

;進(jìn)入SWI對(duì)應(yīng)立即數(shù)0的中斷處理程序

;對(duì)應(yīng)立即數(shù)0的中斷處理程序

bEndOfSWI

SWIPro0

;進(jìn)入SWI對(duì)應(yīng)立即數(shù)1的中斷處理程序

;對(duì)應(yīng)立即數(shù)1的中斷處理程序

bEndOfSWI

;其他的SWI處理程序

EndOfSWI

ldmfdsp!,{r0-r12,pc}^

;恢復(fù)各寄存器28AssembleLanguageofARMCSWI處理程序示例//Memorymappedregistersvolatileunsignedparallel_output,parallel_input;:voidC_SWI_Handler(unsignednumber,int*param)//r0=SWInumber//r1=pointertoSWIparametersinmemory{

switch(number){ case0:parallel_output=param[0];break; case1:param[0]=parallel_input;break; default:break;}}29AssembleLanguageofARM9.5FIQ和IRQ異常中斷處理程序FIQ和IRQ異常中斷用于外部設(shè)備向CPU請(qǐng)求中斷服務(wù),這兩個(gè)中斷的引腳都是低電平有效的。當(dāng)CPSR中的F和I控制位為1時(shí),F(xiàn)IQ和IRQ異常中斷被屏蔽。FIQ比IRQ優(yōu)先級(jí)高,表現(xiàn)在:當(dāng)FIQ和IRQ異常中斷同時(shí)產(chǎn)生時(shí),CPU先處理FIQ異常中斷。在FIQ異常中斷處理程序中IRQ異常中斷被禁止。30AssembleLanguageofARM外部中斷ARM有兩級(jí)外部中斷FIQ,IRQ.可是大多數(shù)的基于ARM的系統(tǒng)有>2個(gè)的中斷源!因此需要一個(gè)中斷控制器(通常是地址映射的)來(lái)控制中斷是怎樣傳遞給ARM的。在許多系統(tǒng)中,一些中斷的優(yōu)先級(jí)比其它中斷的優(yōu)先級(jí)高,他們要搶先任何正在處理的低優(yōu)先級(jí)中斷。Note:通常中斷處理程序總是應(yīng)該包含清除中斷源的代碼。地址映射中斷控制器nIRQnFIQARMMultiple

Peripheral

interrupt

sourcesARM讀控制器寄存器并找到IRQ/FIQ中斷源ARM寫(xiě)外設(shè)寄存器清相應(yīng)中斷源31AssembleLanguageofARMFIQvsIRQFIQ和IRQ提供了非?;镜膬?yōu)先級(jí)級(jí)別。在下邊兩種情況下,F(xiàn)IQs有高于IRQs的優(yōu)先級(jí):當(dāng)多個(gè)中斷產(chǎn)生時(shí),F(xiàn)IQ高于IRQ.處理FIQ時(shí)禁止IRQs.IRQs將不會(huì)被響應(yīng)直到FIQ處理完成.FIQs的設(shè)計(jì)使中斷處理盡可能的快.FIQ向量位于中斷向量表的最末.為了使中斷處理程序可從中斷向量處連續(xù)執(zhí)行FIQ模式有5個(gè)額外的私有寄存器(r8-r12)中斷處理必須保護(hù)其使用的非私有寄存器可以有多個(gè)FIQ中斷源,但是考慮到系統(tǒng)性能應(yīng)避免嵌套。32AssembleLanguageofARMC語(yǔ)言簡(jiǎn)單中斷處理程序在C中可以在函數(shù)定義時(shí)使用關(guān)鍵詞“__irq”來(lái)寫(xiě)一個(gè)簡(jiǎn)單的中斷處理程序.這將導(dǎo)致:函數(shù)所有用到的寄存器被保護(hù)如果可能,任何遠(yuǎn)程調(diào)用所使用的其他寄存器也被保護(hù)函數(shù)退出使用正確的返回指令(修正pc=lr-4并從spsr恢復(fù)cpsr)__irq僅僅可在armcc中使用.可是被__irq函數(shù)調(diào)用的子程序可以用tcc編譯.確保IRQ的堆棧指針已經(jīng)設(shè)置!33AssembleLanguageofARMC中斷處理示例

__irqvoidIRQHandler(void) {volatileunsignedint*source=(unsignedint*)0x80000000;if(*source==1) //whichinterruptwasit int_handler_1(); //processtheinterrupt //insertchecksforotherinterruptsourceshere *(source+1)=0; //cleartheinterrupt }Outputwithout__irq Outputwith__irq

STMFDsp!,{r4,lr} STMFDsp!,{r0-r4,r12,lr} MOVr4,#0x80000000 MOVr4,#0x80000000 LDRr0,[r4,#0] LDRr0,[r4,#0] CMPr0,#1 CMPr0,#1 BLEQint_handler_1 BLEQint_handler_1 MOVr0,#0 MOVr0,#0dfg STRr0,[r4,#4] STRr0,[r4,#4] LDMFDsp!,{r4,pc} LDMFDsp!,{r0-r4,r12,lr} SUBSpc,lr,#434AssembleLanguageofARMC中斷處理示例__irqvoidIRQHandler(void){ volatileunsignedint*source=(unsignedint*)0x80000000; if(*source==1) //whichinterruptwasit?

int_handler_1(); //processtheinterrupt //insertchecksforotherinterruptsourceshere *(source+1)=0; //cleartheinterrupt

}

Outputwithout__irq Outputwith__irqSTMFDsp!,{r4,lr}MOVr4,#0x80000000LDRr0,[r4,#0]CMPr0,#1LEQint_handler_1MOVr0,#0STRr0,[r4,#4]LDMFDsp!,{r4,pc}STMFDsp!,{r0-r4,r12,lr}MOVr4,#0x80000000LDRr0,[r4,#0]CMPr0,#1BLEQint_handler_1MOVr0,#0STRr0,[r4,#4]LDMFDsp!,{r0-r4,r12,lr}SUBSpc,lr,#435AssembleLanguageofARM中斷重新使能的問(wèn)題當(dāng)另外一個(gè)中斷搶先當(dāng)前中斷時(shí),如果程序員使用下邊特殊的步驟來(lái)防止系統(tǒng)狀態(tài)丟失,中斷是可以嵌套:保存IRQ狀態(tài)下的LR(LR_irq)保存IRQ狀態(tài)下的SPSR(SPSR_IRQ)當(dāng)中斷可重入時(shí),在中斷處理程序中使用“BL…”必須特別小心:如果第二個(gè)中斷產(chǎn)生,BL調(diào)用的返回地址(LR_irq)可能被沖掉,子程序?qū)㈠e(cuò)誤的返回–導(dǎo)致無(wú)限循環(huán)!解決方法是在使用“BL…”之前改變模式來(lái)避免LR_irq被沖掉通常使用“System”模式(這時(shí)BL使用LR_usr)在處理程序結(jié)束,必須:切換回IRQ模式禁止中斷(來(lái)避免在恢復(fù)SPSR_irq到一個(gè)臨時(shí)的寄存器中后它被沖掉).__irq不能用來(lái)寫(xiě)可重入中斷處理程序必須采用采用下頁(yè)中匯編代碼段來(lái)代替。36AssembleLanguageofARMC可重入中斷示例IRQHandlerSUB lr,lr,#4STMFD sp!,{lr}MRS r14,SPSRSTMFD sp!,{r12,r14}

MOV r12,#IntBaseLDR r12,[r12,#IntSource]

MRS r14,CPSR

BIC r14,r14,#0x9F

ORR r14,r14,#0x1F

MSR CPSR_c,r14

STMFD sp!,{r0-r3,lr}MOV r0,r12BL C_irq_handlerLDMFD sp!,{r0-r3,lr}

MRS r12,CPSR

BIC r12,r12,0x1F

ORR r12,r12,0x92MSR CPSR_c,r12

LDMFD sp!,{r12,r14}MSR SPSR_csxf,r14LDMFD sp!,{PC}^切換到IRQ模式同時(shí)禁止IRQ.LR_irq,SPSR_irq和工作寄存器(r12)壓棧保護(hù)來(lái)避免下一次中斷發(fā)生使它們被沖掉}保存R0-3,LR_user到user棧中,然后調(diào)用C子程序,中斷源(R0)作為一個(gè)參數(shù)傳入C處理函數(shù)。}恢復(fù)LR_irq,SPSR_irq和工作寄存器(r12),然后退出中斷處理使用修正后的LR}讀/清中斷控制器中斷源{切換到System模式同時(shí)使能IRQ{{37AssembleLanguageofARM復(fù)位(reset)Reset處理程序執(zhí)行的動(dòng)作取決于不同的系統(tǒng).例如它可以:設(shè)置異常向量初始化存儲(chǔ)器系統(tǒng)(e.g.MMU/PU)初始化所有需要的模式的堆棧和寄存器初始化所有C所需的變量初始化所有I/O設(shè)備使能中斷改變處理器模式或/和狀態(tài)調(diào)用主應(yīng)用程序詳細(xì)資料請(qǐng)參考“EmbeddedSoftwareDevelopment”模塊.未定義指令下列情況將引起未定義指令異常:ARM試圖執(zhí)行一真正的未定義指令A(yù)RM遇到一協(xié)處理器指令,可是系統(tǒng)中的協(xié)處理器硬件并不存在ARM遇到一協(xié)處理器指令,系統(tǒng)中協(xié)處理器硬件也存在,可是ARM不是在超級(jí)用戶模式(privilegedmode)例如:操作協(xié)處理器15(cp15)-ARMcache控制器解決方法:在處理程序中執(zhí)行軟協(xié)處理器仿真禁止在非超級(jí)用戶模式下操作報(bào)告錯(cuò)誤并退出39AssembleLanguageofARM預(yù)取異常不論異常是發(fā)生在ARM還是Thumb狀態(tài)下,導(dǎo)致預(yù)取異常的指令地址在lr-4處.處理方法取決于存儲(chǔ)器管理策略有存儲(chǔ)器管理的系統(tǒng)(e.g.demandpagedvirtualmemory)修正問(wèn)題(e.g.enablecorrectmemorypage)返回并重新執(zhí)行預(yù)取異常的指令(SUBSpc,lr,#4)沒(méi)有存儲(chǔ)器管理的系統(tǒng)通常表示一個(gè)致命的錯(cuò)誤報(bào)告錯(cuò)誤(如果可能)然后退出數(shù)據(jù)異常導(dǎo)致異常的指令的地址在lr-8處.處理方法取決于存儲(chǔ)器管理策略有存儲(chǔ)器管理的系統(tǒng)(e.g.demanddvirtualmemory)如果使用了MMU,數(shù)據(jù)異常的地址在MMU的“FaultAddress”寄存器中修正問(wèn)題(e.g.enablecorrectpageofmemory)返回并重新執(zhí)行數(shù)據(jù)異常的指令

SUBSpc,lr,#8沒(méi)有存儲(chǔ)器管理的系統(tǒng)通常表示一個(gè)致命的錯(cuò)誤報(bào)告錯(cuò)誤(如果可能)然后退出TheAbortModel許多ARM存儲(chǔ)器存取指令將更新基址寄存器:e.g.LDR r0,[r1,#8]! ;“!”將更新R1如果異常是數(shù)據(jù)異常,對(duì)基址寄存器的影響取決于使用的是哪種ARMcore.“BaseRestoredAbortModel”StrongARM,ARM9andARM10系列支持基址寄存器由ARMcore自動(dòng)恢復(fù).“BaseUpdatedAbortModel”ARM7TDMI系列支持在異常指令重新執(zhí)行之前基址寄存器必須由處理程序進(jìn)行恢復(fù)兩種模式的例子程序包含在ADSexamples目錄下。異常返回地址ARM狀態(tài):在異常產(chǎn)生的時(shí)候內(nèi)核設(shè)置LR_mode=PC-4.處理程序需要調(diào)整LR_mode(取決于是哪一個(gè)異常發(fā)生了),以便返回到正確的地址Thumb狀態(tài):處理器根據(jù)發(fā)生的異常自動(dòng)修改存在LR_mode中的地址不論異常產(chǎn)生時(shí)的狀態(tài)如何,處理器確保處理程序的ARM返回指令能返回到正確的地址(和正確的狀態(tài))從SWIs和未定義指令返回異常是由指令本身引起的,因此內(nèi)核在計(jì)算LR時(shí)的PC值并沒(méi)有被更新.

ARM

ThumbSWI pc-8

pc-4;Exceptiontakenherexxx

pc-4

pc-2;lr=nextinstructionyyypc

pc因此返回指令為:

MOVSpc,lrNote:表示異常返回后將執(zhí)行的那條指令從FIQs和IRQs返回異常在當(dāng)前指令執(zhí)行完成后才被響應(yīng).因此內(nèi)核在計(jì)算LR時(shí)的PC值已被更新.

ARM

Thumbwww pc-12

pc–6Interruptoccurredduringexecutionxxx

pc-8

pc-4yyypc–4

pc–2ARMlr=nextinstructionzzzpc

pcThumblr=twoinstructionsahead因此返回指令為:

SUBSpc,lr,#4Note:表示異常返回后將執(zhí)行的那條指令從預(yù)取異常返回當(dāng)指令到達(dá)執(zhí)行階段時(shí)異常才產(chǎn)生,因此內(nèi)核在計(jì)算LR時(shí)的PC值已被更新. 需要重新執(zhí)行導(dǎo)致異常的指令

ARM

Thumb

www

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論