<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM微處理器的編程模型之:異常中斷處理

ARM微處理器的編程模型之:異常中斷處理

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257085.htm

有些情況下,系統0x0地址不一定是ROM。如果0x0地址為RAM,那么就系統將中斷向量表從ROM復制RAM,下面的例子顯示了這樣一個(gè)過(guò)程。

MOV R8, #0

ADR R9, Vector_Init_Block

LDMIA R9!,{r0-r7} ;復制中斷向量表 (8 words)

STMIA R8!,{r0-r7}

LDMIA R9!,{r0-r7} ;復制由偽操作 DCD定義的地址

STMIA R8!,{r0-r7}

注意

可以使用Scatter文件定義加載向量表的地址,這樣上述代碼的拷貝工作由C庫函數完成。

2.使用C語(yǔ)言安裝異常處理程序

程序中有時(shí)需要在main()函數中使用C語(yǔ)言安裝中斷向量表。這就要求指令經(jīng)編譯后的解碼能安裝在內存的正確位置。

(1)向量表中使用跳轉指令的情況

如果在向量表中使用跳轉指令,使用下面的步驟完成向量表的安裝。

① 讀取異常處理程序的地址。

② 從異常處理程序地址中減去向量表中的偏移。

③ 為適應指令流水線(xiàn),將上一步得到的地址減8。

④ 將得到的結果右移2位,得到以字為單位的地址偏移量。

⑤ 將結果的高8位清零,得到跳轉指令的24位偏移量。

⑥ 將上一步得到的結果和0xea000000(無(wú)條件跳轉指令編碼)做邏輯與操作,從而得到要寫(xiě)到向量表中的跳轉指令的正確編碼。

下面的例子顯示了這樣一個(gè)標準過(guò)程。

unsigned Install_Handler (unsigned routine, unsigned *vector)

{ unsigned vec, oldvec;

vec = ((routine - (unsigned)vector - 0x8)>>2);

if ((vec 0xFF000000))

{

/* diagnose the fault */

prinf (Installation of Handler failed);

exit (1);

}

vec = 0xEA000000 | vec;

oldvec = *vector;

*vector = vec;

return (oldvec);

}

(2)在向量表中使用加載PC指令

在向量表中使用加載PC指令,按照下面的步驟完成。

① 讀取異常處理程序地址。

② 從異常處理程序地址中減去向量表中的偏移。

③ 為適應指令流水線(xiàn),將上一步得到的地址減8。

④ 保留結果的后12位。

⑤ 將結果與0xe59ff000(LDR PC, [PC,#offset])做邏輯或操作,從而得到要寫(xiě)到向量表中的跳轉指令的正確編碼。

⑥ 將異常處理程序的地址放到相應的存儲單元。

下面的例子顯示了一個(gè)標準的C語(yǔ)言過(guò)程。

unsigned Install_Handler (unsigned location, unsigned *vector)

{ unsigned vec, oldvec;

vec = ((unsigned)location - (unsigned)vector - 0x8) | 0xe59ff000;

oldvec = *vector;

*vector = vec;

return (oldvec);

}

3.4.7 FIQ和IRQ中斷處理函數的設計

1.中斷分支

內核只有兩個(gè)外部中斷輸入信號nFIQ和nIRQ。但對于一個(gè)系統來(lái)說(shuō),中斷源可能多達幾十個(gè)。為此,在系統集成的時(shí)候,一般都會(huì )有一個(gè)異??刂破鱽?lái)處理異常信號,如圖3.8所示。

圖3.8 中斷系統

這時(shí)候用戶(hù)程序可能存在多個(gè)IRQ/FIQ的中斷處理函數。為了使從向量表開(kāi)始的跳轉始終能找到正確的處理函數入口,需要設置一套處理機制和方法。

多數情況下是由軟件來(lái)處理異常分支的,因為軟件可以通過(guò)讀取中斷控制器來(lái)獲得中斷源的信息,如圖3.9所示。

有些芯片可能支持特殊的硬件分支功能,這需要查看具體的芯片說(shuō)明。

因為軟件的靈活性,可以設計出比圖3.9更好的流程控制方法,如圖3.10所示。

Int_vector_table是用戶(hù)自己開(kāi)辟的一塊存儲器空間,里面按次序存放異常處理函數的地址。IRQ_Handler()從中斷控制器獲取中斷源信息,然后再從Int_vector_table中的對應地址單元得到異常處理函數的入口地址,完成一次異常響應的跳轉。這種方法的好處是用戶(hù)程序在運行過(guò)程中,能夠很方便地動(dòng)態(tài)改變異常服務(wù)內容。

圖3.9 軟件控制中斷分支

圖3.10 靈活的軟件分支設計

進(jìn)入異常處理程序后,用戶(hù)可以完全按照自己的意愿來(lái)進(jìn)行程序設計,包括調用Thumb狀態(tài)的函數等。但對于絕大多數的系統來(lái)說(shuō),有兩個(gè)步驟必須處理,一是現場(chǎng)保護,二是要把中斷控制器中對應的中斷狀態(tài)標識清除,表明該中斷請求已經(jīng)得到響應,否則,中斷函數退出以后,又會(huì )被再一次觸發(fā),從而進(jìn)入周而復始的死循環(huán)。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>