调试
1. 概述¶
调试一般有两种方式,JTAG调试和UART调试。
-
JTAG调试通过工具可以直接对节点进行仿真调试。
-
UART调试通过添加打印分析打印来调试。
2. Jtag调试¶
2.1. 前期准备¶
-
平台
目前只支持WINDOWS环境,需安装WIN7及以上的系统。
-
硬件
-
SEGGER J-Link Debugger
-
USB转UART 数据线
-
-
软件
-
The SEGGER J-Link配套安装软件
-
串口调试工具,如Tera Term等
-
Eclipse及以下组件
-
Eclipse IDE for C/C++ Developers
-
Java Runtime Environment(JRE)
-
GNU ARM Eclipse plug-ins
-
-
2.2. 软件安装说明¶
The SEGGER J-Link配套安装软件、Eclipse、JRE、Tera Term可通过官网下载自行安装完成。
2.2.1. GNU ARM Eclipse plug-ins¶
通过以下途径可以获取此插件集:
-
通过https://gnu-mcu-eclipse.github.io/ 获取最新版本
-
通过Eclipse Marketplace查找并安装
-
打开eclipse,菜单中选择"Help → Eclipse Marketplace..."
-
"Find" 中输入 "gnu mcu eclipse" 或 "gnu arm eclipse",查找和安装

图 2‑1 Eclipse Marketplace
-
-
SDK安装包 Tools\Debug\ilg.gnuarmeclipse.repository-3.2.1-201701141320.zip
-
打开eclipse,菜单中选择"Help → Install New Software..."
-
单击"Add...",弹出窗口"Add Repository"
-
单击"Archive...", 弹出目录,选择插件位置,点击"Add"

图 2‑2 选择插件集文件位置
-
选择所有可选插件

图 2‑3 选择所有GNU ARM Eclipse插件
-
单击"Next >",列出所有即将安装的插件集

图 2‑4 选择安装的GNU ARM Eclipse插件
-
单击"Next >",同意license

图 2‑5 同意安装软件协议
-
单击"Finish",开始安装。安装结束后会弹出窗口,提示重启Eclipse。

图 2‑6 安装软件后重启
-
重启Eclipse。进菜单选择 "Help → Install New Software...",在弹出窗口中单击 "already installed"查看插件集是否完整正确安装。

图 2‑7 安装新软件

图 2‑8 查看已安装软件
-
2.2.2. Eclipse Debug环境配置¶
-
单击菜单" Run → Debug Configuration...",在弹出窗口左侧选择"GDB SEGGER J-Link Debugging",双击打开一个新的配置页。

图 2‑9 新建Debug配置页
Debug配置页右侧
-
"C/C++ Application" 下 "Browse..." 选择所需要调试SDK目录下的文件"proj\build\316d_32_128_msw\out\316d_32_128_msw.axf"
-
选择 "Disable auto build"
-
-
其他页面配置请参照以下各图

图 2‑10 Debugger配置页1

图 2‑11 Debugger配置页2

图 2‑12 Startup配置页1

图 2‑13 Startup配置页2
-
单击 "Apply","Close" 退出当前设置,选择菜单 "Window → Preferences",弹出窗口左侧选择 "Run / Debug → Launching",更新配置如图

图 2‑14 窗口配置页
-
窗口左侧选择 "Run/Debug → String Substitution",更新配置如图

图 2‑15 字符串配置页
-
窗口左侧选择 "C/C++ → Debug → GDB",更新配置如图

图 2‑16 GDB配置页
2.3. 调试¶
-
确保JTAG Debugger工具和USB转UART数据线已正确连接电脑和CarDV。
-
打开tera term,配置正确的端口,并激活为当前应用窗口。
-
按电脑任意键,通电开机,系统会停留在Boot部分。

图 2‑17 系统启动
-
打开Eclipse,单击菜单 "Run→ Debug Configuration...",选择刚新建的配置,在弹出窗口右侧选择 "Debug",开始Loading。

图 2‑18 JTAG Downloading
-
停在设置的断点

图 2‑19 停在设置断点
-
Eclipse Debug主要tab介绍
-
"Variables" tab会列出当前函数所有变量,可实时查看各变量的值

图 2‑20 查看当前函数变量
-
"Expressions" tab会列出通过"Watch"添加的变量
-
"Memory" tab左侧可以添加查看的地址,右侧会显示对应的值
在"Variable","Expressions"等tab某个变量上右键,弹出快捷菜单,选择"View Memory",可以直接查看该变量的内存地址和对应的值

图 2‑21 查看变量内存

图 2‑22 变量内存
我们可以保存当前查看的一段内存,比如100个字(WORD)

图 2‑23 保存一段内存
注意,在读写中0x20000000~0x28000000 属于CACHE,0x90000000~0x98000000 属于NON CACHE。
-
"Breakpoints" tab会列出所有断点。
当判断条件为真时,Eclipse会停在断点位置。在tab最右边,单击"View Menu",弹出菜单,可新增各类型断点。

图 2‑24 断点设置
比如单击 "Add Function Breakpoint(C/C++)...",在弹出窗口 "Function name" 中填 "VideoFunc_Record"

图 2‑25 新增函数断点
然后单击 "Apply and Close",在"Breakpoints" tab会看到新增项

图 2‑26 查看已设置断点
当CarDV开始录像时,程序会停在VideoFunc_Record()

图 2‑27 断点位置
3. Uart调试¶
3.1. 立即打印¶
当串口信息需要立即打印出来的时候,请在对应位置前添加以下两行:
Send_msg_buffer_mode_en(0);
Send_msg_buffer_mode_flush();
3.2. 调试文档及常用命令¶
3.2.1. 调试文档¶
-
Isw_cli_main.c
-
Wlan_cli.c
3.2.2. 常用命令¶
-
Dump (dumpdip / dumpraw / dump_adas ...)
-
Memory (memdump / memusage ...)
-
Register (regset / regget / reggetbank ...)
-
Net (net / wifi ...)
-
Sensor (checkfps ...)
-
IO (io gpio / gpiodrv ...)
3.2.3. 常用打印函数¶
-
Printc
-
UartSendTrace
-
RTNA_DBG_Str
3.3. SD卡保存日志¶
在config_fw.h中确认以下宏有设置为1,否则需要更新LIB。
DEBUG_UART_TO_FILE
DEBUG_UART_TO_SD
3.4. 异常日志¶
3.4.1. 系统中止(ARM exception)¶
系统中止一般分为以下几种情况:
#define EXCEPTION_DATA_ABORT 0x00000001 #define EXCEPTION_PREFETCH_ABORT 0x00000002 #define EXCEPTION_UNDEF_ABORT 0x00000003
当系统中止发生时,LOG会打印一系列信息帮助我们追踪异常。下图为截取的一段系统异常日志:

图 3‑1 系统中止异常信息
-
日志前两行打印的是中止类型,"type: 0x00000001!" 意味着系统中止是"数据中止(Data Abort)"
-
中间打印的是寄存器部分
-
"abort_adress: 0x202ec844"指出了中止地址,通过查询proj\build\316d_32_128_msw\out\316d_32_128_msw.map,一般可以定位问题发生在某个具体的函数内部。

图 3‑2 系统中止异常信息2
(注:MAP文件需要和测试固件是同一次编译完成,图3-2仅做示例,和图3-1并不匹配)
-
"CurrentTask: 0x0000001f" 指出了系统异常中止时当前运行的TASK ID。
-
-
日志最后完整打印了系统各TASK信息。可以通过task id定位到异常中止时运行的Task。