微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 基于AM335x的U-Boot/SPL 的CCS 调试

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

时间:07-21 来源:互联网 点击:

有多个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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top