新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于AM335x的U-Boot/SPL 的CCS 调试

基于AM335x的U-Boot/SPL 的CCS 调试

作者:时间:2016-09-12来源:网络收藏
Load

最后点击Finish,SPL就会被load到片上RAM中了。如果在console窗口中有错误信息,需要把SPL image重新加载 一遍。

B. 加载 symbol。

在上一步里,只是加载了RAW image,还没有加载调试所需要的带有调试信息的symbol。

可以通过Run -》 Load -》 LoadSymbols 加载symbol信息,界面如下:

111

这里选择的是带有symbol信息的U-Boot-.

C. 设置Cortex-A8 core到ARM状态。

ARM core 启动后,默认在Thumb(16bit)模式下,如前面所说,需要将其切换到ARM(32bit)下。具体做法是,View-》Registers, 展开CPSR寄存器,把T位设置为0。界面如下:

D. SPL的单步调试。

a. 从SPL编译的memory map可知,SPL从0x402f0400开始执行,所以首先就要把寄存器PC的值设为0x402f0400。可以通过 View-》Registers中设置PC指针的值即可, 界面如下,将红色框里面的改为0x402f0400即可。

009

b. 点击Debug窗口(view-》debug)上tool bar中的汇编单步按钮,如下图所示,就开始调试了。

Debug

这时,在反汇编窗口(view-》disassembly)中,如下图所示,看到的是汇编代码,而且在编辑窗口这边看不到源码。这是由于开始执行的代码在/arch/arm/cpu/armv7/start.s 中,反汇编和汇编一样,所以没有显示源码。

00

同时,可以看到PC指针运行到0x402f0458处。这里只是单步执行了一条指令,为什么跳过了这么大块地址?这里的单步运行,指令地址空间跳转了n指令,而不是一条指令,这是因为0x402f0400处存放的是异常中断向量表,通过默认启动的入口跳到reset symbol对应的地址了,也就是在0x402f0400处跳转到0x402f0458了,具体代码(arch/arm/cpu/armv7 /start.S)如下:

_start: b reset

reset:

bl save_boot_params

接下来,可以在C代码中设置断点,进行调试了。有两点值得注意:

i. 如果编译的时候,交叉编译器的性能优化选项是开着的,那么优化后编译生成的代码,其执行循序和C源码有差别,这时设置断点时,其实际的位置不会很准。所以,这里可以根据需要,决定是否关闭-O2选项。

ii. 在中,把core停下来时,会根据image中调试信息所包含的源码路径,找到对应的源码和symbol。由于U-Boot/SPL是在 Linux中编译,所以其路径都是Linux下的路径,所以Linux版本的可以直接找到对应的源码,而对于Windows版本的CCS不能直接找到,需要通过手动找到源码,但是找到一个文件的源码后,CCS会根据相对路径找到其他文件。除了这点外,Linux和Windows的CCS配置使用是一样的。

3.4 U-Boot的调试

总体来说, U-Boot的调试过程和SPL调试过程是类似的,这里主要说明不同的几点:

A. 从的启动过程可知,U-Boot是运行在DDR中的,而DDR是由SPL来初始化的,所以,加载U-Boot前,先加载并运行SPL。

B. 加载U-Boot 的image是 U-Boot。 这里U-Boot 是ELF格式的, 其包含了加载地址, symbol等信息,所以使用CCS 菜单 Run-》 Load-》 LoadProgram, 加载U-Boot 即可。加载成功后, 如下图所示:

U-Boot

如图所示, PC直接指到0x80100000地址了,也就是U-Boot的起始地址(入口)了,该地址是CCS从头ELF头里面得到的,其定义在CONFIG_SYS_TEXT_BASE(include/configs/am335x_evm.h)中。

C. 相对 SPL 的调试, U-Boot有个地方不同,即有代码的重载(code relocation), 重载后代码的在SOC上的memory map和编译出的memory map会有个偏移。这个过程是在函数relocate_code()中完成的。 relocate_code()函数是在board_init_f()中调用的,如果需要调试从调用该函数开始后面的代码,则加上偏移重载symbol。

在CCS的菜单, Run-》 Load -》 Add Symbols, 加载的image还是前面的U-Boot, data/code offset 都是0x9FF88000。 这里的offset是从gd-》relocaddr(arch/arm arch/arm/lib/board.c)得到的。设置界面如下:

ADD

注意到上述几点,然后就可以按照SPL的调试过程对U-Boot进行调试了。

4. 总结

关于用CCS+emulator对的U-Boot/SPL的调试就介绍完了。这里介绍的方法,包含了CCS+emulator调试的基本原则,不仅仅可以运用于U-Boot/SPL调试,也可以运用于Starterware,Kernel等调试。


上一页 1 2 3 下一页

关键词: AM335x spl u-boot CCS

评论


相关推荐

技术专区

关闭