版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章ARM異常處理與編程技巧
東南大學國家專用集成電路系統(tǒng)工程技術研究中心目錄3.1ARM異常處理3.2ARM編程技巧3.1ARM異常處理3.1.1ARM異常處理概述
-各種異常的優(yōu)先級ARM的七種異常有固定的優(yōu)先級復位數(shù)據(jù)預取異常FIQIRQ指令預取異常SWI異常未定義指令異常異常處理中寄存器的使用在異常發(fā)生時處理器模式的改變意味著異常處理程序至少需要訪問下列寄存器:堆棧指針寄存器(SP_<mode>)連接寄存器(LR_<mode>)程序狀態(tài)保存寄存器(SPSR_<mode>)在FIQ異常處理中,5個其他的通用寄存器(r8_FIQ到r12_FIQ)其他的寄存器可以和發(fā)生異常之前的模式共用異常處理程序必須確保其他的寄存器在退出異常處理程序時恢復到進入異常之前的值。這個可以通過在進入異常時把工作寄存器的值壓入堆棧,在退出異常時再彈出堆棧來實現(xiàn)。中斷處理ARM有兩級外部中斷-FIQ和IRQARM提供的FIQ和IRQ異常用于外部設備向CPU請求異常服務。這兩個異常的引腳都是低電平有效的。當前程序狀態(tài)寄存器CPSR的I和F控制位可以屏蔽這兩個異常請求:當程序狀態(tài)寄存器的CPSR中的I位和F位為1時,F(xiàn)IQ和IRQ異常被屏蔽;當程序狀態(tài)寄存器CPSR中的I位和F位為0時,cpu正常響應FIQ和IRQ異常請求。FIQ與IRQFIQ和IRQ提供了基本的優(yōu)先級FIQ的優(yōu)先級高于IRQ:當多個中斷同時發(fā)生時,首先處理FIQ中斷處理FIQ中斷時屏蔽IRQ中斷FIQ中斷處理完成并退出之后才會處理IRQ中斷ARM內核在FIQ在快速響應中斷上作了一些設計FIQ異常位于異常向量表的最后使得異常處理程序可以放在異常向量表之后FIQ工作模式有五個影子寄存器(r8_FIQ到r12_FIQ)可以有多個FIQ中斷源,但為了系統(tǒng)的性能避免嵌套中斷中斷嵌套ARM內核只有二個外部中斷輸入信號nFIQ和nIRQ,但對于一個系統(tǒng)來說,中斷源可能多達幾十個。為此,在系統(tǒng)集成的時候,一般都會有一個中斷控制器來處理中斷信號。硬件處理有的系統(tǒng)在ARM的異常向量表之外,又增加了一張由中斷控制器控制的特殊向量表。當由外設觸發(fā)一個中斷以后,PC能夠自動跳到這張?zhí)厥庀蛄勘碇腥?,特殊向量表中的每個向量空間對應一個具體的中斷源。軟件處理多數(shù)情況下是用軟件來處理異常分支。因為軟件可以通過讀取中斷控制器來獲得中斷源的詳細信息。中斷服務例程(ISR)從中斷控制器獲取中斷源信息,跳轉到相應的中斷服務線程(IST)處理中斷。3.1.2進入和退出異常的過程異常處理當異常發(fā)生,ARM會拷貝CPSR到SPSR_<mode>設置正確的CPSR位切換到ARM狀態(tài)切換到異常模式禁止中斷保存返回地址在LR_<mode>設置PC到異常向量地址從異常返回時,異常處理需要從SPSR_<mode>恢復CPSR從LR_<mode>恢復PC值這些只用于ARM狀態(tài)地址異常進入模式優(yōu)先級(6最低)0x0000,0000復位管理模式10x0000,0004未定義指令未定義模式60x0000,0008軟件中斷管理模式60x0000,000C中止(預取指令)中止模式50x0000,0010中止(數(shù)據(jù))中止模式20x0000,0014保留保留未使用0x0000,0018IRQIRQ40x0000,001CFIQFIQ3從異常返回的指令對于SWI異常和未定義指令異常:MOVSpc,lr對于FIQ、IRQ和指令預取異常:SUBSpc,lr,#4對于數(shù)據(jù)預取異常:SUBSpc,lr,#8如果lr寄存器在入棧之前改變了還可以用帶有^號的LDR指令來恢復PC:LDMFDsp!,{pc}^這幾條指令都是普通的數(shù)據(jù)處理指令,特殊之處就是把PC寄存器作為了目標寄存器,并且?guī)Я颂厥獾暮缶Y“S”或“^”,在特權模式下,“S”或“^”的作用就是使指令在執(zhí)行時,同時完成從SPSR到CPSR的拷貝,達到恢復狀態(tài)寄存器的目的。SWI和未定義指令異常的返回
SWI和未定義指令異常是由當前執(zhí)行的指令產生的,當SWI和未定義指令異常產生時,程序計數(shù)器PC的值還未更新,它指向當前指令后面第2條指令:
ARM ThumbSWI pc-8 pc-4 異常在這條指令處發(fā)生Xxx pc-4 pc-2 lr=下一條指令Yyy pc pc 返回指令:MOVPC,LR將寄存器LR中的值復制到程序計數(shù)器PC中,實現(xiàn)程序返回,同時將SPSR_mode寄存器內容復制到當前程序狀態(tài)寄存器CPSR中。
IRQ和FIQ異常的返回
當IRQ和FIQ異常產生時,程序計數(shù)器PC的值已經更新,它指向當前指令后面第3條指令。
ARM Thumbwww pc-12 pc-6這條指令執(zhí)行過程中發(fā)生中斷Xxx pc-8 pc-4 Yyy pc-4 pc-2 lr=下一條指令Zzz pc pc 返回指令是SUBSPC,LR,#4。將寄存器LR中的值減4后,復制到程序計數(shù)器PC中,實現(xiàn)程序返回,同時將SPSR_mode寄存器內容復制到當前程序狀態(tài)寄存器CPSR中。指令預取中止異常處理程序的返回
當發(fā)生指令預取中止異常時,程序要返回到該有問題的指令處,重新讀取并執(zhí)行該指令。因此指令預取中止異常處理程序因改返回到產生該指令預取中止異常的指令處,而不是像前面兩種情況下返回到發(fā)生中斷的指令的下一條指令。
ARM Thumbwww pc-8 pc-4預取指令異常發(fā)生于此Xxx pc-4 pc-2 lr=下一條指令
Yyy pc pc 返回指令是SUBSPC,LR,#4。將寄存器LR中的值減4后,復制到程序計數(shù)器PC中,實現(xiàn)程序返回,同時將SPSR_mode寄存器內容復制到當前程序狀態(tài)寄存器CPSR中。數(shù)據(jù)訪問中止異常處理器的返回
數(shù)據(jù)訪問中止異常是由數(shù)據(jù)訪問指令產生的,當數(shù)據(jù)訪問中止異常產生時,程序計數(shù)器PC的值已經更新,它指向當前指令后面的第3條指令。
ARM Thumbwww pc-12 pc-6數(shù)據(jù)訪問中止異常發(fā)生于此Xxx pc-8 pc-4 Yyy pc-4 pc-2 lr=下一條指令Zzz pc pc 返回指令是SUBSPC,LR,#8。將寄存器LR中的值減8后,復制到程序計數(shù)器PC中,實現(xiàn)程序返回,同時將SPSR_mode寄存器內容復制到當前程序狀態(tài)寄存器CPSR中。3.1.3異常處理程序的設計
_irq為了方便使用高級語言直接編寫異常處理函數(shù),ARM編譯器對此作了特定的擴展,可以使用函數(shù)聲明關鍵字_irq,編譯出來的函數(shù)就滿足異常響應對現(xiàn)場保護和恢復的需要,并且自動加入對LR進行減4的處理,符合IRQ和FIQ中斷處理的要求。
保存ATPCS規(guī)定的被破壞的寄存器保存其他中斷處理程序中用到的寄存器同時將(LR-4)賦予程序計數(shù)器PC實現(xiàn)中斷處理程序的返回,并且恢復CPSR寄存器的內容例:_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異常通過SWI異常,用戶模式的應用程序可以調用系統(tǒng)模式下的代碼。在實時操作系統(tǒng)(RTOS)中,通常使用SWI異常為用戶應用程序提供系統(tǒng)功能調用。
SWI異常處理程序的實現(xiàn)在SWI指令中包括一個24位的立即數(shù),該立即數(shù)指示了用戶請求的特定的SWI功能。在SWI異常處理程序中要讀取該24位立即數(shù),這涉及到SWI異常模式下對寄存器LR的讀取,并且要從存儲器讀取該SWI指令。需要用匯編程序來實現(xiàn)。第1級SWI異常處理程序為匯編程序,用于確定SWI指令中的24位立即數(shù)。第2級SWI異常處理程序具體實現(xiàn)SWI的各個功能,可以是匯編程序,也可以是C程序
SWI號ARM內核沒有提供直接給SWI傳遞SWI號的機制Swi號必須在SWI指令中指定從swi指令中提取出swi號這樣的話,SWI異常處理必須確定調用SWI時處理器處于何種狀態(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語言實現(xiàn)的swi異常處理程序傳遞一個指向這些參數(shù)的指針也可以把值寫回到堆棧的合適位置,這樣可以傳回參數(shù)在特權模式下調用SWI當ARM運行于管理模式時在匯編中調用SWI可能會破壞LR_svc寄存器的值例如調用第二級SWI異常處理程序時。執(zhí)行SWI指令后,系統(tǒng)會把CPSR寄存器的內容保存到寄存器SPSR_svc中,將返回地址保存到LR_SVC中。這樣如果在執(zhí)行SWI指令時,系統(tǒng)已經處于特權模式下,這時寄存器SRSR_svc和LR_svc中的內容就會破壞。解決方法:在調用SWI之前把SRSR_svc和LR_svc寄存器的值存入堆棧。第1級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級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;}}應用程序中調用SWI功能舉例#definesemiSWI 0x123456/*使用semihostingSWI輸出一個字符*/_swi(semiSWI)voidsemihosting(unsignedop,char*c);#definewriteC(c)semihosting(0x3,c)Voidwrite_a_charater(int
ch){Chartempch=ch;Writec(&tempch);}復位異常復位異常在系統(tǒng)加電或復位時執(zhí)行,它將進行一些初始化工作,具體內容與具體系統(tǒng)相關,然后程序控制權交給應用程序,因而復位異常處理程序不需要返回。復位異常處理程序一般執(zhí)行以下步驟:設置異常向量表;初始化數(shù)據(jù)桟和寄存器初始化存儲系統(tǒng),如系統(tǒng)中的MMU等(如果系統(tǒng)中包含這些部件的話)初始化一些關鍵的I/O設備使用中斷切換到合適的模式初始化C語言環(huán)境,跳轉到應用程序執(zhí)行未定義指令異常未定義指令異常在下面的情況下發(fā)生:ARM嘗試執(zhí)行一個真正的沒有定義的指令ARM遇到一個協(xié)處理器指令,但這個協(xié)處理器在系統(tǒng)中并不存在ARM遇到一個協(xié)處理器指令,這個協(xié)處理器在系統(tǒng)中存在,但是ARM運行于非特權模式,于是拒絕這條指令這種機制可以用來通過軟件仿真系統(tǒng)中的某些部件的功能例:如果系統(tǒng)中不包含浮點運算部件,CPU遇到浮點運算指令時,將發(fā)生未定義指令異常,在該未定義指令異常處理程序中可以通過其它的指令序列仿真該浮點運算指令。Thumb指令集不包括協(xié)處理器,因而不需要這種指令仿真機制。指令預取異常無論異常發(fā)生在ARM狀態(tài)還是Thumb狀態(tài),返回指令都在地址lr-4處指令預取異常的處理取決于存儲器管理機制如果系統(tǒng)中不包含MMU單元,指令預取中止異常處理程序只是簡單的報告錯誤,然后退出。如果系統(tǒng)包含MMU單元,則發(fā)生錯誤的指令觸發(fā)虛擬地址失效處理,在該失效處理程序中重新讀取該指令。數(shù)據(jù)預取異常無論異常發(fā)生在ARM狀態(tài)還是Thumb狀態(tài),返回指令都在地址lr-8處數(shù)據(jù)預取異常的處理取決于存儲器管理機制如果系統(tǒng)中不包含MMU,數(shù)據(jù)訪問中止異常處理程序只是簡單的報告錯誤,然后退出。如果系統(tǒng)中包含MMU單元,數(shù)據(jù)訪問中止異常處理程序要處理該數(shù)據(jù)訪問中止。3.2ARM編程技巧3.2.1ATPCS介紹
-寄存器的使用規(guī)則子程序間通過寄存器R0~R3來傳遞參數(shù)。這時,寄存器R0~R3可以計作A0~A3。被調用的子程序在返回前無需恢復寄存器R0~R3的內容。在子程序中,使用寄存器R4~R11來保存局部變量。這時,寄存器R4~R11可以計作V1~V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序進入時必須保存這些寄存器的值,在返回前必須恢復這些寄存器的值。在Thumb程序中,通常只能使用寄存器R4~R7來保存局部變量。寄存器R12用作子程序間的scratch寄存器,記作ip。在子程序間的連接代碼段中常有這種使用規(guī)則。寄存器R13用作數(shù)據(jù)棧指針,記作sp。在子程序中寄存器R13不能
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財務部年終報告開創(chuàng)新局面引領新風尚
- 手工藝行業(yè)衛(wèi)生衛(wèi)生控制
- 2025-2030全球電子后視鏡系統(tǒng)行業(yè)調研及趨勢分析報告
- 2025-2030全球聯(lián)合收割機皮帶行業(yè)調研及趨勢分析報告
- 2025-2030全球3D 打印陶瓷絲行業(yè)調研及趨勢分析報告
- 2025年全球及中國智能睡眠盒行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 2025-2030全球IP65工業(yè)顯示器行業(yè)調研及趨勢分析報告
- 2025-2030全球機器人用立體攝像頭行業(yè)調研及趨勢分析報告
- 2025-2030全球不銹鋼面板安裝顯示器行業(yè)調研及趨勢分析報告
- 2025-2030全球全液壓解耦系統(tǒng)行業(yè)調研及趨勢分析報告
- 中國儲備糧管理集團有限公司蘭州分公司招聘筆試真題2024
- 第1課 隋朝統(tǒng)一與滅亡 課件(26張)2024-2025學年部編版七年級歷史下冊
- 提高金剛砂地坪施工一次合格率
- 【歷史】唐朝建立與“貞觀之治”課件-2024-2025學年統(tǒng)編版七年級歷史下冊
- 產業(yè)園區(qū)招商合作協(xié)議書
- 2024年廣東省公務員錄用考試《行測》真題及答案解析
- 2025新譯林版英語七年級下單詞默寫表
- 盾構標準化施工手冊
- 天然氣脫硫完整版本
- 中歐班列課件
- 2025屆高三數(shù)學一輪復習備考經驗交流
評論
0/150
提交評論