基于AM335x的U-Boot/SPL 的CCS 调试
有多个core的配置选项,由于U-Boot/SPL,Linux 运行在ARM coretex-A8 core上,这里只关注ARM core。
B. 在Debug窗口中,右键点击CortxA8 core, 选择Connect Target. 连接成功后,如下图所示:
此时,已经成功连上AM335x的Cortex-A8 core了。
3.2.3 Debug配置
这里的debug配置,是对emulator连上core后行为的设置。 可以通过鼠标右键点击properties,得到以下界面:
在该页配置中,在调试过程需要调整的就是Auto RunOptions,可以根据需要设置,当加载了image后,core自动运行到指定的symbol,并且被JTAG接口所停住
调试U-Boot/SPL的方式有两种,主要涉及如何加载image:一种是把image通过JTAG下载到片上RAM或者DDR中,然后导入 symbol,重置 PC指针到image的入口处,进行调试;另一种,把image烧到SD卡或者其他启动存储器上,启动板子,通过JTAG停住core的PC指针,导入 symbol,重置 PC指针到image的入口处,进行调试。
下面会在具体步骤中说明这两种方式如何操作:
A. 下载SPL image到AM335x中。
如果AM335x是从SD卡方式启动,此时 SPL image已经被ROM code成功读到片上 RAM中,就不需要加载 SPLimage了。
如果选择SPL image通过CCS下载,鼠标左键选择CortxA8core , 然后在CCS菜单中, Tools -》 Load Memory, 选择编译好的SPL image U-Boot-spl.bin,如下图所示:
选择加载的地址。由于加载的U-Boot-spl.bin是RAW data,所以需要指定loadaddress,这个地址就是SPL的入口地址
对于AM335x,SPL的入口地址是0x402F0400,对应的宏定义为CONFIG_SPL_TEXT_BASE, 该宏定义在include/configs/am335x_evm.h中。通过编译出的map文件U-Boot-spl.map也可以查到,是 __startsymbol对应的地址。
设定加载image内型。 由于所有的代码都是运行在ARM(32bit)模式下。所以Type-size也要设成32bit。设置界面如下:
最后点击Finish,SPL就会被load到片上RAM中了。如果在console窗口中有错误信息,需要把SPL image重新加载 一遍。
B. 加载 symbol。
在上一步里,只是加载了RAW image,还没有加载调试所需要的带有调试信息的symbol。
可以通过Run -》 Load -》 LoadSymbols 加载symbol信息,界面如下:
这里选择的是带有symbol信息的U-Boot-spl.
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即可。
b. 点击Debug窗口(view-》debug)上tool bar中的汇编单步按钮,如下图所示,就开始调试了。
这时,在反汇编窗口(view-》disassembly)中,如下图所示,看到的是汇编代码,而且在编辑窗口这边看不到源码。这是由于开始执行的代码在/arch/arm/cpu/armv7/start.s 中,反汇编和汇编一样,所以没有显示源码。
同时,可以看到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. 在CCS中,把core停下来时,CCS会根据image中调试信息所包含的源码路径,找到对应的源码和symbol。由于U-Boot/SPL是在 Linux中编译,所以其路径都是Linux下的路径,所以Linux版本的CCS可以直接找到对应的源码,而对于Windows版本的CCS不能直接找到,需要通过手动找到源码,但是找到一个文件的源码后,CCS会根据相对路径找到其他文件。除了这点外,Linux和Windows的CCS配置使用是一样的。
3.4 U-Boot的调试
总体来说, U-Boo
- 基于TI AM335x的智能家居安防系统网关解决方案(10-06)
- 这款防水无人机为何这么贵,技术难点在哪?(04-10)
- 基于赛灵思(Xilinx) FPGA的DisplayPort设计与实现(10-23)
- 视频接口HDMI需要担心DisplayPort或MHL阵营吗?(05-27)
- 基于DisplayPort的解决方案实现多屏显示(05-21)
- OPPO R9s Plus上手评测:性价比超高!(11-13)