<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          ARM中斷宏定義

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

          $HandlerLabel HANDLER $HandleLabel

          本文引用地址:http://www.ex-cimer.com/article/201611/316748.htm

          $HandlerLabel

          sub sp,sp,#4 ;decrement sp(to store jump address) 存貯PC跳轉(zhuǎn)地址

          stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

          ldr r0,=$HandleLabel ;load the address of HandleXXX to r0

          ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

          str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

          ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

          MEND

          MACRO相當(dāng)于c中的#define

          而$HandlerLabel 和 $HandleLabel是兩個(gè)參數(shù),大家注意,第一個(gè)參數(shù)和第二個(gè)參數(shù)是不一樣的,中間少了個(gè)r

          而第一個(gè)參數(shù)在本宏中是一個(gè)標(biāo)號(hào),而第二個(gè)函數(shù)是一個(gè)入口地址

          以下有定義:

          HandlerFIQ HANDLER HandleFIQ

          HandlerIRQ HANDLER HandleIRQ

          HandlerUndef HANDLER HandleUndef

          HandlerSWI HANDLER HandleSWI

          HandlerDabort HANDLER HandleDabort

          HandlerPabort HANDLER HandlePabort

          拿HandlerSWI HANDLER HandleSWI說(shuō)明:把它用宏給替換下來(lái)以后是:

          $HandlerSWI

          1:sub sp,sp,#4 ;decrement sp(to store jump address) 存貯PC跳轉(zhuǎn)地址

          2:stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address)

          3:ldr r0,=$HandleSWI ;load the address of HandleXXX to r0

          4:ldr r0,[r0] ;load the contents(service routine start address) of HandleXXX

          5:str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack

          6:ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR)

          這段宏定義的作用是什么呢?是安裝SWI中斷,如何安裝的呢?

          sub sp,sp,#4 是把SP的地址減4字節(jié),而這個(gè)地方需要存放跳轉(zhuǎn)地址也就是第5行的HandleSWI指向的內(nèi)容(ISR)

          接下來(lái)是壓棧所需要的寄存器r0,因?yàn)榻酉聛?lái)需要使用r0所以先壓棧r0,這也是為什么剛剛先把SP加四字節(jié)的原因,第6句話就是跳轉(zhuǎn)到剛剛第5句所壓棧的地址處,也就是HandleSWI指向的內(nèi)容(ISR)處

          這里有一句話不是很明白,就是r0,這樣壓棧又出棧,跟沒(méi)有壓和出有什么區(qū)別,也就是說(shuō),上下文的內(nèi)容一樣了,破壞了中斷前的r0,返回后的r0不再是原先的r0了,不理解?

          VectorsAddr

          LDR PC, Reset_Addr

          LDR PC, Undefined_Addr

          LDR PC, SWI_Addr

          LDR PC, Prefetch_Addr

          LDR PC, Abort_Addr

          NOP ; Reserved vector

          LDR PC, IRQ_Addr

          LDR PC, FIQ_Addr

          EXPORT VectorsAddr

          Reset_Addr DCD ResetHandler ;第一次地址轉(zhuǎn)換

          Undefined_Addr DCD HandlerUndef

          SWI_Addr DCD HandlerSWI

          Prefetch_Addr DCD HandlerPabort

          Abort_Addr DCD HandlerDabort

          IRQ_Addr DCD HandlerIRQ

          FIQ_Addr DCD HandlerFIQ

          按照我的想法執(zhí)行中斷時(shí)是這樣的:

          首先PC->0x30000000比如說(shuō)這個(gè)地址是IRQ_Addr ,因?yàn)镈CD是接下來(lái)的連續(xù)的4字節(jié),PC需要執(zhí)行

          PC->0x30000004這個(gè)地址就是執(zhí)行的HandlerIRQ,而這個(gè)地址根據(jù)上面安裝好的中斷,它應(yīng)該是一個(gè)指針,也就是說(shuō)PC執(zhí)行的這一句話是一個(gè)跳轉(zhuǎn)指令,因?yàn)镠andlerIRQ是一個(gè)指針,那么應(yīng)該跳到HandlerIRQ所指地方處運(yùn)行,HandlerIRQ所指的就是真正的中斷程序IRQ_ISR,大家看這里使用了兩次地址轉(zhuǎn)換,第一次是順序執(zhí)行,第二次才是真正的跳轉(zhuǎn),那么我們?cè)诎惭b中斷時(shí)就是在第二次的地方改變HandlerIRQ所指向的函數(shù)就可以控制中斷函數(shù)的不同。

          MACRO ;宏定義開(kāi)始
          MOV_PC_LR ;宏的名字
          [THUMBCODE ;表示在Thumb工作狀態(tài)
          bxlr ;分支到 Thumb 代碼 lr
          |
          movpc,lr ;把lr 保存到PC指針
          ]
          MEND ;宏定義結(jié)束

          ;arm處理器有兩種工作狀態(tài)
          1.arm:32位 這種工作狀態(tài)下執(zhí)行字對(duì)準(zhǔn)的arm指令

          2.Thumb:16位 這種工作狀態(tài)執(zhí)行半字對(duì)準(zhǔn)的Thumb指令


          ;因?yàn)樘幚砥鞣譃?6位 32位兩種工作狀態(tài) 程序的編譯器也是分16位和32兩種編譯方式 所以下面的程序用于根據(jù)處理器工作狀態(tài)確定編譯器編譯方式
          ;code16偽指令指示匯編編譯器后面的指令為16位的thumb指令
          ;code32偽指令指示匯編編譯器后面的指令為32位的arm指令
          ;這段是為了統(tǒng)一目前的處理器工作狀態(tài)和軟件編譯方式(16位編譯環(huán)境使用tasm.exe編譯)

          另外
          [ =if
          | =else
          ] =end if



          關(guān)鍵詞: ARM中斷宏定

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();