【ARM】Tiny4412裸板编程之异常
00. 目錄
文章目錄
- 00. 目錄
- 01. 開發(fā)環(huán)境
- 02. 概述
- 03. ARM處理器模式
- 04. 異常類型
- 05. 異常處理
- 5.1 異常處理偽代碼
- 5.2 復(fù)位異常
- 5.3 未定義指令異常
- 5.4 軟中斷異常
- 5.5 預(yù)取異常
- 5.6 數(shù)據(jù)異常
- 5.7 外部中斷異常
- 5.8 快速中斷異常
- 06. FIQ 與 IRQ 比較
- 07. 附錄
01. 開發(fā)環(huán)境
- 開發(fā)板:Tiny4412SDK標(biāo)準(zhǔn)版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平臺(tái):Ubuntu 20.04
02. 概述
- CPU 在執(zhí)行當(dāng)前程序的過程中因硬件或軟件的原因插入了另一段程序運(yùn)行的過程。
- 硬件引起的中斷不可預(yù)測(cè),隨機(jī)性。
- 軟中斷:事先在程序中安排特殊指令,CPU 執(zhí)行到該類指令時(shí),轉(zhuǎn)去執(zhí)行相應(yīng)的一段預(yù)先安排好的程序,然后再返回來執(zhí)行原來的程序。
03. ARM處理器模式
B1.3.1 ARM processor modes
04. 異常類型
常用的有以下幾種異常:
- 復(fù)位異常(Reset)
- 數(shù)據(jù)異常(Data Abort)
- 快速中斷異常(FIQ)
- 外部中斷異常(IRQ)
- 預(yù)取異常(Prefetch Abort)
- 軟中斷異常(SWI)
- 未定義異常(Undefined interrupt)
B1.8.1 Exception vectors and the exception base address
05. 異常處理
5.1 異常處理偽代碼
R14_<exception_mode> = return link SPSR_<exception_mode> = CPSR CPSR[4:0] = exception mode number CPSR[5] = 0 /*進(jìn)入 ARM 狀態(tài)*/ If <enception_mode> == reset or FIQ thenCPSR[6] = 1 /*屏蔽快速中斷 FIQ*/CPSR[7] = 1 /*屏蔽外部中斷 IRQ*/ PC = exception vector address5.2 復(fù)位異常
當(dāng)處理器復(fù)位引腳有效時(shí),系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行,復(fù)位異常中斷通常用于系統(tǒng)上電和系統(tǒng)復(fù)位兩種情況。
步驟
-
設(shè)置異常中斷向量表
-
初始化數(shù)據(jù)棧和寄存器
-
初始化存儲(chǔ)系統(tǒng),如系統(tǒng)中的 MMU
-
初始化關(guān)鍵的 I/O 設(shè)備
-
使能中斷
-
處理器切換到合適的模式
-
初始化C變量,跳轉(zhuǎn)到應(yīng)用程序執(zhí)行
處理偽代碼
R14_svc = UNPREDICTABLE value SPSR_svc = UNPREDICTABLE value CPSR[4:0] = 0B10011 /*進(jìn)入特權(quán)模式*/ CPSR[5] = 0 /*處理器進(jìn)入 ARM 態(tài)*/ CPSR[6] = 1 /*禁止快速中斷*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff0000 ElsePC = 0x000000005.3 未定義指令異常
當(dāng) ARM 處理器執(zhí)行協(xié)處理器指令時(shí),它必須等待一個(gè)外部協(xié)處理器答應(yīng)后,才能真正執(zhí)行這條指令。若協(xié)處理器沒有響應(yīng),則發(fā)生未定義指令異常。未定義指令異常可用于在沒有物理協(xié)處理器的系統(tǒng)上,對(duì)協(xié)處理器進(jìn)行軟件仿真,或通過軟件仿真實(shí)現(xiàn)指令集擴(kuò)展。
步驟
-
將仿真程序入口地址鏈接到向量表中未定義指令異常中斷入口處(0x00000004 或 0xffff0004),并保存原來的中斷處理程序
-
讀取該未定義指令的 bits[27:24],判斷其是否是一條協(xié)處理器指令。如果 bits[27:24]值為 0b1110 或 0b110x,則該指令是一條協(xié)處理器指令;否則由軟件仿真實(shí)現(xiàn)協(xié)處理器功能,可以通過 bits[11:8] 來判斷要仿真的協(xié)處理器功能(類似于 SWI 異常實(shí)現(xiàn)機(jī)制)
-
如果不仿真該未定義指令,則程序跳轉(zhuǎn)到原來的未定義指令異常中斷的中斷處理程序行
處理偽代碼
r14_und = address of next instruction after the undefined instruction SPSR_und = CPSR CPSR[4:0] = 0b11011 /*進(jìn)入未定義指令模式*/ CPSR[5] = 0 /*處理器進(jìn)入 ARM 狀態(tài)*/ /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff00004 ElsePC = 0X000000045.4 軟中斷異常
這是一個(gè)由用戶定義的中斷指令(SWI)。該異常由執(zhí)行 SWI 指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權(quán)操作指令。在實(shí)時(shí)操作系統(tǒng)中可以通過該機(jī)制實(shí)現(xiàn)系統(tǒng)功能調(diào)用。
處理偽代碼
r14_svc = address of next instruction after the SWI instruction SPSR_und = CPSR CPSR[4:0] = 0b10011 /*進(jìn)入特權(quán)模式*/ CPSR[5] = 0 /*處理器進(jìn)入 ARM 態(tài)*/ /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff000C ElsePC = 0x0000000C5.5 預(yù)取異常
預(yù)取異常是由系統(tǒng)存儲(chǔ)器報(bào)告的。當(dāng)處理器預(yù)取的指令的地址不存在,或者該地址不允許當(dāng)前指令訪問(權(quán)限不夠)時(shí),將產(chǎn)生預(yù)取異常。
如果系統(tǒng)中不包含 MMU,指令預(yù)取異常中斷處理程序只是簡(jiǎn)單地報(bào)告錯(cuò)誤并退出;若包含 MMU,引起異常的指令的物理地址被存儲(chǔ)到內(nèi)存中。
處理偽代碼
r14_svc = address of the aborted instruction + 4 SPSR_und = CPSR CPSR[4:0] = 0b10111 CPSR[5] = 0 /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff000c ElsePC = 0x0000000c5.6 數(shù)據(jù)異常
數(shù)據(jù)異常是由存儲(chǔ)器發(fā)生數(shù)據(jù)中止信號(hào),它由存儲(chǔ)器訪問指令 Load/Store 產(chǎn)生。
當(dāng)數(shù)據(jù)訪問指令的目標(biāo)地址不存在,或者該地址不允許當(dāng)前指令訪問(權(quán)限不夠)時(shí),將產(chǎn)生數(shù)據(jù)訪問中止異常。
產(chǎn)生數(shù)據(jù)訪問中止異常時(shí),寄存器的值修改規(guī)則
-
r14 的值只與發(fā)生數(shù)據(jù)異常的指令地址有關(guān),與 PC 值無關(guān)
-
如果指令中沒有指定基址寄存器回寫,則基址寄存器的值不變
-
如果指令中指定了基址寄存器回寫,則寄存器的值和具體芯片的 Abort Models 有關(guān),由芯片的生成商指定
-
如果指令只加載一個(gè)通用寄存器的值,則通用寄存器的值不變
-
如果是批量加載指令,則寄存器中的值不可預(yù)知
-
如果指令加載協(xié)處理器寄存器的值,則被加載寄存器的值不可預(yù)知
處理偽代碼
r14_abt = address of the aborted instruction + 8 SPSR_abt = CPSR CPSR[4:0] = 0b10111 CPSR[5] = 0 /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff0010 ElsePC = 0x000000105.7 外部中斷異常
當(dāng)處理器的外部中斷請(qǐng)求引腳有效,而且 CPSR 的寄存器的 I 控制位被清除時(shí),處理器產(chǎn)生外部中斷請(qǐng)求異常中斷。系統(tǒng)中各外設(shè)通過該異常中斷請(qǐng)求處理服務(wù)。
處理偽代碼
r14_abt = address of the next instruction to be executed + 4 SPSR_irq = CPSR CPSR[4:0] = 0b10010 /*進(jìn)入特權(quán)模式*/ CPSR[5] = 0 /*處理器進(jìn)入 ARM 狀態(tài)*/ /*CPSR[6] 保持不變*/ CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff0018 ElsePC = 0x000000185.8 快速中斷異常
當(dāng)處理器的外部快速中斷請(qǐng)求引腳有效,而且 CPSR 的 F 控制位被清除時(shí),處理器產(chǎn)生外部快速中斷請(qǐng)求異常中斷。
處理偽代碼
r14_abt = address of the next instruction to be executed + 8 SPSR_fiq= CPSR CPSR[4:0] = 0b10001 /*進(jìn)入FIQ模式*/ CPSR[5] = 0 CPSR[6] = 1 CPSR[7] = 1 /*禁止外設(shè)中斷*/ If high vectors configured thenPC = 0xffff001c ElsePC = 0x0000001c06. FIQ 與 IRQ 比較
相同點(diǎn)
都只是普通中斷:
當(dāng)我們程序定義了該中斷,并且在程序運(yùn)行的時(shí)候產(chǎn)生了 IRQ/FIQ 中斷,則此時(shí)的芯片運(yùn)行過程:①中斷處理器利用IRQ請(qǐng)求線來告訴ARM,②ARM切換到 IRQ/FIQ 模式運(yùn)行
不同點(diǎn)
FIQ 速度快,IRQ 速度慢,主要原因:
07. 附錄
6.1 ARM? Architecture Reference Manual ARMv7-A and ARMv7-R edition
總結(jié)
以上是生活随笔為你收集整理的【ARM】Tiny4412裸板编程之异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ARM】Tiny4412裸板编程之MM
- 下一篇: 【ARM】Tiny4412裸板编程之异常