新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編中的LDR及ADR的區別及其在UBOOT中的應用

        ARM匯編中的LDR及ADR的區別及其在UBOOT中的應用

        作者: 時間:2016-11-20 來源:網絡 收藏
        我在看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.104case.com/article/201611/318776.htm

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

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

        ldr r0, =SMRDATA的作用是讓r0等于U-BOOT編譯時已經確定下來的SMRDATA這塊內存緩沖池的起始地址。
        ldr r1, _TEXT_BASE的作用則是讓r1等于_TEXT_BASE這個標號所在的內存里面的內容,也就是 TEXT_BASE。對于MINI2440開發板來說這個值等于 TEXT_BASE = 0x33F80000(boardsamsungmini2440config.mk)這個地址是
        由于TEXT_BASE實際的地址現在應該是FLASH的0地址(或者內部4KSRAM的0地址),所以第三條指令 sub r0, r0, r1 ,實現了計算SMRDATA當前在arm地址空間里的實際訪問地址。
        接下去就是通過
        ldr r3, [r0], #4 ;從r0這個地址里取一個32bit的數據,放到r3,并將r0+4,指向下一個內存池里的數據。
        str r3, [r1], #4 ;這條指令實現了把r3里的數據賦值給r1所標示的地址。r1的地址通過下面這幾句實現。以此配置完從0x48000000開始的CPU內部寄存器的值。這樣SDRAM就開始工作了。以后就是正常訪問0x30000000開始的地址空間了。
        #define BWSCON 0x48000000
        ldr r1, =BWSCON /* Bus Width Status Controller */
        上面的這個配置代碼是無法在將U-BOOT直接用OPENJTAG下載到OPENJTAG中時工作的。因為當下載到內存中的時候,SDRAM的地址是隨機的,至少不是從0開始的,這樣得到的SMRDATA所在的地址按上面的方式是得不到的,所以需要一條在運行時地址與位置無關的指令。這就是 adr指令。下面代碼就是改進后的:
        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 /*位置無關*/
        add r0,r0,r3 /*r0 = r0 +r3 ,r0存放的是當前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



        關鍵詞: ARM匯編LDRADRUBOO

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜城市| 定西市| 广宗县| 云阳县| 桐梓县| 绍兴市| 久治县| 乃东县| 顺昌县| 江城| 阜宁县| 隆德县| 台北县| 济宁市| 南木林县| 凤台县| 莒南县| 溆浦县| 巴塘县| 岐山县| 屏山县| 涪陵区| 黄陵县| 隆安县| 来宾市| 阳江市| 荥阳市| 古交市| 台北市| 万山特区| 黔南| 文化| 嵩明县| 乌兰察布市| 原阳县| 临洮县| 稷山县| 开封县| 沾益县| 泽普县| 花莲市|