ARM9学习笔记之——SDRAM实验

简介:

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

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

    我按照书上的指示,完成了代码的编写。对项目作如下配置:

    上述的配置中 -ro-base 0x30000000 告诉Linker,本程序将被加载到 0x30000000 上运行。

    实验程序的功能是,程序最初是在0x00000000 地址上开始运行。它初始化SDRAM后,将自己复制到0x30000000地址上,然后跳到SDRAM中运行。

第一个问题:我在用AXD进行调试时,总是发现程序运行到 copyallloop 中死掉。


copyall
    IMPORT  |Image$$RO$$Base|    
    IMPORT  |Image$$RW$$Limit|    
        
    ldr r0, = |Image$$RO$$Base|   
    ldr r1, = |Image$$RW$$Limit|   
    ldr r2, = 0x00000000   
        
copyallloop
    teq r0, r1   
    beq quitcopy   
    ldr r3 , [r2], #4   
    str r3 , [r0], #4        
    b copyallloop   
quitcopy
    mov 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文件。


目录
相关文章
|
异构计算
【黑金ZYNQ7000系列原创视频教程】03.体验FPGA里的ARM——裸机helloworld实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36637&extra=page%3D1     爱奇艺地址: http://www.iqiyi.com/w_19rugii7ut.html?source=
1333 0
【黑金ZYNQ7000系列原创视频教程】05.FPGA和ARM的初次结合——LED实验
黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36639&extra=page%3D1   爱奇艺地址: http://www.iqiyi.com/w_19rughesgp.html?source=
1498 0
【各种问题处理】X86架构和ARM架构的区别
【1月更文挑战第13天】【各种问题处理】X86架构和ARM架构的区别
|
4月前
|
Web App开发 NoSQL 安全
ARM架构-银河麒麟v10-server离线安装Harbor
ARM架构-银河麒麟v10-server离线安装Harbor
311 0
|
4月前
|
边缘计算 编译器 数据中心
X86架构与Arm架构的主要区别分析
X86架构与Arm架构的主要区别分析
470 0
|
3月前
|
缓存 API Android开发
一起学点ARM的微架构二?
一起学点ARM的微架构二?
74 1
|
6月前
|
存储 缓存 监控
安谋科技(Arm China)马闯:Arm架构下性能分析与优化介绍
2023年9月19日,系列课程第九节《Arm®架构下性能分析与优化介绍》正式上线,由安谋科技 (Arm China)主任工程师马闯主讲,内容涵盖:Arm架构下性能监控单元 (PMU) 介绍、Arm统计性能分析扩展 (SPE) 介绍、Arm性能分析工具介绍、Arm架构下性能优化案例分享,本期节目在阿里云官网、阿里云微信视频号、阿里云钉钉视频号、InfoQ官网、阿里云开发者微信视频号、阿里云创新中心直播平台 & 微信视频号同步播出,同时可以点击【https://developer.aliyun.com/topic/ecs-yitian】进入【倚天实例迁移课程官网】了解更多内容。
|
6月前
|
Java Nacos Maven
Nacos一个arm架构的jdk8。
Nacos一个arm架构的jdk8。
177 1
|
3天前
|
敏捷开发 数据可视化 物联网
云效产品使用常见问题之用ARM架构的机器意义不知道如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
1月前
|
存储 机器学习/深度学习 并行计算
阿里云服务器X86计算、Arm计算、GPU/FPGA/ASIC、高性能计算架构区别
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别,本文主要简单介绍下不同类型的云服务器有何不同,主要特点及适用场景有哪些。
阿里云服务器X86计算、Arm计算、GPU/FPGA/ASIC、高性能计算架构区别