轉自:http://blog.chinaunix.net/uid-26435987-id-3074176.html
;中斷向量表一般位於啓動代碼的開始部分,它是用戶程序與啓動代碼之間以及啓動代碼的各部分之間聯繫的紐帶。它由一個一個的跳轉函數組成,它就象一個普通的散轉函數,只不過散轉的過程中有硬件機制參與,當系統發生異常時,ARM 處理器會通過硬件機制強制將PC 指針指向中斷向量表中對應的異常跳轉函數存儲的地址,然後程序會跳轉到相應的中斷服務程序去執行。(別忘了前篇有個復位b ResetHandler )
b HandlerUndef ;handler for Undefined mode 未定義異常,遇到無法識別的指令時0x04
b HandlerSWI ;handler for SWI interrupt,軟中斷異常0x08
b HandlerPabort ;handler for PAbort指令預取錯誤時進入0x0c
b HandlerDabort ;handler for DAbort數據訪問不能完成時進入0x10
b . ;reserved, 保留 0x14
b HandlerIRQ ;handler for IRQ interrupt發生IRQ 中斷時進入0x18
b HandlerFIQ ;handler for FIQ interrupt發生FIQ 中斷時進入0x1c
b EnterPWDN ; Must be @0x20.
這個b EnterPWDN沒太見過,然後點擊查看到在2440lib.c頭文件中可以見到這樣的宏聲明:
#define EnterPWDN(clkcon) ((void (*)(int))0x20)(clkcon)
不難看出,當我們編程調用EnterPWDN(clkcon)函數的時候,編譯器在編譯前首先把EnterPWDN(clkcon)轉換爲((void
(*)(int))0x20)(clkcon)語句。現在分析這個語句,對於這個語句,我們先將之分解成3個部分來看:
如下: 1:(void (*)(int) 2:0x20 3:(clkcon)
其中(clkcon)是函數的參數,對照着看就知道了;0x20是要轉換的函數的入口地址;着重看(void (*)(int),這部分作爲一個整體,描述了轉換後的函數的類型,即無返回值,帶一個整形參數。而中間那個“(*)”,表示是要轉換成一個函數,類比一下就像我們平常用的強制類型轉換一樣,(int)temp,只不過這裏是將一個數轉換爲另一類型,而咱們剛說的是將一個地址轉換爲一個函數。