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