让调试U-Boot不再困难

本文介绍U-Boot的两种调试方法,一种是基于代码级别,另外一种是基于工具进行在线调试。

01

DEBUG宏

U-Boot自带DEBUG宏,打开该宏定义之后,会增加许多的内在打印信息供开发人员参考。这个宏定义的开关可以通过在include/common.h中增加宏定义来实现。

U-Boot之代码调试_嵌入式

DEBUG宏实际上控制的是下面的语句:

U-Boot之代码调试_嵌入式_02

没有DEBUG宏定义,U-Boot的启动信息如下:

U-Boot之代码调试_html_03

打开DEBUG宏定义,U-Boot的启动信息如下:

U-Boot之代码调试_嵌入式_04

可以看到增加了很多打印,包括内置的调用函数链信息等。

02

JTAG工具在线调试

JTAG工具可以选择小巧易用的JLINK,通过工具自带软件包中的JLINK Commander工具实现在线调试的目的。

U-Boot之代码调试_linux_05

一个完整的调试步骤可以参考下面的提示进行:

1、connect

U-Boot之代码调试_内核_06

U-Boot之代码调试_内核_07

2、halt CPU

U-Boot之代码调试_内核_08

3、Set PC

U-Boot之代码调试_debug_09

4、Set Breakpoint、run,查看是否停在断点处

U-Boot之代码调试_html_10

5、单步执行

U-Boot之代码调试_debug_11

6、读写寄存器

U-Boot之代码调试_嵌入式_12

对于U-Boot的调试,大前提是一定要熟悉U-Boot代码。关于U-Boot代码的组成结构,主要由汇编初始化程序(初始化cpu和代码重定向)、C代码驱动初始化、命令行部分、内核镜像的加载部分的应用代码。每一部分的调试方法不尽相同,文中所述主要是针对U-Boot完全没有启动起来或者仅仅启动一部分的时候。