您的位置 首页 资料

ARM9学习笔记之——SDRAM试验

最近,我有努力学习《深入浅出嵌入式底层软件开发》。我自我觉得这本书很好。如果你有一块Mini2440的开发板,那就再好不过了。学了点东西…

最近,我有努力学习《浅显易懂嵌入式底层软件开发》。我自我觉得这本书很好。假如你有一块Mini2440的开发板,那就再好不过了。

学了点东西,写点总结。以下是我在做 Page130,2.6.8内存驱动试验总结。

——-

我依照书上的指示,完结了代码的编写。对项目作如下装备:

上述的装备中 -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文件。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/264146.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部