ADS異常處理課件_第1頁
ADS異常處理課件_第2頁
ADS異常處理課件_第3頁
ADS異常處理課件_第4頁
ADS異常處理課件_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

異常處理

ADS異常處理Agenda序言

中斷處理

軟中斷(SWI)處理

其它異常處理ADS異常處理VectorTableVectortablecanbeat

0xFFFF0000onARM720T

andonARM9/10familydevicesFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionReset0x1C0x180x140x100x0C0x080x040x00異常處理當(dāng)異常產(chǎn)生時,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)的異常向量返回時,異常處理需要:從SPSR_<mode>恢復(fù)CPSR從LR_<mode>恢復(fù)PCNote:這些操作只能在ARM態(tài)執(zhí)行.ADS異常處理從SWI和Undef異常返回 MOVS

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

SUBS

pc,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做為目的寄存器異常返回指令Seeendofpresentationforbackground

informationontheseinstructionsADS異常處理異常優(yōu)先級異常在當(dāng)前指令執(zhí)行完成之后才被響應(yīng)多個異常可以在同一時間產(chǎn)生

異常指定了優(yōu)先級和固定的服務(wù)順序:ResetDataAbortFIQIRQPrefetchAbortSWIUndefinedinstructionADS異常處理向量表指令>32Mbytes<4KbytesLiteralpoolcontainingaddressofUndefHandlerIRQhandlerwithin32MBytesBranch

instructionrangeSWIExceptionhandlerplacedonapplicableaddressboundaryFIQhandlerfollowsvectortable

Undefhandleroutside32MBytes

branchinstructionrange0x00x10000x20000000xFFC0x80x180x300000000xFFFFFFFF0x1C0x4MOVPC,#0x30000000BIRQ_handler0x30008000IRQHandlerSWIHandlerFIQHandlerLDRPC,[PC,#+0xFF0]UndefHandler0x30008000ADS異常處理ARMorThumb?Thumb/ARM混合應(yīng)用程序ARMCodeARMCodeThumb

CodeFIQIRQ(Reserved)DataAbortPrefetchAbortSoftwareInterruptUndefinedInstructionResetADS異常處理異常處理中的寄存器使用與異常發(fā)生相關(guān)的模式改變意味著所調(diào)用的異常處理程序至少要訪問:私有的SP_<mode>

(stackpointer).私有的LR_<mode>(linkregister).私有的SPSR_<mode>

(savedprogramstatusregister).在FIQ異常處理中,另有5個私有的通用寄存器(r8_fiqtor12_fiq).其它的寄存器是所有模式公用的.異常處理程序必須確保其他的寄存器在退出前恢復(fù)到原來的狀態(tài)這可以通過將任何正在使用的寄存器的內(nèi)容保存在堆棧中,并在返回前恢復(fù)來實現(xiàn)任何所需寄存器的初始化要有應(yīng)用程序的起始代碼來完成,參閱:“EmbeddedSoftwareDevelopment”ADS異常處理Agenda

序言

中斷處理

軟中斷(SWI)處理

其它異常處理ADS異常處理中斷處理ARM有兩級外部中斷FIQ,IRQ.可是大多數(shù)的基于ARM的系統(tǒng)有>2個的中斷源!因此需要一個中斷控制器(通常是地址映射的)來控制中斷是怎樣傳遞給ARM的。在許多系統(tǒng)中,一些中斷的優(yōu)先級比其它中斷的優(yōu)先級高,他們要搶先任何正在處理的低優(yōu)先級中斷。Note:通常中斷處理程序總是應(yīng)該包含清除中斷源的代碼。地址映射中斷控制器nIRQnFIQARMMultiple

Peripheral

interrupt

sourcesARM讀控制器寄存器并找到IRQ/FIQ中斷源ARM寫外設(shè)寄存器清相應(yīng)中斷源ADS異常處理FIQvsIRQFIQ和IRQ提供了非?;镜膬?yōu)先級級別。在下邊兩種情況下,F(xiàn)IQs有高于IRQs的優(yōu)先級:當(dāng)多個中斷產(chǎn)生時,F(xiàn)IQ高于IRQ.處理FIQ時禁止IRQs.IRQs將不會被響應(yīng)直到FIQ處理完成.FIQs的設(shè)計使中斷處理盡可能的快.FIQ向量位于中斷向量表的最末.為了使中斷處理程序可從中斷向量處連續(xù)執(zhí)行FIQ模式有5個額外的私有寄存器(r8-r12)中斷處理必須保護(hù)其使用的非私有寄存器可以有多個FIQ中斷源,但是考慮到系統(tǒng)性能應(yīng)避免嵌套。ADS異常處理C語言簡單中斷處理程序在C中可以在函數(shù)定義時使用關(guān)鍵詞“__irq”來寫一個簡單的中斷處理程序.這將導(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è)置!ADS異常處理C中斷處理示例

__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,#4ADS異常處理C中斷處理示例__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,#4ADS異常處理中斷重新使能的問題當(dāng)另外一個中斷搶先當(dāng)前中斷時,如果程序員使用下邊特殊的步驟來防止系統(tǒng)狀態(tài)丟失,中斷是可以嵌套:保存IRQ狀態(tài)下的LR(LR_irq)保存IRQ狀態(tài)下的SPSR(SPSR_IRQ)當(dāng)中斷可重入時,在中斷處理程序中使用“BL…”必須特別小心:如果第二個中斷產(chǎn)生,BL調(diào)用的返回地址(LR_irq)可能被沖掉,子程序?qū)㈠e誤的返回–導(dǎo)致無限循環(huán)!解決方法是在使用“BL…”之前改變模式來避免LR_irq被沖掉通常使用“System”模式(

這時BL使用LR_usr)在處理程序結(jié)束,必須:切換回IRQ模式禁止中斷(來避免在恢復(fù)SPSR_irq到一個臨時的寄存器中后它被沖掉).__irq不能用來寫可重入中斷處理程序必須采用采用下頁中匯編代碼段來代替。ADS異常處理

C可重入中斷示例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模式同時禁止IRQ.LR_irq,SPSR_irq和工作寄存器(r12)壓棧保護(hù)來避免下一次中斷發(fā)生使它們被沖掉}保存R0-3,LR_user到user棧中,然后調(diào)用C子程序,中斷源(R0)作為一個參數(shù)傳入C處理函數(shù)。}恢復(fù)LR_irq,SPSR_irq和工作寄存器(r12),然后退出中斷處理使用修正后的LR}讀/清中斷控制器中斷源{切換到System模式同時使能IRQ{{ADS異常處理Quiz1) 中斷向量表位于存儲器的什么位置?2) IRQ或FIQ異常的返回指令是什么?3) 什么類型的中斷優(yōu)先級最高?4) 什么指令可以放在中斷向量表?5) FIQ的什么特點使得它處理的速度比IRQ快?6) 在嵌套的中斷處理程序中,如何確保LR沒有被破壞?ADS異常處理Agenda

序言 中斷處理軟中斷(SWI)處理

其它異常處理ADS異常處理軟中斷SWI0x01向量表用戶程序(C/ASM)SWI處理程序(ASM)(可選)SWI處理程序(C)用戶程序調(diào)用SWISWI中斷處理程序包含匯編部分和可選用的C部分ADS異常處理SWI調(diào)用匯編中,SWI調(diào)用使用“SWI中斷號”實現(xiàn),e.g:

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

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

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

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

LDRr1,=Text ;stringpointer

MOVr0,#4 ;SYS_WRITE0

SWI0x123456 ;ARMsemihostingSWI : Text DCB"ARM”,0

C中,關(guān)鍵字“__swi”允許最多

4個參數(shù),使用r0-r3來傳遞Note:因為SWI調(diào)用將切換到supervisor模式,所以不能采用堆棧來傳遞參數(shù)函數(shù)聲明__swi(0x123456)voidSemihosting(unsignedop,char*s);函數(shù)調(diào)用

Semihosting(0x4,“ARM”);ADS異常處理ARM內(nèi)核不提供直接傳遞軟中斷(SWI)號到處理程序的機(jī)制:SWI處理程序必須定位SWI指令,并提取SWI指令中的常數(shù)域為此,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)格式:存取SWI號283124270

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

T_bit EQU0x20

SWI_Handler

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

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)用C

SWI處理程序{}}{ADS異常處理//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;}}C

SWI處理程序示例ADS異常處理Agenda

序言

中斷處理

軟中斷(SWI)處理其它異常處理ADS異常處理復(fù)位(reset)Reset處理程序執(zhí)行的動作取決于不同的系統(tǒng).例如它可以:設(shè)置異常向量初始化存儲器系統(tǒng)(e.g.MMU/PU)初始化所有需要的模式的堆棧和寄存器

初始化所有C所需的變量初始化所有I/O設(shè)備使能中斷改變處理器模式或/和狀態(tài)調(diào)用主應(yīng)用程序詳細(xì)資料請參考“EmbeddedSoftwareDevelopment”模塊.ADS異常處理未定義指令下列情況將引起未定義指令異常:ARM試圖執(zhí)行一真正的未定義指令A(yù)RM遇到一協(xié)處理器指令,可是系統(tǒng)中的協(xié)處理器硬件并不存在ARM遇到一協(xié)處理器指令,系統(tǒng)中協(xié)處理器硬件也存在,可是ARM不是在超級用戶模式(privilegedmode)例如:操作協(xié)處理器15(cp15)-ARMcache控制器解決方法:在處理程序中執(zhí)行軟協(xié)處理器仿真禁止在非超級用戶模式下操作報告錯誤并退出ADS異常處理預(yù)取異常不論異常是發(fā)生在ARM還是Thumb狀態(tài)下,導(dǎo)致預(yù)取異常的指令地址在lr-4處.處理方法取決于存儲器管理策略有存儲器管理的系統(tǒng)(e.g.demandpagedvirtualmemory)修正問題(e.g.enablecorrectmemorypage)返回并重新執(zhí)行預(yù)取異常的指令(SUBSpc,lr,#4)沒有存儲器管理的系統(tǒng)通常表示一個致命的錯誤報告錯誤(如果可能)然后退出ADS異常處理數(shù)據(jù)異常導(dǎo)致異常的指令的地址在lr-8處.處理方法取決于存儲器管理策略有存儲器管理的系統(tǒng)(e.g.demanddvirtualmemory)如果使用了MMU,數(shù)據(jù)異常的地址在MMU的“FaultAddress”寄存器中修正問題(e.g.enablecorrectpageofmemory)返回并重新執(zhí)行數(shù)據(jù)異常的指令

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

ARM

ThumbSWI pc-8

pc-4 ;Exceptiontakenherexxx

pc-4

pc-2 ;lr=nextinstructionyyy pc

pc因此返回指令為:

MOVSpc,lrNote:

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

ARM

Thumbwww pc-12

pc-6 Interruptoccurredduringexecutionxxx

pc-8

pc-4yyy p

溫馨提示

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

評論

0/150

提交評論