第三章講 ARM異常處理與編程技巧_第1頁(yè)
第三章講 ARM異常處理與編程技巧_第2頁(yè)
第三章講 ARM異常處理與編程技巧_第3頁(yè)
第三章講 ARM異常處理與編程技巧_第4頁(yè)
第三章講 ARM異常處理與編程技巧_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第三章ARM異常處理與編程技巧

東南大學(xué)國(guó)家專(zhuān)用集成電路系統(tǒng)工程技術(shù)研究中心目錄3.1ARM異常處理3.2ARM編程技巧3.1ARM異常處理3.1.1ARM異常處理概述

-各種異常的優(yōu)先級(jí)ARM的七種異常有固定的優(yōu)先級(jí)復(fù)位數(shù)據(jù)預(yù)取異常FIQIRQ指令預(yù)取異常SWI異常未定義指令異常異常處理中寄存器的使用在異常發(fā)生時(shí)處理器模式的改變意味著異常處理程序至少需要訪問(wèn)下列寄存器:堆棧指針寄存器(SP_<mode>)連接寄存器(LR_<mode>)程序狀態(tài)保存寄存器(SPSR_<mode>)在FIQ異常處理中,5個(gè)其他的通用寄存器(r8_FIQ到r12_FIQ)其他的寄存器可以和發(fā)生異常之前的模式共用異常處理程序必須確保其他的寄存器在退出異常處理程序時(shí)恢復(fù)到進(jìn)入異常之前的值。這個(gè)可以通過(guò)在進(jìn)入異常時(shí)把工作寄存器的值壓入堆棧,在退出異常時(shí)再?gòu)棾龆褩?lái)實(shí)現(xiàn)。中斷處理ARM有兩級(jí)外部中斷-FIQ和IRQARM提供的FIQ和IRQ異常用于外部設(shè)備向CPU請(qǐng)求異常服務(wù)。這兩個(gè)異常的引腳都是低電平有效的。當(dāng)前程序狀態(tài)寄存器CPSR的I和F控制位可以屏蔽這兩個(gè)異常請(qǐng)求:當(dāng)程序狀態(tài)寄存器的CPSR中的I位和F位為1時(shí),F(xiàn)IQ和IRQ異常被屏蔽;當(dāng)程序狀態(tài)寄存器CPSR中的I位和F位為0時(shí),cpu正常響應(yīng)FIQ和IRQ異常請(qǐng)求。FIQ與IRQFIQ和IRQ提供了基本的優(yōu)先級(jí)FIQ的優(yōu)先級(jí)高于IRQ:當(dāng)多個(gè)中斷同時(shí)發(fā)生時(shí),首先處理FIQ中斷處理FIQ中斷時(shí)屏蔽IRQ中斷FIQ中斷處理完成并退出之后才會(huì)處理IRQ中斷ARM內(nèi)核在FIQ在快速響應(yīng)中斷上作了一些設(shè)計(jì)FIQ異常位于異常向量表的最后使得異常處理程序可以放在異常向量表之后FIQ工作模式有五個(gè)影子寄存器(r8_FIQ到r12_FIQ)可以有多個(gè)FIQ中斷源,但為了系統(tǒng)的性能避免嵌套中斷中斷嵌套ARM內(nèi)核只有二個(gè)外部中斷輸入信號(hào)nFIQ和nIRQ,但對(duì)于一個(gè)系統(tǒng)來(lái)說(shuō),中斷源可能多達(dá)幾十個(gè)。為此,在系統(tǒng)集成的時(shí)候,一般都會(huì)有一個(gè)中斷控制器來(lái)處理中斷信號(hào)。硬件處理有的系統(tǒng)在ARM的異常向量表之外,又增加了一張由中斷控制器控制的特殊向量表。當(dāng)由外設(shè)觸發(fā)一個(gè)中斷以后,PC能夠自動(dòng)跳到這張?zhí)厥庀蛄勘碇腥?,特殊向量表中的每個(gè)向量空間對(duì)應(yīng)一個(gè)具體的中斷源。軟件處理多數(shù)情況下是用軟件來(lái)處理異常分支。因?yàn)檐浖梢酝ㄟ^(guò)讀取中斷控制器來(lái)獲得中斷源的詳細(xì)信息。中斷服務(wù)例程(ISR)從中斷控制器獲取中斷源信息,跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)線程(IST)處理中斷。3.1.2進(jìn)入和退出異常的過(guò)程異常處理當(dāng)異常發(fā)生,ARM會(huì)拷貝CPSR到SPSR_<mode>設(shè)置正確的CPSR位切換到ARM狀態(tài)切換到異常模式禁止中斷保存返回地址在LR_<mode>設(shè)置PC到異常向量地址從異常返回時(shí),異常處理需要從SPSR_<mode>恢復(fù)CPSR從LR_<mode>恢復(fù)PC值這些只用于ARM狀態(tài)地址異常進(jìn)入模式優(yōu)先級(jí)(6最低)0x0000,0000復(fù)位管理模式10x0000,0004未定義指令未定義模式60x0000,0008軟件中斷管理模式60x0000,000C中止(預(yù)取指令)中止模式50x0000,0010中止(數(shù)據(jù))中止模式20x0000,0014保留保留未使用0x0000,0018IRQIRQ40x0000,001CFIQFIQ3從異常返回的指令對(duì)于SWI異常和未定義指令異常:MOVSpc,lr對(duì)于FIQ、IRQ和指令預(yù)取異常:SUBSpc,lr,#4對(duì)于數(shù)據(jù)預(yù)取異常:SUBSpc,lr,#8如果lr寄存器在入棧之前改變了還可以用帶有^號(hào)的LDR指令來(lái)恢復(fù)PC:LDMFDsp!,{pc}^這幾條指令都是普通的數(shù)據(jù)處理指令,特殊之處就是把PC寄存器作為了目標(biāo)寄存器,并且?guī)Я颂厥獾暮缶Y“S”或“^”,在特權(quán)模式下,“S”或“^”的作用就是使指令在執(zhí)行時(shí),同時(shí)完成從SPSR到CPSR的拷貝,達(dá)到恢復(fù)狀態(tài)寄存器的目的。SWI和未定義指令異常的返回

SWI和未定義指令異常是由當(dāng)前執(zhí)行的指令產(chǎn)生的,當(dāng)SWI和未定義指令異常產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值還未更新,它指向當(dāng)前指令后面第2條指令:

ARM ThumbSWI pc-8 pc-4 異常在這條指令處發(fā)生Xxx pc-4 pc-2 lr=下一條指令Yyy pc pc 返回指令:MOVPC,LR將寄存器LR中的值復(fù)制到程序計(jì)數(shù)器PC中,實(shí)現(xiàn)程序返回,同時(shí)將SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。

IRQ和FIQ異常的返回

當(dāng)IRQ和FIQ異常產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值已經(jīng)更新,它指向當(dāng)前指令后面第3條指令。

ARM Thumbwww pc-12 pc-6這條指令執(zhí)行過(guò)程中發(fā)生中斷Xxx pc-8 pc-4 Yyy pc-4 pc-2 lr=下一條指令Zzz pc pc 返回指令是SUBSPC,LR,#4。將寄存器LR中的值減4后,復(fù)制到程序計(jì)數(shù)器PC中,實(shí)現(xiàn)程序返回,同時(shí)將SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。指令預(yù)取中止異常處理程序的返回

當(dāng)發(fā)生指令預(yù)取中止異常時(shí),程序要返回到該有問(wèn)題的指令處,重新讀取并執(zhí)行該指令。因此指令預(yù)取中止異常處理程序因改返回到產(chǎn)生該指令預(yù)取中止異常的指令處,而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。

ARM Thumbwww pc-8 pc-4預(yù)取指令異常發(fā)生于此Xxx pc-4 pc-2 lr=下一條指令

Yyy pc pc 返回指令是SUBSPC,LR,#4。將寄存器LR中的值減4后,復(fù)制到程序計(jì)數(shù)器PC中,實(shí)現(xiàn)程序返回,同時(shí)將SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。數(shù)據(jù)訪問(wèn)中止異常處理器的返回

數(shù)據(jù)訪問(wèn)中止異常是由數(shù)據(jù)訪問(wèn)指令產(chǎn)生的,當(dāng)數(shù)據(jù)訪問(wèn)中止異常產(chǎn)生時(shí),程序計(jì)數(shù)器PC的值已經(jīng)更新,它指向當(dāng)前指令后面的第3條指令。

ARM Thumbwww pc-12 pc-6數(shù)據(jù)訪問(wèn)中止異常發(fā)生于此Xxx pc-8 pc-4 Yyy pc-4 pc-2 lr=下一條指令Zzz pc pc 返回指令是SUBSPC,LR,#8。將寄存器LR中的值減8后,復(fù)制到程序計(jì)數(shù)器PC中,實(shí)現(xiàn)程序返回,同時(shí)將SPSR_mode寄存器內(nèi)容復(fù)制到當(dāng)前程序狀態(tài)寄存器CPSR中。3.1.3異常處理程序的設(shè)計(jì)

_irq為了方便使用高級(jí)語(yǔ)言直接編寫(xiě)異常處理函數(shù),ARM編譯器對(duì)此作了特定的擴(kuò)展,可以使用函數(shù)聲明關(guān)鍵字_irq,編譯出來(lái)的函數(shù)就滿足異常響應(yīng)對(duì)現(xiàn)場(chǎng)保護(hù)和恢復(fù)的需要,并且自動(dòng)加入對(duì)LR進(jìn)行減4的處理,符合IRQ和FIQ中斷處理的要求。

保存ATPCS規(guī)定的被破壞的寄存器保存其他中斷處理程序中用到的寄存器同時(shí)將(LR-4)賦予程序計(jì)數(shù)器PC實(shí)現(xiàn)中斷處理程序的返回,并且恢復(fù)CPSR寄存器的內(nèi)容例:_irqvoidIRQHandler(void){ STMFD SP!,{r0-r4,r12,lr}volatileunsignedint*source=(unsignedint*)0x80000000; MOV r4,#0x80000000 LDR r0,[r4,#0]If(*source==1) CMP r0,#1Int_handler_1(); BLEQ int_handler_1 MOV r0,#0*(source)=0; STR r0,[r4,#0] LDMFD sp!,{r0-r4,r12,lr}} SUBS pc,lr,#4SWI異常通過(guò)SWI異常,用戶(hù)模式的應(yīng)用程序可以調(diào)用系統(tǒng)模式下的代碼。在實(shí)時(shí)操作系統(tǒng)(RTOS)中,通常使用SWI異常為用戶(hù)應(yīng)用程序提供系統(tǒng)功能調(diào)用。

SWI異常處理程序的實(shí)現(xiàn)在SWI指令中包括一個(gè)24位的立即數(shù),該立即數(shù)指示了用戶(hù)請(qǐng)求的特定的SWI功能。在SWI異常處理程序中要讀取該24位立即數(shù),這涉及到SWI異常模式下對(duì)寄存器LR的讀取,并且要從存儲(chǔ)器讀取該SWI指令。需要用匯編程序來(lái)實(shí)現(xiàn)。第1級(jí)SWI異常處理程序?yàn)閰R編程序,用于確定SWI指令中的24位立即數(shù)。第2級(jí)SWI異常處理程序具體實(shí)現(xiàn)SWI的各個(gè)功能,可以是匯編程序,也可以是C程序

SWI號(hào)ARM內(nèi)核沒(méi)有提供直接給SWI傳遞SWI號(hào)的機(jī)制Swi號(hào)必須在SWI指令中指定從swi指令中提取出swi號(hào)這樣的話,SWI異常處理必須確定調(diào)用SWI時(shí)處理器處于何種狀態(tài)(ARM狀態(tài)還是Thumb狀態(tài))檢查SPSR中的T位SWI指令在ARM狀態(tài)下位于LR-4處,在Thumb狀態(tài)下位于LR-2處SWI異常處理程序中給C程序傳遞參數(shù)為了傳遞參數(shù)給C程序,一般將參數(shù)壓入堆棧中給C語(yǔ)言實(shí)現(xiàn)的swi異常處理程序傳遞一個(gè)指向這些參數(shù)的指針也可以把值寫(xiě)回到堆棧的合適位置,這樣可以傳回參數(shù)在特權(quán)模式下調(diào)用SWI當(dāng)ARM運(yùn)行于管理模式時(shí)在匯編中調(diào)用SWI可能會(huì)破壞LR_svc寄存器的值例如調(diào)用第二級(jí)SWI異常處理程序時(shí)。執(zhí)行SWI指令后,系統(tǒng)會(huì)把CPSR寄存器的內(nèi)容保存到寄存器SPSR_svc中,將返回地址保存到LR_SVC中。這樣如果在執(zhí)行SWI指令時(shí),系統(tǒng)已經(jīng)處于特權(quán)模式下,這時(shí)寄存器SRSR_svc和LR_svc中的內(nèi)容就會(huì)破壞。解決方法:在調(diào)用SWI之前把SRSR_svc和LR_svc寄存器的值存入堆棧。第1級(jí)SWI異常處理程序T_bit EQU 0x20SWI_HanderSTMFD sp!,{r0-r3,r12,lr}MOV r1,spMRS r0,spsrSTMFD sp!,{r0}TST r0,#T_bitLDRNEH r0,[lr,#-2]BICNE r0,r0,#0xff00LDREQ r0,[lr,#-4]BICEQ r0,r0,#0xff000000BL C_SWI_HandlerLDMFD sp!,{r1}MSR spsr,r1LDMFD sp!,{r0-r3,r12,pc}^第2級(jí)SWI異常處理程序//memorymappedregistersVolatileunsignedparallel_output,parallel_input;VoidC_SWI_Handler(unsignednumber,int*param)//r0=SWInumber//r1=pointerroSWIparametersinmemory{Switch(number){Case0:parallel_output=param[0];break;Case1:param[0]=parallel_input;break;Default:break;}}應(yīng)用程序中調(diào)用SWI功能舉例#definesemiSWI 0x123456/*使用semihostingSWI輸出一個(gè)字符*/_swi(semiSWI)voidsemihosting(unsignedop,char*c);#definewriteC(c)semihosting(0x3,c)Voidwrite_a_charater(int

ch){Chartempch=ch;Writec(&tempch);}復(fù)位異常復(fù)位異常在系統(tǒng)加電或復(fù)位時(shí)執(zhí)行,它將進(jìn)行一些初始化工作,具體內(nèi)容與具體系統(tǒng)相關(guān),然后程序控制權(quán)交給應(yīng)用程序,因而復(fù)位異常處理程序不需要返回。復(fù)位異常處理程序一般執(zhí)行以下步驟:設(shè)置異常向量表;初始化數(shù)據(jù)桟和寄存器初始化存儲(chǔ)系統(tǒng),如系統(tǒng)中的MMU等(如果系統(tǒng)中包含這些部件的話)初始化一些關(guān)鍵的I/O設(shè)備使用中斷切換到合適的模式初始化C語(yǔ)言環(huán)境,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行未定義指令異常未定義指令異常在下面的情況下發(fā)生:ARM嘗試執(zhí)行一個(gè)真正的沒(méi)有定義的指令A(yù)RM遇到一個(gè)協(xié)處理器指令,但這個(gè)協(xié)處理器在系統(tǒng)中并不存在ARM遇到一個(gè)協(xié)處理器指令,這個(gè)協(xié)處理器在系統(tǒng)中存在,但是ARM運(yùn)行于非特權(quán)模式,于是拒絕這條指令這種機(jī)制可以用來(lái)通過(guò)軟件仿真系統(tǒng)中的某些部件的功能例:如果系統(tǒng)中不包含浮點(diǎn)運(yùn)算部件,CPU遇到浮點(diǎn)運(yùn)算指令時(shí),將發(fā)生未定義指令異常,在該未定義指令異常處理程序中可以通過(guò)其它的指令序列仿真該浮點(diǎn)運(yùn)算指令。Thumb指令集不包括協(xié)處理器,因而不需要這種指令仿真機(jī)制。指令預(yù)取異常無(wú)論異常發(fā)生在ARM狀態(tài)還是Thumb狀態(tài),返回指令都在地址lr-4處指令預(yù)取異常的處理取決于存儲(chǔ)器管理機(jī)制如果系統(tǒng)中不包含MMU單元,指令預(yù)取中止異常處理程序只是簡(jiǎn)單的報(bào)告錯(cuò)誤,然后退出。如果系統(tǒng)包含MMU單元,則發(fā)生錯(cuò)誤的指令觸發(fā)虛擬地址失效處理,在該失效處理程序中重新讀取該指令。數(shù)據(jù)預(yù)取異常無(wú)論異常發(fā)生在ARM狀態(tài)還是Thumb狀態(tài),返回指令都在地址lr-8處數(shù)據(jù)預(yù)取異常的處理取決于存儲(chǔ)器管理機(jī)制如果系統(tǒng)中不包含MMU,數(shù)據(jù)訪問(wèn)中止異常處理程序只是簡(jiǎn)單的報(bào)告錯(cuò)誤,然后退出。如果系統(tǒng)中包含MMU單元,數(shù)據(jù)訪問(wèn)中止異常處理程序要處理該數(shù)據(jù)訪問(wèn)中止。3.2ARM編程技巧3.2.1ATPCS介紹

-寄存器的使用規(guī)則子程序間通過(guò)寄存器R0~R3來(lái)傳遞參數(shù)。這時(shí),寄存器R0~R3可以計(jì)作A0~A3。被調(diào)用的子程序在返回前無(wú)需恢復(fù)寄存器R0~R3的內(nèi)容。在子程序中,使用寄存器R4~R11來(lái)保存局部變量。這時(shí),寄存器R4~R11可以計(jì)作V1~V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序進(jìn)入時(shí)必須保存這些寄存器的值,在返回前必須恢復(fù)這些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7來(lái)保存局部變量。寄存器R12用作子程序間的scratch寄存器,記作ip。在子程序間的連接代碼段中常有這種使用規(guī)則。寄存器R13用作數(shù)據(jù)棧指針,記作sp。在子程序中寄存器R13不能

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論