调试U-Boot笔记(四)

简介:
  昨天说了AXD的那个 Configure Target... 菜单项中要选择个什么dll文件。今天在公司里我查了一下,确实如果。昨天我忽略了一点,打开AXD进行调试的时候,AXD怎么知道我与目标板是通过 JLink进行通信的?发果没有,那么实际上我们昨天调试的程序都是在电脑上仿真的。

    打开 Options->Configure Target.. 在弹出的对话框中添加 JLinkRDI.Dll 文件。
   
    点击[Add]按钮,在JLink驱动的安路径下找到 JLinkRDI.dll 文件并添加进来。在我的电脑该文件的路径是:C:Program Files (x86)SEGGERJLinkARM_V434JLinkRDI.dll
 
    然后,我们再来调试u-boot程序。
    我们把AXD的加载u-boot的命令写成一个脚本文件u-boot.txt,放到 E: 下。
    > loadbinary e:u-boot-gdbu-boot.bin 0x33f80000

    > loadsymbols e:u-boot-gdbu-boot.axf

    > setpc 0x33f80000

    然后我们在AXD的命令行里执行命令:
    > ob e:u-boot.txt
    AXD就从u-boot.txt里读取命令,并执行。这样可以减少我们反复敲命令带来的麻烦。
 
    好,我们执行一下。代码已导进来了,可以我们一执行就出错了。
    这时我才想起,SDRAM没有配置,下载到0x33f80000地址上的代码肯定无法保存。所以,我们得先下载并执行init.bin程序来初始化SDRAM,使之可用。
    OK,执行以下命令,下载init.bin文件并执行:
    > loadbinary e:init.bin 0x40000000
    > setpc 0x40000000
    > run
    这下,看到开发板上的LED在闪烁,说明init.bin程序完成了SDRAM的初始化。
    暂停程序,然再导入u-boot程序到0x33f80000
    > ob e:u-boot.txt
 
    OK,这下u-boot程序才算是真正地下载到了目标板上去了。单步执行一下,没有问题。
 
    但我还是遇到了挑战:
   
    为什么执行到start.S文件的165~166行时r0与r1的值不会劲呀!
   
    怎么会是这两个值呢?按程序的执行预期结果。它们应该都为0x33f80000呀!?
    按Ctrl+M打开内存监视器,将地址设置为0x33f80000,观查这块内存空间有没有被篡改的迹象
   
 
    果不其然,发现程序执行了160行的 bl cpu_init_crit之后,0x33f80000空间内存全被篡改了:
   
 
    那问题肯定出在cpu_init_crit里,那么我们一步一步跟起去,看倒底是执行了什么语句使用内存数据被改的。最终发现是在cpu_init_crint() 调用 lowleve_init()对SDRAM进行初始化时,内存里的数据被破坏了:
   
    lowlevel_init定义在 u-boot/board/my2440/lowlevel_init.S 文件里,主要的工作是配置SDRAM的控制寄存器。将L155~167的数据逐一赋给BWSCON地址的控制寄存器。正是这个赋值操作,使用内存中存在的 数据被破坏。
    如果这个操作有破坏性,那很明显我们是直接从0x33f80000地址运行的,不需要但初始化SDRAM了。我们可以会程序做一点小修改,使之跳过执行lowlevel_init。
   
    由于start.S中全为汇编代码,不方便描述。这里我用伪代码说一下我的思路。
    之前的程序逻辑是:

cpu_init_crit();
if ( start != TEXT_BASE )
{
    relocate();
}
stack_setup();
if ( bootFrom NandFlash )
{
    nand_read_ll();
}

    现在将其更改为: 

if ( start != TEXT_BASE )
{
    cpu_init_crit();
    if (bootFrom NandFlase){
        nand_read_ll();
    }else{
        relocate();
    }
}
stack_setup();

  cpu_init_crit()只有在reboot时才执行,如果是从NandFlash启动,则调用nand_read_ll()从NandFlash 中导入程序代码,如果是从NorFlash启动的,那么就直接调用重定位函数relocate()将代码从0x00搬到0x33f80000去。
 
    修改了start.S文件行,重新编译,再用AXD进行调试。
    OH, Yeah! u-boot真的跑起来了!!!
    如下是我修改好的start.S文件,供大家参考: start.zip  ,用里面的start.S文件替换原来的u-boot/cpu/arm920t/start.S ,然后再重新编译就可以了。
 
    好了,今天的学习就暂且到此为止。明天我们一起尝试将u-boot烧录到NandFlash与NorFlash中……

目录
相关文章
|
6月前
|
监控 IDE Java
Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题
Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题
98 0
|
5月前
|
小程序 Java 数据库
基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)
基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)
|
5月前
|
Shell 数据安全/隐私保护 开发者
详细解读ApolloGPS调试笔记
详细解读ApolloGPS调试笔记
23 0
|
6月前
|
IDE Java 开发工具
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
82 0
【CSDN 云IDE】中实现Spring Boot文件的上传与下载
|
安全 Java Spring
Spring Security 401和403错误解析及调试:从源码到调试技巧
Spring Security 401和403错误解析及调试:从源码到调试技巧
|
Java Windows Spring
惊呆了!Spring Boot 还能远程调试?
惊呆了!Spring Boot 还能远程调试?
|
消息中间件 存储 JSON
源码环境调试|学习笔记
快速学习源码环境调试
源码环境调试|学习笔记
|
Java Spring
SpringBoot自动配置源码调试
SpringBoot自动配置源码调试
536 0
|
Java Maven 开发工具
Spring Boot Debug 调试秘籍,日后必定有用!
最近发现 Spring Boot 本地不能 Debug 调试了,原来 Spring Boot 升级后,对应插件的命令参数都变了,故本文做一个升级。
290 0
Spring Boot Debug 调试秘籍,日后必定有用!
|
IDE Java PHP
使用Cloud Studio在线编写、调试和管理Spring Boot应用
使用Cloud Studio在线编写、调试和管理Spring Boot应用
596 0
使用Cloud Studio在线编写、调试和管理Spring Boot应用