mini2440啓動代碼分析之第二篇(着重理解$HandlerLabel HANDLER $HandleLabel宏)

接下來的代碼如下(注黑色爲源程序,藍色爲解說部分代碼)
MACRO 
$HandlerLabel HANDLER $HandleLabel 
$HandlerLabel 
    sub sp,sp,#4           
;減少sp(用於存放轉跳地址)實質上是在計算返回地址,用來存儲PC地址
   
 stmfd sp!,{r0}         ;把將要使用的r0寄存器入棧
    ldr    r0,=$HandleLabel
;將HandleXXX的址址放入r0 
    ldr    r0,[r0]         
;把HandleXXX所指向的內容(也就是中斷程序的入口)放入r0 
    str    r0,[sp,#4]      ;把中斷服務程序(ISR)壓入棧. 
    ldmfd  sp!,{r0,pc}     ;用出棧的方式恢復r0的原值和爲pc設定新值(完成了到ISR的轉跳) 
    MEND
;首先這段程序是個宏定義,HANDLER是宏名,不要想歪了
;其次後面程序遇到的HandlerXXX HANDLER HandleXXX這些語句將都被下面這段程序展開
 例如:HandlerFIQ  HANDLER  HandleFIQ 被上面那段程序展開後爲:
  HandlerFIQ
       sub        sp,sp,#4       
       stmfd      sp!,{r0}        
       ldr        r0,=HandleFIQ
       ldr        r0,[r0]        
       str        r0,[sp,#4]
       ldmfd      sp!,{r0,pc}
;再次這段程序目的在於把中斷服務程序的首地址裝載到PC中,可以稱之爲“加載程序”
;本初始化程序定義了一個數據區(在文件最後),34個字空間,存放相應中斷服務程序的首地址。每個字空間都有一個標號,以Handle***命名。
 例如:HandlerFIQ    HANDLER HandleFIQ
       HandlerIRQ    HANDLER HandleIRQ
       HandlerUndef  HANDLER HandleUndef
       HandlerSWI    HANDLER HandleSWI
       HandlerDabort HANDLER HandleDabort
       HandlerPabort HANDLER HandlePabort
;向量中斷模式下使用“加載程序”來執行中斷服務程序。
註釋:向量中斷模式是當CPU讀取位於0x18處的IRQ中斷指令的時候,系統自動讀取對應於該中斷源確定地址上的指令取代0x18處的指令,通過跳轉指令,系統就直接跳轉到對應地址函數中節省了中斷處理時間提高了中斷處理速度。例如:ADC中斷的向量地址爲0xC0,則在0xC0處放如下代碼:ldr PC,=HandlerADC 當ADC 中斷產生的時候系統會自動跳轉到HandlerADC函數中處理中斷。
     非向量中斷模式處理方式是一種傳統的中斷處理方法,當系統產生中斷的時候,系統將中斷狀態寄存器中對應標誌位置位然後跳轉到位於0x18處的統一中斷函數中該函數通過讀取中斷狀態寄存器中對應標誌位來判斷中斷源,並根據中斷優先級寄存器中優先級關係再跳到對應中斷源的處理代碼中處理中斷。
 
補充說明:
;細心的人會發現在_ISR_STARTADDRESS=0x33FF_FF00裏定義的第一級中斷向量表是採用型如Handle***的方式的,而在程序的ENTRY處(程序開始處)採用的是b Handler***的方式.在這裏Handler***就是通過HANDLER這個宏和Handle***進立聯繫的.所以認爲HANDLER這個宏是用於第一次查表過程的實現中斷向量的重定向。那麼這樣做有什麼優點呢?
   這種方式的優點就是真正定義的向量數據放到內存空間RAM裏,而不是在ENTRY(地址0x0)處的ROM(FLASH)空間裏, 這樣,我們就可以在程序裏靈活的改動中斷向量的數據了(因爲ROM是隻讀的,而RAM爲可讀可寫的),在這裏HANDLER是一個宏,就負責查找中斷處理程序的入口地址。這些中斷入口地址存放在由HandleXXX指向的表項中,該表定位在RAM高端,它的基地址爲_ISR_STARTADDRESS。
  例如:_ISR_STARTADDRESS爲0x800000000,當IRQ中斷時,根據b HandlerFIQ,先跳轉再根據_ISR_STARTADDRESS基地址+HandleIRQ的偏移地址(4*6)得到的中斷地址0x80000000+0x00000024=0x80000024
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章