ARM體繫結構與介面技術——ARM異常處理 異常的概念 處理器在正常執行程式的過程中可能會遇到一些不正常的事件發生,這時處理器就要將當前的程式暫停下來,轉而去處理這個異常的事件,異常事件處理完成之後再返回到被異常打斷的點繼續執行程式。 異常處理機制 不同的處理器對異常的處理的流程大體相似,但是不同的 ...
ARM體繫結構與介面技術——ARM異常處理
異常的概念
處理器在正常執行程式的過程中可能會遇到一些不正常的事件發生,這時處理器就要將當前的程式暫停下來,轉而去處理這個異常的事件,異常事件處理完成之後再返回到被異常打斷的點繼續執行程式。
異常處理機制
不同的處理器對異常的處理的流程大體相似,但是不同的處理器在具體實現的機制上有所不同;
比如:
處理器遇到哪些事件認為是異常事件,
遇到異常事件之後處理器有哪些動作,
處理器如何跳轉到異常處理程式,
如何處理異常,
處理完異常之後又如何返回到被打斷的程式繼續執行等,
這些細節的實現就是處理器的異常處理機制。
ARM異常源
導致異常產生的事件稱為異常源。
ARM異常源有7類:
FIQ | 快速中斷請求引腳有效 |
IRQ | 外部中斷請求引腳有效 |
Reset | 複位電平有效 |
Software Interrupt | 執行swi指令 |
Data Abort | 數據終止 |
Prefetch Abort | 指令預取終止 |
Undefined Instruction | 遇到不能處理的指令 |
異常模式
ARM的基本工作模式中有5個異屬於異常模式:
異常源 | 異常模式 |
FIQ | FIQ |
IRQ | IRQ |
Reset & Software Interrupt | SVC |
Data Abort & Prefetch Abort | Abort |
Undef Instruction | Undef |
ARM異常響應
1.拷貝CPSR中的內容到對應異常模式下的SPSR_<mode>。
2.修改CPSR的值:
2.1修改中斷禁止位禁止相應的中斷
2.2修改模式位進入相應的異常模式
2.3修改狀態位進入ARM狀態
3.保存返回地址到對應異常模式下的LR_<mode>。
4.設置PC為相應的異常向量(異常向量表對應的地址)。
異常向量表
- 異常向量表的本質是記憶體中的大一段代碼
- 表中為每個異常源分配了四個位元組的存儲空間
- 遇到異常後處理器自動將PC修改為對應的地址
- 因為異常向量表空間有限,一般我們不會在這裡寫異常處理程式,而是在對應的位置寫一條跳轉指令使其跳轉到指定的異常處理程式的入口
註:ARM的異常向量表的基地址預設在0x00地址,但是可以通過配置協處理器來修改其基地址。
異常返回
ARM異常返回的動作(自己編寫)
- 將SPSR_<mode>的值複製給CPSR使處理器恢復之前的狀態。
- 將LR_<mode>的值複製給PC,使程式跳轉回被打斷的地址繼續執行。
異常優先順序
多個異常同時產生時的服務順序
Reset
Data Abort
FIQ
IRQ
Prefetch Abort
Software Interrupt
Undefined insturction
FIQ和IRQ
FIQ的響應速度比IRQ快,有以下3點原因。
- FIQ在異常向量表位於最末
- 所以可以直接把異常處理程式寫在異常向量表之後,省去了跳轉的過程。
- 而IRQ需要執行向量表對應的跳轉指令之後,跳轉到指定的中斷處理程式。
- FIQ模式有5個私有寄存器(R8-R12)
- 執行中斷處理程式前無需壓棧保存寄存器,可直接處理中斷。
- 而IRQ的R8-R12寄存器是與和其它模式共用的,在中斷前需要保護現場,即把R8-R12的數據保存在棧中。
- FIQ的優先順序高於IRQ
- 兩個中斷同時發生時先響應FIQ
- FIQ可以打斷IRQ,單IRQ不能打斷FIQ。
END