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

          新聞中心

          44B0中斷啟動(dòng)詳解

          作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
          44B0的初始化程序就是初始化各個(gè)關(guān)鍵的寄存器,建立中斷向量,然后轉(zhuǎn)移到主函數(shù)去執(zhí)行程序。不過(guò)44B0不支持地址映射,所以程序不COPY到RAM種執(zhí)行。44B0初始化對(duì)我們廣大初學(xué)者來(lái)說(shuō),比較難理解的是中斷的處理和一些少見(jiàn)的操作符號(hào),44b0的中斷子程序地址存放在初始化程序最后就是

          HandleADC # 4
          HandleRTC # 4
          HandleUTXD1 # 4
          HandleUTXD0 # 4
          HandleSIO # 4
          HandleIIC # 4
          HandleURXD1 # 4
          HandleURXD0 # 4
          這一段,它的其實(shí)地址是ISR_STARTADDRESS,個(gè)人寫(xiě)中斷程序的時(shí)候,子程序地址被編譯器連放在相應(yīng)的位置。初始化完成后,程序轉(zhuǎn)通過(guò)BL Main 轉(zhuǎn)到用戶(hù)定義的主程序上執(zhí)行。以下是我個(gè)人的一些理解,有錯(cuò)誤的地方希望大家指出來(lái)。

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


          GBLL THUMBCODE
          [ {CONFIG} = 16
          THUMBCODE SETL {TRUE}
          CODE32
          |
          THUMBCODE SETL {FALSE}
          ]

          [ THUMBCODE
          CODE32 ;for start-up code for Thumb mode
          ]
          ×××××××××××××××××××××××
          其中[=IF ,|=ELSE ,]= ENDIF, CODE32 表明一下操作都在ARM狀態(tài)。這些都是偽操作
          這段我理解為設(shè)定THUMCODE的值,然后確定,用戶(hù)的程序是在ARM狀態(tài)還是THUM狀態(tài)。不過(guò)不管THUMCODE是何值,下面代碼都是ARM狀態(tài)
          這段沒(méi)有什么很復(fù)雜的,就是這三個(gè)[,|,]操作符讓我迷惑了半天,翻了半天書(shū)才找到解釋


          MACRO 宏偽操作
          $HandlerLabel HANDLER(宏的名稱(chēng)) $HandleLabel(宏的參數(shù))

          $HandlerLabel
          sub sp,sp,#4 ;decrement sp(to store jump address)
          stmfd sp!,{r0} ;PUSH the work register to stack(lr doest 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
          *******************************
          這段當(dāng)初我覺(jué)得比較難理解,不過(guò)通過(guò)看各種程序,對(duì)這段有了一個(gè)基本的理解。這個(gè)宏的作用是把各個(gè)中斷程序的地址裝入當(dāng)前的PC,44B0有兩種裝斷模式一種是沒(méi)有中斷向量表,一種是使用中斷向量表的使用中斷向量表只能是IRQ方式,當(dāng)使用中斷向量表的時(shí)候,中斷發(fā)生時(shí)由44B0的中斷控制器自動(dòng)跳轉(zhuǎn)到相應(yīng)的位置。比如在中斷向量表的模式下,一個(gè)外部中斷0發(fā)生程序自動(dòng)跳轉(zhuǎn)到地址0X20處,0X20地址單元的指令時(shí)ldr pc,=HandlerEINT0因而程序PC跳到HandlerEINT0處,執(zhí)行這個(gè)宏操作,把外部中斷的函數(shù)的地址賦給PC。 44B0里面定義了一個(gè)
          #define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x84)) ,_ISR_STARTADDRES是中斷程序地址的起始地址,_ISR_STARTADDRESS+0X84是HandleEINT0的地址例如一個(gè)外部中斷函數(shù)名void EXINT(),程序里執(zhí)行 pISR_EINT0=(unsigned)EXIT,就把自己的函數(shù)地址賦給了標(biāo)號(hào)為HandleEINT0處的內(nèi)存單元
          IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
          IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
          IMPORT |Image$$ZI$$Base| ; Base and limit of area
          IMPORT |Image$$ZI$$Limit| ; to zero initialise

          ××××××××××××××××××××××××××××××××××
          這段我個(gè)人的理解為這些是連接器生成的于輸出段相關(guān)的符號(hào),是在沒(méi)有使用SCATTER文件的情況可以調(diào)用。這段指出了在ROM和RAM種的數(shù)據(jù)的地址,這些地址應(yīng)該是連接器生成的,不過(guò)為什么能調(diào)用連接器生產(chǎn)的符號(hào),我不大明白其中的原因,還希望各位說(shuō)說(shuō)自己的理解
          IsrIRQ ;using I_ISPR register.
          sub sp,sp,#4 ;reserved for PC
          stmfd sp!,{r8-r9}

          ;IMPORTANT CAUTION
          ;if I_ISPC isnt used properly, I_ISPR can be 0 in this routine.

          ldr r9,=I_ISPR
          ldr r9,[r9]
          mov r8,#0x0
          0
          movs r9,r9,lsr #1
          bcs ?
          add r8,r8,#4
          b ?

          1
          ldr r9,=HandleADC
          add r9,r9,r8
          ldr r9,[r9]
          str r9,[sp,#8]
          ldmfd sp!,{r8-r9,pc}
          ×××××××××××××××××××××××
          這段是沒(méi)有使用裝斷向量模式下如何裝載中斷子程序,因?yàn)?4B0有30個(gè)中斷源,所以需要程序處理以確定調(diào)用那個(gè)中斷程序
          0,1是局部標(biāo)號(hào),%B是向后搜索局部標(biāo)號(hào), %F是向前搜索局部標(biāo)號(hào) 。都是偽操作
          I_ISPR寄存器各位表明發(fā)生了應(yīng)該調(diào)用那個(gè)中斷子程序。只能1位置位,其它位為0,比如說(shuō)串口1發(fā)送中斷發(fā)生,這時(shí)I_ISPR的值為0X04,

          ldr r9,=I_ISPR
          ldr r9,[r9] 兩條指令后,r9的內(nèi)容為0X4 ,
          movs r9,r9,lsr #1 r9內(nèi)容右移一位
          bcs ? 判斷是否把置位是否轉(zhuǎn)移到C位,
          add r8,r8,#4 如果沒(méi)有的R8加4
          如果r9內(nèi)容為0x04 需要右移3次 ,之后r8的內(nèi)容為8 然后HandleADC的地址 加上r8的值就是串口1發(fā)送中斷的地址,這個(gè)地址的內(nèi)容是中斷子程序的地址
          再說(shuō)明幾個(gè)偽操作:^=MAP. #=field
          別的方面我覺(jué)得比較容易理解了,就不多講了。



          關(guān)鍵詞: 44B0中斷啟

          評(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); })();