新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM9學習筆記之——SDRAM實驗

        ARM9學習筆記之——SDRAM實驗

        作者: 時間:2016-11-20 來源:網絡 收藏
        最近,我有努力學習《深入淺出嵌入式底層軟件開發》。我自我覺得這本書很好。如果你有一塊Mini2440的開發板,那就再好不過了。

        學了點東西,寫點總結。以下是我在做 Page130,2.6.8內存驅動實驗總結。

        本文引用地址:http://www.104case.com/article/201611/318811.htm

        -------

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

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

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

        第一個問題:我在用AXD進行調試時,總是發現程序運行到 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 地址上去。可是總是在copyallloop 循環中死掉。

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

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

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

        在進入copyallloop之前,反匯編如下:

        當r0 = 0x3000000D0時:


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

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

        令我奇怪的是,程序開始執行時,PC并不等于0x00000000,而是另一個值。如下所示:



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

        當我退出調試模式,直接復位運行。我發現,程序只在反復運行 xmain() 函數。而沒有執行start處初始化相關的指令。可見ARM復位后,還是從0x0000地址上開始執行的。

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

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


        修改配置后,重新編譯。在AXD中查看其反匯編代碼,如下:

        這樣一來,start就被放到了前面了。

        第三個問題:如何完成實驗?

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

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

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

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

        關于生成bin文件方法:

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

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

        3. 重新Make,就會生成bin文件。



        關鍵詞: ARM9SDRAM實

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 十堰市| 衡阳县| 茂名市| 寿宁县| 阿拉善右旗| 信阳市| 财经| 四平市| 霍邱县| 沁阳市| 光泽县| 奉节县| 夏邑县| 修水县| 青神县| 通道| 屏边| 高雄市| 册亨县| 曲水县| 桐柏县| 本溪市| 科技| 浦北县| 乌拉特后旗| 西安市| 尉氏县| 霍城县| 余庆县| 农安县| 长宁县| 新闻| 苍南县| 永善县| 根河市| 诏安县| 南召县| 衡东县| 雅江县| 永顺县| 成都市|