[ARM 組合]進階篇—例外處理與中斷—2.4.2 ARM處理器的異常向量表

2023-06-18 06:01:19

異常向量表簡介

在ARM架構中,異常向量表是一組固定位置的記憶體地址,它們包含了處理器在遇到異常時需要跳轉到的處理程式的入口地址。每個異常型別都有一個對應的向量地址。當異常發生時,處理器會自動跳轉到對應的向量地址,並開始執行例外處理程式。

異常向量表的位置

ARM處理器的異常向量表位於記憶體的低地址空間。具體地址如下:

異常型別 向量地址
復位(Reset) 0x00000000
未定義指令(Undefined Instruction) 0x00000004
軟體中斷(SWI) 0x00000008
預取指令異常(Prefetch Abort) 0x0000000C
資料異常(Data Abort) 0x00000010
保留(Reserved) 0x00000014
外部中斷(IRQ) 0x00000018
快速外部中斷(FIQ) 0x0000001C

異常向量表的初始化

在ARM組合開發中,我們需要在程式開始時初始化異常向量表。初始化過程包括將每個向量地址設定為對應的例外處理程式的入口地址。這通常通過將例外處理程式的地址儲存在向量表中的相應位置來完成。

以下是一個初始化異常向量表的範例程式碼:

AREA Vectors, CODE, READONLY
    ; 復位向量
    LDR PC, Reset_Addr
    ; 未定義指令向量
    LDR PC, Undefined_Addr
    ; 軟體中斷向量
    LDR PC, SWI_Addr
    ; 預取指令異常向量
    LDR PC, Prefetch_Abort_Addr
    ; 資料異常向量
    LDR PC, Data_Abort_Addr
    ; 保留向量
    NOP
    ; 外部中斷向量
    LDR PC, IRQ_Addr
    ; 快速外部中斷向量
    LDR PC, FIQ_Addr

    ; 例外處理程式地址
    Reset_Addr          DCD _start
    Undefined_Addr      DCD Undefined_Handler
    SWI_Addr            DCD SWI_Handler
    Prefetch_Abort_Addr DCD Prefetch_Abort_Handler
    Data_Abort_Addr     DCD Data_Abort_Handler
    IRQ_Addr            DCD IRQ_Handler
    FIQ_Addr            DCD FIQ_Handler

在這個範例中,我們首先使用AREA指令定義一個名為Vectors的程式碼段。接下來,我們將每個異常向量設定為對應的處理程式地址。例如,對於軟體中斷(SWI),我們將其向量地址設定為SWI_Handler

在向量表的末尾,我們使用DCD指令定義每個例外處理程式的入口地址。這些地址將在處理器遇到異常時被載入到程式計數器(PC)暫存器,從而實現例外處理的跳轉。

範例程式碼

以下是一個簡單的範例程式碼,演示瞭如何使用異常向量表處理軟體中斷(SWI):

; 初始化異常向量表
    AREA Vectors, CODE, READONLY
    LDR PC, Reset_Addr
    LDR PC, Undefined_Addr
    LDR PC, SWI_Addr
    LDR PC, Prefetch_Abort_Addr
    LDR PC, Data_Abort_Addr
    NOP
    LDR PC, IRQ_Addr
    LDR PC, FIQ_Addr

    Reset_Addr          DCD _start
    Undefined_Addr      DCD Undefined_Handler
    SWI_Addr            DCD SWI_Handler
    Prefetch_Abort_Addr DCD Prefetch_Abort_Handler
    Data_Abort_Addr```assembly
DCD Data_Abort_Handler
IRQ_Addr            DCD IRQ_Handler
FIQ_Addr            DCD FIQ_Handler

; 主程式
AREA Main, CODE, READONLY
_start
    ; 觸發軟體中斷
    SWI 0

; 例外處理程式
AREA Handlers, CODE, READONLY
Undefined_Handler
    B Undefined_Handler

SWI_Handler
    ; 在此處編寫軟體中斷處理程式
    ; ...
    ; 返回到主程式
    MOV PC, LR

Prefetch_Abort_Handler
    B Prefetch_Abort_Handler

Data_Abort_Handler
    B Data_Abort_Handler

IRQ_Handler
    B IRQ_Handler

FIQ_Handler
    B FIQ_Handler

在這個範例中,我們首先初始化異常向量表,然後在_start標籤下的主程式中觸發一個軟體中斷(SWI)。當軟體中斷髮生時,處理器會自動跳轉到SWI_Handler例外處理程式。

SWI_Handler中,你可以編寫相應的處理程式碼。處理完成後,使用MOV PC, LR指令返回到主程式。

需要注意的是,這個範例僅用於演示異常向量表的基本概念和用法。在實際開發中,你可能需要根據具體的硬體平臺和需求進行相應的調整和優化。

小結

本節我們介紹了ARM處理器的異常向量表,包括其位置、初始化過程以及如何使用異常向量表處理異常。通過學習本節內容,你應該對ARM組合開發中的例外處理有了基本的瞭解。在之後的學習中,你可以更深入地探討各種異常型別以及如何編寫高效、穩定的例外處理程式。
推薦閱讀:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g