<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中斷實(shí)現過(guò)程的個(gè)人筆記

ARM中斷實(shí)現過(guò)程的個(gè)人筆記

——
作者: 時(shí)間:2006-06-12 來(lái)源: 收藏
決定開(kāi)始學(xué)習嵌入式后,最先做的事情就是要熟悉ARM指令及其偽指令偽操作。ARM指令的助記符其實(shí)都是其具體功能的單次縮寫(xiě),所以學(xué)習的過(guò)程中最好利用網(wǎng)絡(luò ),從一些文獻或書(shū)籍中找到ARM指令助記符的全稱(chēng),這樣方便記憶。學(xué)完之后,我做了整理了一個(gè)有關(guān)這方面的筆記,有需要的朋友請郵件聯(lián)系:gmman@163.com
 
    接下來(lái)的學(xué)習過(guò)程中,比較難以理解的是ARM的中斷過(guò)程和存儲系統。ARM中斷的實(shí)現有些書(shū)上看一兩遍也不見(jiàn)得能夠完全理解,當然可能只對于像我一樣跨專(zhuān)業(yè)的朋友來(lái)說(shuō)存在這個(gè)問(wèn)題。這次只談中斷。由于是初學(xué)者,難免會(huì )出錯,敬請各位指正。
 
    當一個(gè)程序正常執行過(guò)程中,CPU可能檢測到有某個(gè)中斷源發(fā)出中斷請求,這時(shí)ARM硬件實(shí)現了程序強制跳轉,在這之前保存了相關(guān)信息,以便程序正常返回。如果是發(fā)生了Reset中斷,程序實(shí)現系統初始化設置。
    開(kāi)始比較難以理解的是中斷產(chǎn)生后,程序都進(jìn)行了哪些操作。我就從跟蹤PC作為分析的主線(xiàn)。以發(fā)生FIQ中斷為例。(只以ROM起始地址為0為例,不為0的情況參照存儲地址映射)
    最簡(jiǎn)單的是中斷發(fā)生后,PC=0x08,在此地址處存放一個(gè)跳轉指令,跳轉到相關(guān)處理程序。當然多數情況中斷處理程序可能比較復雜,并且要處理多種中斷的情況下,采用一步映射兩步跳轉(我自己起的名字,不一定妥當)。如下圖所示:
    
一步映射指,在RAM地址中建立一個(gè)中斷向量表,圖中該表起始地址為0x400000,在該表中存放的是中斷處理函數的入口地址。兩步跳轉是指,當中斷發(fā)生時(shí),由于系統硬件強制程序跳轉到了0x08處,在該地址處是一個(gè)跳轉指令,跳轉到中斷函數地址解析程序IRQ_Handler,完成一步跳轉。解析程序(IRQ_Handler)的作用無(wú)非是把中斷向量表內中斷處理函數(SystemIrqHandler)的入口地址賦值給 PC,如圖所示PC=0x003000280,完成第二步跳轉,開(kāi)始處理中斷。在中斷處理函數的最后,恢復中斷開(kāi)始時(shí)保存的相關(guān)寄存器的值,完成中斷。
 
下面以一個(gè)實(shí)例來(lái)具體說(shuō)明中斷建立及實(shí)現的過(guò)程。
 
首先通過(guò)偽指令建立一個(gè)中斷向量表,用于存放中斷程序的入口地址(如上圖中的中斷向量表,注意,此時(shí)表中還未賦值): 
;/* EXCEPTION HANDLER VECTOR TABLE */ 
 
^ DRAM_BASE 
HandleReset # 4 
HandleUndef # 4 
HandleSwi # 4 
HandlePrefetch # 4 
HandleAbort # 4 
HandleReserv # 4 
HandleIrq # 4 
HandleFiq # 4 
 
 
然后定義一個(gè)連續的數據段,并把中斷處理函數的入口地址值賦給各字單元
ExceptionHandlerTable 
DCD UserCodeArea 
DCD SystemUndefinedHandler 
DCD SystemSwiHandler 
DCD SystemPrefetchHandler 
DCD SystemAbortHandler 
DCD SystemReserv 
DCD SystemIrqHandler 
DCD SystemFiqHandler 
 
 
下面從程序的開(kāi)始處分析: 
AREA Init, CODE, READONLY 
ENTRY 
/* ROM起始地址向量表 */
B Reset_Handler 
B Undefined_Handler 
B SWI_Handler 
B Prefetch_Handler 
B Abort_Handler 
NOP Reserved vector 
B IRQ_Handler 
B FIQ_Handler 
/* B跳轉范圍限于+ -32M內*/
 
 
/* 以下是地址解析程序 */
IRQ_Handler 
SUB sp, sp, #4 
STMFD sp!, {r0} FD滿(mǎn)遞減堆棧 執行寄存器壓棧操作. 
LDR r0, =HandleIrq  //對應程序開(kāi)始處以偽指令定義的向量表
LDR r0, [r0]  //中斷處理函數的地址賦給R0. 
STR r0, [sp, #4]  //中斷處理函數的地址入棧 
LDMFD sp!, {r0, pc} //實(shí)現程序跳轉,目前沒(méi)明白為什么又給r0賦值? 
 
 
上面提到了還沒(méi)有給中斷向量表賦值,下面代碼把中斷處理函數的地址放到DRAM中斷向量表里
EXCEPTION_VECTOR_TABLE_SETUP 
LDR r0, =HandleReset 
LDR r1, =ExceptionHandlerTable 
MOV r2, #8 
ExceptLoop 
LDR r3, [r1], #4 
STR r3, [r0], #4 
SUBS r2, r2, #1 Down Count 
BNE ExceptLoop ;; 
 
 
下面是中斷處理函數 
SystemIrqHandler 
IMPORT ISR_IrqHandler 
STMFD sp!, {r0-r7, lr} 
BL ISR_IrqHandler 
LDMFD sp!, {r0-r7, lr} 
SUBS pc, lr, #4 
 
它實(shí)際上只調用了下面的C語(yǔ)言的中斷處理函數,其他什么也沒(méi)做。 
void ISR_IrqHandler(void) 

IntOffSet = (U32)INTOFFSET; 
(IntOffSet>>2) 
(*InterruptHandlers[IntOffSet>>2])(); // Call interrupt service routine 

 
以上編程思路是,先在系統初始化時(shí)重新建立一個(gè)中斷向量表,并把相關(guān)的中斷處理函數的地址放到中斷向量表中。當系統監測到有中斷源請求服務(wù)后,硬件實(shí)現pc跳轉到地址0x08處,執行一個(gè)跳轉指令B IRQ_Handler  , 然后執行地址解析程序,把中斷向量表中的中斷處理函數的入口地址賦給pc,開(kāi)始響應中斷。在中斷處理函數的最后,執行
LDMFD sp!, {r0-r7, lr} 
SUBS pc, lr, #4 
實(shí)現中斷的返回。


關(guā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>