版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第五章 異常及編程5.1 ARM的異常5.2 復(fù)位及編程5.3 SWI中斷處理程序5.4 FIQ和IRQ中斷處理程序5.1 ARM的異常 程序正常執(zhí)行流程中,程序計數(shù)器在其地址范圍內(nèi)連續(xù)增加,還可以跳轉(zhuǎn)至附近程序標號或跳轉(zhuǎn)并鏈接到子程序。 當該常規(guī)執(zhí)行流程被轉(zhuǎn)向到啟用處理器處理內(nèi)部或外部資源產(chǎn)生的事件時,即發(fā)生了處理器異常。外部產(chǎn)生的中斷;處理器試圖執(zhí)行一個未定義的指令;訪問有特權(quán)的操作系統(tǒng)函數(shù)。 處理此類異常時,有必要保護處理器先前的狀態(tài),以保證在完成相應(yīng)的異常處理例程后能夠恢復(fù)產(chǎn)生異常時程序運行的狀態(tài),使其繼續(xù)執(zhí)行。異常 說 明復(fù)位在處理器復(fù)位管腳有效時發(fā)生。該異常僅在處理器上電時或上電后
2、的復(fù)位時才發(fā)生。可通過跳轉(zhuǎn)到復(fù)位向量(0 x0000)來完成軟復(fù)位。未定義指令在處理器或協(xié)處理器均不能識別當前指令時發(fā)生。軟件中斷(SWI)這是一個用戶定義的同步中斷指令。它使得在USER模式下運行的程序能夠請求在Supervisor模式下運行的特權(quán)操作,如:RTOS函數(shù)等。預(yù)取指中斷在處理器試圖執(zhí)行一個未取指令時發(fā)生,因為地址非法。數(shù)據(jù)中斷在數(shù)據(jù)傳送指令試圖在非法地址存儲數(shù)據(jù)時發(fā)生。IRQ在處理器外部中斷引腳低電平有效且CPSR的I位為0時發(fā)生。FIQ在處理器外部中斷引腳低電平有效且CPSR的F位為0時發(fā)生。ARM處理器模式處理器模式說 明備 注USER正常程序運行的工作模式不能直接切換到其
3、它模式特權(quán)模式SYS用于支持操作系統(tǒng)的特權(quán)任務(wù)等可直接切換到其它模式異常模式SVC操作系統(tǒng)使用的一種保護模式在系統(tǒng)重啟和復(fù)位時,才進入此模式FIQ快速中斷請求處理只有在FIQ異常響應(yīng)時,才進入此模式IRQ中斷請求處理只有在IRQ異常響應(yīng)時,才進入此模式ABT用于虛擬內(nèi)存和存儲器保護在ARM7內(nèi)核中沒有用UND支持軟件仿真的硬件協(xié)處理器只有在未定義指令異常響應(yīng)時,才進入此模式ARM異常處理過程ARM產(chǎn)生異常時,在任何情況下處理異常的方法都是一樣的,即:(1)通過將PC拷貝到R14_exc以及將CPSR拷貝SPSR_exc來保存當前的狀態(tài)( exc表示異常類型) 。(2)將處理器操作模式改變?yōu)檫m當
4、的異常模式。(3)禁用中斷。(4)將PC強制變?yōu)?0H1CH范圍內(nèi)某個與異常類型有關(guān)的特殊值(向量地址)。這個向量地址是指向異常處理程序的轉(zhuǎn)移指令也即開始執(zhí)行異常處理程序。從異常處理程序的返回從異常返回的方法取決于該異常處理程序使用不使用堆棧操作。通常情況下,異常處理的返回必須:從SPSR_exc恢復(fù)CPSR;使用R14_exc(LR)中的返回地址恢復(fù)程序計數(shù)器PC。不必從復(fù)位處理程序返回,因為復(fù)位處理程序直接執(zhí)行主代碼。如果異常處理程序使用了堆棧,可以通過使用一條裝載多個帶限定符的指令來返回。LDMFDSP!, R0R12,PC 限定符指定從SPSR_exc恢復(fù)CPSR。從SWI和未定義指令
5、異常處理程序返回SWI和未定義指令異常是由指令本身造成的,因此,處理異常時,處理器將(PC - 4)存儲在R14_exc中。因而使R14_exc指向下一條要執(zhí)行的指令。要從R14中恢復(fù)程序計數(shù)器,則使用:MOVS PC,R14從處理程序返回控制權(quán)。將返回地址推入堆中并在返回時將其彈出的處理程序入口和出口代碼為:STMFD SP!, reglist,R14 ;.LDMFD SP!, reglist,PC 從FIQ和IRQ中斷處理程序返回執(zhí)行完每一條指令后,處理器檢測中斷管腳是否為 LOW(電平),以及 CPSR中斷禁用位是否為清除。結(jié)果,僅在程序計數(shù)器被更新后才發(fā)生 IRQ 或 FIQ 異常。處
6、理器將 (PC - 4) 存儲在R14_exc中。使R14_exc指向發(fā)生異常時尚未完成的一條指令。處理程序完成后,必須從 R14_exc指向的上一條指令處繼續(xù)運行。該繼續(xù)執(zhí)行地址較R14_exc中的地址少一個字(四個字節(jié)),因此,其返回指令為:SUBS PC, R14,#4將返回地址壓入棧中并在返回時將其彈出的處理程序入口和出口代碼為:SUB R14,R14,#4STMFD SP!, reglist,R14 ;.LDMFD SP!, reglist,PC 對于發(fā)生在 Thumb 狀態(tài)下的異常,處理程序返回指令 (SUBS PC,R14,#4) 改變了程序計數(shù)器,將其指向下一條要執(zhí)行指令的地址
7、。由于程序計數(shù)器的更新是在處理異常之前完成,下一條指令應(yīng)在 (PC - 4) 。因此,處理器存儲在R14_exc的值為PC 。安裝異常處理程序必須將任何新的異常處理程序安裝在向量表中。安裝完成后,不論什么時候產(chǎn)生相應(yīng)的異常,都會執(zhí)行新的處理程序。在復(fù)位時安裝處理程序如果ROM是在存儲器的0 x00位置,則可在代碼的起始處為每個向量分配一個跳轉(zhuǎn)語句。如果FIQ處理程序是直接從0 x1C運行的,則也可將FIQ處理程序包含在其中(見下面示例)。示例展示了如果它們位于ROM的零地址時建立向量的代碼。可替換裝入的跳轉(zhuǎn)語句。Vector_Init_BlockLDR PC,Reset_AddrLDR PC,
8、Undefined_AddrLDR PC,SWI_AddrLDR PC,Prefetch_AddrLDR PC,Abort_AddrNOP ;Reserved vectorLDR PC,IRQ_AddrLDR PC,F(xiàn)IQ_AddrReset_Addr DCD Start_BootUndefined_Addr DCD Undefined_HandlerSWI_Addr DCD SWI_HandlerPrefetch_Addr DCD Prefetch_HandlerAbort_Addr DCD Abort_HandlerDCD 0 ;Reserved vectorIRQ_Addr DCD IR
9、Q_HandlerFIQ_Addr DCD FIQ_Handler復(fù)位狀態(tài)下,必須使ROM處在0 x0位置。復(fù)位代碼可將RAM映射到0 x0位置 。這樣做之前,它需從ROM的某個區(qū)域?qū)⒃撓蛄浚ǜ鶕?jù)需要還有FIQ處理程序)復(fù)制到RAM中。在此情況下,必須用一條LDR PC指令為復(fù)位處理程序確定地址,以便使復(fù)位向量代碼能獨立定位。示例將上面示例給出的向量復(fù)制到了RAM中的向量表。MOV R8, #0ADR R9, Vector_Init_BlockLDMIA R9!,R0-R7 ;Copy the vectors (8 words)STMIA R8!,R0-R7LDMIA R9!,R0-R7 ;C
10、opy the DCDed addressesSTMIA R8!,R0-R7 ;(8 words again)從C安裝處理程序開發(fā)過程中有時必需從主應(yīng)用程序直接將異常處理程序安裝在向量中。結(jié)果,所需的指令編碼必須被寫到相應(yīng)的向量地址中。這可由跳轉(zhuǎn)和載入PC兩種方法來轉(zhuǎn)到該處理程序。跳轉(zhuǎn)方法:1. 獲取異常處理程序的地址。2. 減去相應(yīng)向量的地址。3. 減去0 x8以便預(yù)取。4. 將結(jié)果右移兩位給出一個字的偏移,而不是一個字節(jié)的偏移。5. 測試其高八位為清除,確保結(jié)果僅為24位長(因為跳轉(zhuǎn)的偏移被限制為此長度)。6. 把它與0 xEA000000(跳轉(zhuǎn)指令操作碼)進行邏輯“或”運算,生成要放在向
11、量中的值。/* Updates contents of vector to contain branch instruction */* to reach routine from vector. Function return value is */* original contents of vector.*/* NB: Routine must be within range of 32MB from vector.*/unsigned Install_Handler (unsigned routine, unsigned *vector) unsigned vec, oldvec;ve
12、c = (routine - (unsigned)vector - 0 x8)2);if (vec & 0 xFF000000) /* diagnose the fault */prinf (Installation of Handler failed);exit (1);vec = 0 xEA000000 | vec;oldvec = *vector;*vector = vec;return (oldvec);以下代碼調(diào)用它來安裝 IRQ 處理程序:unsigned *irqvec = (unsigned *) 0 x18;Install_Handler (unsigned) IRQHand
13、ler, irqvec);在此情況下,將丟棄返回的初始 IRQ 向量內(nèi)容。裝入 PC 方法:所需的指令可按如下方法構(gòu)成:1. 獲取包含異常處理程序地址那個字的地址。2. 減去相應(yīng)向量的地址。3. 減去 0 x8 以便預(yù)取。4. 檢查其結(jié)果能否用 12 位表示。5. 把它與 0 xe59FF000(LDR pc, pc,#offset 的操作碼)進行邏輯“或”運算,生成要放在向量中的值。6. 將異常處理程序的地址放入該存儲位置。示例展示了實現(xiàn)了該方法的 C 例程。/* Updates contents of vector to contain LDR pc, pc, #offset */* in
14、struction to cause long branch to address in location. */* Function return value is original contents of vector. */unsigned Install_Handler (unsigned location, unsigned *vector) unsigned vec, oldvec;vec = (unsigned)location - (unsigned)vector - 0 x8) | 0 xe59ff000;oldvec = *vector;*vector = vec;retu
15、rn (oldvec);以下代碼調(diào)用它來安裝 IRQ 處理程序:unsigned *irqvec = (unsigned *)0 x18;static unsigned pIRQ_Handler = (unsigned)IRQ_handlerInstall_Handler (&pIRQHandler, irqvec);在此示例中,返回的初始IRQ向量內(nèi)容被再次被丟棄,但可用它來創(chuàng)建一系列處理程序。復(fù)位處理程序復(fù)位處理程序?qū)嵤┑牟僮魅Q于所開發(fā)軟件的運行系統(tǒng)。例如,可以是: 設(shè)置異常向量。 初始化堆棧指針和寄存器。 如果使用 MMU,初始化存儲器系統(tǒng)。 初始化任何關(guān)鍵 I/O 設(shè)備。 激活中斷。
16、 改變處理器模式和/ 或狀態(tài)。 初始化 C 語言和調(diào)用主應(yīng)用程序所需的變量。棧指針初始化復(fù)位處理程序最少必須為應(yīng)用程序所使用的任何執(zhí)行模式的棧指針分配初始值。在示例中,棧位于stack_base地址。并為FIQ和IRQ模式分配了256字節(jié)的棧,也可對其它執(zhí)行模式這么做。為了設(shè)置棧指針,進入每種模式(中斷禁用)并為棧指針分配適合的值。要利用軟件棧檢查,也必須在此設(shè)置棧限制。復(fù)位處理程序中設(shè)置的棧指針和棧限制值由C庫初始化代碼作為參數(shù)自動傳遞給 _user_initial_stackheap()。因此,不允許 _user_initial_stackheap() 更改這些值。; - Amount o
17、f memory (in bytes) allocated for stacksLen_FIQ_Stack EQU 256Len_IRQ_Stack EQU 256Offset_FIQ_Stack EQU 0Offset_IRQ_Stack EQU Offset_FIQ_Stack + Len_FIQ_StackReset_Handler; stack_base could be defined above, or located in a description file LDR r0, stack_base ; Enter each mode in turn and set up the
18、stack pointerMSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_BitSUB SP, r0,#Offset_FIQ_StackMSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_BitSUB SP, r0, #Offset_IRQ_Stack; Set up stack limit if neededLDR R10, stack_limit5.3 SWI中斷處理程序進入 SWI 處理程序時,必須設(shè)定哪個 SWI 將被調(diào)用。該信息可存儲在指令本身的 0-23 位,或?qū)⑵鋫鬟f到一個整數(shù)寄存器,通常為 r0-r3 中的一個。最高層的 SWI 處理
19、程序可載入與鏈接寄存器關(guān)聯(lián)的 SWI 指令 (LDR swi, lr,#-4) 。處理程序必須首先將導(dǎo)致異常的 SWI 指令裝入寄存器。在這一點上,lr_SVC 存儲著 SWI 指令的下一個指令的地址,因此 SWI 使用下面的指令被載入到了寄存器(此例中為 r0):LDR r0, lr,#-4然后,處理程序可檢查字段位,以決定所需的操作。通過清除操作碼的高八位來提取 SWI 編號。BIC r0, r0, #0 xFF000000示例 展示了如何將這些指令結(jié)合形成一個最高層的 SWI 處理程序。AREA TopLevelSwi, CODE, READONLY EXPORT SWI_Handler
20、SWI_HandlerSTMFD sp!,r0-r12,lr ; Store registers.LDR r0,lr,#-4 ; Calculate address of SWI instruction and load it into r0.BIC r0,r0,#0 xff000000 ; Mask off top 8 bits of instruction to give SWI number.; Use value in r0 to determine which SWI routine to execute.LDMFD sp!, r0-r12,pc ; Restore register
21、s and return.END匯編語言編寫的SWI處理程序調(diào)用所需 SWI 編號的處理程序,最簡單的方法是使用跳轉(zhuǎn)表。如果 r0 中有 SWI編號,本例中的代碼可被插在上頁的示例里給出的最高層處理程序中,插入位置在 BIC 指令之后。CMP r0,#MaxSWI ; Range checkLDRLS pc, pc,r0,LSL #2B SWIOutOfRangeSWIJumpTableDCD SWInum0 ; DCD for each of other SWI routinesDCD SWInum1SWInum0 ; SWI number 0 codeB EndofSWISWInum1 ;
22、 SWI number 1 codeB EndofSWI; Rest of SWI handling code;EndofSWI; Return execution to top levelSWI handler so as to restore registers and return to program.在超級用戶模式下使用SWI當執(zhí)行 SWI 指令時:1. 處理器進入超級用戶模式2. CPSR 被存儲在 spsr_SVC 中。3. 返回地址被存儲在 lr_SVC 中。如處理器已經(jīng)處在超級用戶模式下,lr_SVC 和 spsr_SVC 被破壞。在超級用戶模式下,如果調(diào)用 SWI,則需存儲
23、 lr_SVC 和 spsr_SVC,以確保鏈接寄存器和 SPSR 中的初始值不被丟失。例如,一個特定 SWI 編號的處理程序例程調(diào)用了另一個 SWI,必須確保該該處理程序例程將 lr_SVC 和 spsr_SVC 存儲在堆中。它確保了處理程序的每一次調(diào)用都保存了返回到調(diào)用 SWI 指令所需要的信息。示例展示了如何實現(xiàn)的方法。STMFD sp!,r0-r3,r12,lr ; Store registers.MOV r1, sp ; Set pointer to parameters.MRS r0, spsr ; Get spsr.STMFD sp!, r0 ; Store spsr onto stack. This is only really needed in case of nested SWIs.LDR r0,lr,#-4 ; Calculate address of SWI instruction and load it into r0.BIC r0,r0,#0 xFF000000 ; Mask off top 8 bits o
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度車庫租賃及智能停車設(shè)備安裝合同3篇
- 二零二五年度雛雞養(yǎng)殖場與動物疫病防控中心合作合同4篇
- 科技賦能下的寵物醫(yī)療行業(yè)發(fā)展前景
- 科技創(chuàng)新助力創(chuàng)新藥物研發(fā)的市場突破
- 二零二五年度車間承包與新能源應(yīng)用合作協(xié)議4篇
- 二零二五年度GPS技術(shù)在智能穿戴設(shè)備中的應(yīng)用合同3篇
- 網(wǎng)絡(luò)時代下家庭教育的新視角-家庭網(wǎng)絡(luò)安全教育的重要性及實踐路徑
- 教育、醫(yī)療、辦公多領(lǐng)域下的農(nóng)業(yè)科技發(fā)展探討
- 二零二五年度櫥柜行業(yè)展會參展與采購合同4篇
- 二零二五年度文化產(chǎn)業(yè)發(fā)展藝人合作合同2篇
- 肩袖損傷護理查房
- 迅雷網(wǎng)盤最最最全影視資源-持續(xù)更新7.26
- 設(shè)備運維管理安全規(guī)范標準
- 辦文辦會辦事實務(wù)課件
- 大學宿舍人際關(guān)系
- 2023光明小升初(語文)試卷
- GB/T 14600-2009電子工業(yè)用氣體氧化亞氮
- GB/T 13234-2018用能單位節(jié)能量計算方法
- 申請使用物業(yè)專項維修資金征求業(yè)主意見表
- 房屋買賣合同簡單范本 房屋買賣合同簡易范本
- 無抽搐電休克治療規(guī)范
評論
0/150
提交評論