<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è) > 嵌入式系統 > 設計應用 > ARM9學(xué)習筆記之——SDRAM實(shí)驗

ARM9學(xué)習筆記之——SDRAM實(shí)驗

作者: 時(shí)間:2016-11-20 來(lái)源:網(wǎng)絡(luò ) 收藏
最近,我有努力學(xué)習《深入淺出嵌入式底層軟件開(kāi)發(fā)》。我自我覺(jué)得這本書(shū)很好。如果你有一塊Mini2440的開(kāi)發(fā)板,那就再好不過(guò)了。

學(xué)了點(diǎn)東西,寫(xiě)點(diǎn)總結。以下是我在做 Page130,2.6.8內存驅動(dòng)實(shí)驗總結。

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

-------

我按照書(shū)上的指示,完成了代碼的編寫(xiě)。對項目作如下配置:

上述的配置中 -ro-base 0x30000000 告訴Linker,本程序將被加載到 0x30000000 上運行。

實(shí)驗程序的功能是,程序最初是在0x00000000 地址上開(kāi)始運行。它初始化SDRAM后,將自己到0x30000000地址上,然后跳到SDRAM中運行。

第一個(gè)問(wèn)題:我在用AXD進(jìn)行調試時(shí),總是發(fā)現程序運行到 copyallloop 中死掉。

copyallIMPORT	|Image$$RO$$Base|    IMPORT	|Image$$RW$$Limit|    ldr r0, = |Image$$RO$$Base|   ldr r1, = |Image$$RW$$Limit|   ldr r2, = 0x00000000   copyallloopteq r0, r1   beq quitcopy   ldr r3 , [r2], #4   str r3 , [r0], #4	     b copyallloop   quitcopymov pc, lr

copyall函數的功能是將 0x00000000 地址上的所有程序代到到SDRAM的 0x30000000 地址上去??墒强偸窃赾opyallloop 循環(huán)中死掉。

結果查看寄存器才知道,知道程序開(kāi)始并沒(méi)有被加載到0x00000000的地址上,而是被加載到SDRAM中。如下是程序開(kāi)始運行時(shí),各寄存器的值:

由此可以得知,PC的初始值為0x3000005C,而不是PC = 0x00000000。說(shuō)明調試時(shí)程序被加載到SDRAM中運行。

這么一來(lái),那么將0x00000000地址區間的數據考到0x30000000地址上來(lái),而程序自身就運行在0x30000000地址上。這樣一來(lái),的數據將程序自己給覆蓋了。難怪要死在那里。

在進(jìn)入copyallloop之前,反匯編如下:

當r0 = 0x3000000D0時(shí):


此時(shí),0x300000D0之前的指令已被更改。所以,死在這里了。

第二個(gè)問(wèn)題:為什么xmain()函數被放在0x0000地址上,而不是start呢?

令我奇怪的是,程序開(kāi)始執行時(shí),PC并不等于0x00000000,而是另一個(gè)值。如下所示:



可見(jiàn),圖中所示A處,PC并不等于0x0000,而是0x005C。不對呀!ARM核啟動(dòng)不是多0x0000開(kāi)始的嗎?怎么成了0x005C呢?再看D處,start啟動(dòng)程序被放到了0x005C的位置。而放在 0x0000 地址上的指令則是xmain函數入口,見(jiàn)C處。

當我退出調試模式,直接復位運行。我發(fā)現,程序只在反復運行 xmain() 函數。而沒(méi)有執行start處初始化相關(guān)的指令??梢?jiàn)ARM復位后,還是從0x0000地址上開(kāi)始執行的。

那么,為什么編譯器要把 xmain 放在0x0000地址上,而不是 start 呢?我詳細地對比了書(shū)上的配置界面的各項設置。發(fā)現在 Equivalent Command Line 欄中,我少寫(xiě)了 "-first init.o" 這句話(huà)的意思就是說(shuō),把init.o目標文件的代碼放在首位。正確的命令串為:

-info totals -ro-base 0x30000000 -first init.o


修改配置后,重新編譯。在A(yíng)XD中查看其反匯編代碼,如下:

這樣一來(lái),start就被放到了前面了。

第三個(gè)問(wèn)題:如何完成實(shí)驗?

現在,我把 RO Base設置成了0x30000000 ,只要一進(jìn)入調試模式,AXD就自動(dòng)將我的代碼加載到了 SDRAM 的 0x30000000地址上了。

按照書(shū)中的要求,代碼應該被燒錄到 0x00000000 地址上(Nor Flash)中才對。而且工程編譯后又沒(méi)有bin或hex文件,也沒(méi)法直接用H-Flasher燒。

(1)我該怎么讓代碼在調試時(shí)燒到 0x00000000 上,而不是 0x30000000上。

(2)如何讓工程在編譯時(shí)生成燒錄文件。

關(guān)于生成bin文件方法:

1. DebugRel Settings->Linker->ARM fromELF->Output format指定Plain binary->Output file name 路徑

2. DebugRel Settings->Target->Post-Linker中選擇ARM fromELF

3. 重新Make,就會(huì )生成bin文件。



關(guān)鍵詞: ARM9SDRAM實(shí)

評論


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