【正文】
,數(shù)據(jù)異常的地址在 MMU 的 “ Fault Address” 寄存器中 ? 修正問題 (. enable correct page of memory) ? 返回并重新執(zhí)行數(shù)據(jù)異常的指令 SUBS pc,lr,8 ? 沒有存儲(chǔ)器管理的系統(tǒng) ? 通常表示一個(gè)致命的錯(cuò)誤 ? 報(bào)告錯(cuò)誤 (如果可能 ) 然后退出 The Abort Model ? 許多 ARM 存儲(chǔ)器存取指令將更新基址寄存器 : ? . LDR r0,[r1,8]! 。“!” 將更新 R1 ? 如果異常是數(shù)據(jù)異常, 對(duì)基址寄存器的影響取決于使用的是哪種 ARM core. ? “Base Restored Abort Model” ? StrongARM, ARM9 and ARM10 系列支持 ? 基址寄存器由 ARM core 自動(dòng)恢復(fù) . ? “Base Updated Abort Model” ? ARM7TDMI 系列支持 ? 在異常指令重新執(zhí)行之前基址寄存器必須由處理程序進(jìn)行恢復(fù) ? 兩種模式的例子程序包含在 ADS examples 目錄下。 異常返回地址 ? 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 值并沒有被更新 . ARM Thumb SWI pc8 pc4 ; Exception taken here xxx ? pc4 pc2 ; lr = next instruction yyy pc pc ? 因此返回指令為 : MOVS pc,lr ? Note : ? 表示異常返回后將執(zhí)行的那條指令 從 FIQs和 IRQs返回 ? 異常在當(dāng)前指令執(zhí)行完成后才被響應(yīng) .因此內(nèi)核在計(jì)算 LR 時(shí)的 PC 值已被更新 . ARM Thumb pc 12 pc – 6 Interrupt occurred during execution xxx ? pc 8 pc 4 yyy pc – 4 pc – 2 ARM lr = next instruction zzz pc pc Thumb lr = two instructions ahead ? 因此返回指令為 : SUBS pc,lr,4 ? Note : ?表示異常返回后將執(zhí)行的那條指令 從預(yù)取異常返回 ? 當(dāng)指令到達(dá)執(zhí)行階段時(shí)異常才產(chǎn)生,因此內(nèi)核在計(jì)算 LR 時(shí)的 PC 值已被更新 . ? 需要重新執(zhí)行導(dǎo)致異常的指令 ARM Thumb ? pc 8 pc 4 Prefetch Abort occurred here xxx pc 4 pc 2 ARM lr = next instruction yyy pc pc Thumb lr = two instructions ahead ? 因此返回指令為 : SUBS pc,lr,4 ? Note : ?表示異常返回后將執(zhí)行的那條指令 從數(shù)據(jù)異常返回 ? 異常發(fā)生 ( 和計(jì)算 LR ) 在 PC 被更新之后 . ? 需要重新執(zhí)行導(dǎo)致異常的指令 ARM Thumb ? pc 12 pc 6 Data abort occurred here xxx pc 8 pc 4 yyy pc 4 pc 2 ARM lr = two instructions ahead zzz pc pc aaa pc + 4 pc + 2 Thumb lr = four instructions ahead ? 因此返回指令為 : SUBS pc,lr,8 ? Note : ?表示異常返回后將執(zhí)行的那條指令 Assemble Language of ARM 47 ? 舉例 ? SWI ReadC 。 從讀數(shù)據(jù)流得到下一個(gè)字符 ? SWI WriteI+”k” 。 輸出一個(gè) “K”到寫數(shù)據(jù)流 ? SWINE 0 。 條件調(diào)用用戶模式,注釋區(qū)域?yàn)?0 ? 上面的例子加頂相應(yīng)的超級(jí)用戶代碼存在,例 ? 0x08 B Supervisor 。 SWI 入口 ? EntryTable 。 超級(jí)用戶程序入口 ? DCD ZeroRtn ? DCD ReadCRtn ? DCD WriteIRtn ? . . . ? Zero EQU 0 ? ReadC EQU 256 ? WriteI EQU 512 ? 超級(jí)用戶 ? SWI has routine required in bits 823 and data (if any) in bits 07. ? 假設(shè) R13_svc指向一個(gè)相應(yīng)的堆棧 ? STMFD R13,{R0R2,R14} 。 保存工作寄存器和返回地址 ? LDR R0,[R14,4] 。 得到 SWI指令 ? BIC R0,R0,0xFF000000 。清除高 8位 ? MOV R1,R0,LSR8 。 得到程序偏移量 ? ADR R2,EntryTable 。 得到入口列表的起始地址 ? LDR R15,[R2,R1,LSL2] 。 分支到適當(dāng)?shù)某绦? ? WriteIRtn 。 enter with character in R0 bits 07 ? . . . . . . ? LDMFD R13,{R0R2,R15}^ 。 恢復(fù)工作環(huán)境并返回 ? 恢復(fù)處理器模式和標(biāo)志位 Assemble Language of ARM 48 小結(jié) ?掌握處理器對(duì)各種異常中斷響應(yīng)的過程以及從中斷處理程序的返回 ?掌握異常中斷類型及其含義 ?掌握中斷優(yōu)先級(jí)和中斷向量