<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è) > 嵌入式系統 > 設計應用 > 關(guān)于stm32中R15寄存器的理解

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

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


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

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

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

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



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

評論


技術(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>