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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM匯編中的LDR及ADR的區(qū)別及其在UBOOT中的應(yīng)用

          ARM匯編中的LDR及ADR的區(qū)別及其在UBOOT中的應(yīng)用

          作者: 時間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
          我在看U-BOOT的lowlevel_init.S文件時看到以下代碼:

          lowlevel_init:
          ldr r0, =SMRDATA
          ldr r1, _TEXT_BASE
          sub r0, r0, r1
          ldr r1, =BWSCON
          add r2, r0, #13*4
          0:
          ldr r3, [r0], #4
          str r3, [r1], #4
          cmp r2, r0
          bne 0b
          mov pc, lr

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

          這段代碼實現(xiàn)了U-BOOT的內(nèi)存控制器部分的寄存器初始化,一共13個寄存器,對U-BOOT來最重要的就是SDRAM的初始化,顯然沒有這部分代碼,當(dāng)U-BOOT從NAND FLASH中啟動的時候,START.S文件是無法完成代碼的relocate的。因為SDRAM沒初始化,用不了。

          要理解這段代碼主要是搞清楚LDR的兩種用法。

          ldr r0, =SMRDATA的作用是讓r0等于U-BOOT編譯時已經(jīng)確定下來的SMRDATA這塊內(nèi)存緩沖池的起始地址。
          ldr r1, _TEXT_BASE的作用則是讓r1等于_TEXT_BASE這個標(biāo)號所在的內(nèi)存里面的內(nèi)容,也就是 TEXT_BASE。對于MINI2440開發(fā)板來說這個值等于 TEXT_BASE = 0x33F80000(boardsamsungmini2440config.mk)這個地址是
          由于TEXT_BASE實際的地址現(xiàn)在應(yīng)該是FLASH的0地址(或者內(nèi)部4KSRAM的0地址),所以第三條指令 sub r0, r0, r1 ,實現(xiàn)了計算SMRDATA當(dāng)前在arm地址空間里的實際訪問地址。
          接下去就是通過
          ldr r3, [r0], #4 ;從r0這個地址里取一個32bit的數(shù)據(jù),放到r3,并將r0+4,指向下一個內(nèi)存池里的數(shù)據(jù)。
          str r3, [r1], #4 ;這條指令實現(xiàn)了把r3里的數(shù)據(jù)賦值給r1所標(biāo)示的地址。r1的地址通過下面這幾句實現(xiàn)。以此配置完從0x48000000開始的CPU內(nèi)部寄存器的值。這樣SDRAM就開始工作了。以后就是正常訪問0x30000000開始的地址空間了。
          #define BWSCON 0x48000000
          ldr r1, =BWSCON /* Bus Width Status Controller */
          上面的這個配置代碼是無法在將U-BOOT直接用OPENJTAG下載到OPENJTAG中時工作的。因為當(dāng)下載到內(nèi)存中的時候,SDRAM的地址是隨機(jī)的,至少不是從0開始的,這樣得到的SMRDATA所在的地址按上面的方式是得不到的,所以需要一條在運行時地址與位置無關(guān)的指令。這就是 adr指令。下面代碼就是改進(jìn)后的:
          lowlevel_init:
          /* memory control configuration */
          /* make r0 relative the current location so that it */
          /* reads SMRDATA out of FLASH rather than memory ! */
          ldr r0, =SMRDATA
          ldr r1, =lowlevel_init /*編譯時確定的地址*/
          sub r0, r0, r1 /* r0 = r0 -r1 , r0 = SMRDATA相對于lowlevel_init的偏移值 */
          adr r3, lowlevel_init /*位置無關(guān)*/
          add r0,r0,r3 /*r0 = r0 +r3 ,r0存放的是當(dāng)前SMRDATA的實際地址*/
          ldr r1, =BWSCON /* Bus Width Status Controller */
          add r2, r0, #13*4
          0:
          ldr r3, [r0], #4
          str r3, [r1], #4
          cmp r2, r0
          bne 0b



          關(guān)鍵詞: ARM匯編LDRADRUBOO

          評論


          技術(shù)專區(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); })();