色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 關(guān)于stm32中R15寄存器的理解

          關(guān)于stm32中R15寄存器的理解

          作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
          今天上午看《stm32權(quán)威指南》中關(guān)于R15寄存器中有些內(nèi)容不理解,查了查資料,原來(lái)是這樣。


          本文引用地址:http://cafeforensic.com/article/201611/317761.htm

          這里有一個(gè)別人的問題。

          我把Nor Flash里的一個(gè)函數(shù)代碼數(shù)據(jù)(函數(shù)首地址是:0x6400EC10)拷貝到RAM的 0x2000FC00,
          然后把0x2000FC00加載給PC指針(為了讓代碼在RAM里運(yùn)行),接著就出現(xiàn)了Hard Fault
          Exception,而用 IAR 單步執(zhí)行的時(shí)候能正常運(yùn)行。同時(shí)我將一個(gè)函數(shù)地址值賦給一個(gè)unsigned int
          變量之后發(fā)現(xiàn)自動(dòng)加了1。對(duì)于這些問題先看權(quán)威指南里是怎么說(shuō)的吧。
          一,PC指針(程序計(jì)數(shù)器R15)(權(quán)威指南)
          R15是程序計(jì)數(shù)器,在匯編代碼中稱為“PC指針”。因?yàn)镃M3內(nèi)部使用了指令流水線,讀PC時(shí)返回的值
          是當(dāng)前指令的地址+4。比如說(shuō):
          0x1000: MOV R0, PC ; R0 = 0x1004
          如果向PC中寫數(shù)據(jù),就會(huì)引起一次程序的分支(但是不更新LR寄存器)。CM3中的指令至少是半字
          對(duì)齊的,所以PC的LSB總是讀回0。然而,在分支時(shí),無(wú)論是直接寫PC的值還是使用分支指令,都必
          須保證加載到PC的數(shù)值是奇數(shù)(即LSB=1),用以表明這是在Thumb狀態(tài)下執(zhí)行。倘若寫了0,則視
          為企圖轉(zhuǎn)入ARM模式,CM3將產(chǎn)生一個(gè)fault異常。這些可以總結(jié)為讀PC指針時(shí),返回LSB總是為0;
          寫PC指針時(shí),一定要保證LSB為奇數(shù)。
          二,函數(shù)地址(自己總結(jié)的)
          正如上面所說(shuō),寫PC指針的時(shí)候必須保證LSB為奇數(shù),如果執(zhí)行跳轉(zhuǎn)指令的時(shí)候,將一個(gè)函數(shù)指針
          加載給PC,這時(shí)候就必須保證這個(gè)函數(shù)地址的LSB為奇數(shù),而且還必須是(4*n+1)(n=0,1,2,3)
          這樣的奇數(shù),只有這樣運(yùn)行程序才不會(huì)跑飛。在以后的編程中,如果執(zhí)行函數(shù)跳轉(zhuǎn)的時(shí)候,一定要
          保證這個(gè)函數(shù)地址的低四位的值為(4*n+1)(n=0,1,2,3)。
          基于上面兩點(diǎn),就可以很好的解釋所出現(xiàn)的問題了,如果將0x2000FC00加載給PC指針,肯定會(huì)出現(xiàn)
          Hard Fault Exception,因?yàn)?0x2000FC00 的 LSB = 0;但是如果將 0x2000FC01加載給PC指針,程
          序就能正常運(yùn)行了,這就應(yīng)證了權(quán)威指南里所說(shuō)的寫PC指針的時(shí)候必須保證加載給PC的值的LSB為1
          。
          而之前的為什么用IAR單步執(zhí)行能成功,原因是IAR的調(diào)試器做了處理,使得每一次調(diào)試的時(shí)候?qū)C
          指針的LSB做了一個(gè)奇偶變換;當(dāng)全速運(yùn)行的時(shí)候,調(diào)試器不管用了,直接由CPU接管,這個(gè)時(shí)候?qū)?br />函數(shù)地址加載給PC的值的LSB為偶數(shù),當(dāng)然導(dǎo)致程序跑飛了。
          還有為什么將一個(gè)函數(shù)地址值賦給一個(gè)unsigned int 變量之后會(huì)自動(dòng)加一呢,這個(gè)是Cortex-M3的一
          個(gè)特性,也就是說(shuō)讀取一個(gè)函數(shù)地址值返回的LSB為0,當(dāng)賦值給一個(gè)變量的時(shí)候會(huì)加1,這是為了將
          這個(gè)變量值加載給PC指針之后保證PC指針的LSB為1。
          問題解決了,希望對(duì)碰到同樣問題的朋友能有所幫助。同時(shí)如果總結(jié)的不好,大家可以一起交流交流。

          但是,這個(gè)部分又是怎么理解的呢?



          關(guān)鍵詞: stm32R15寄存

          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉