调试


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查找并安装

    1. 打开eclipse,菜单中选择"Help → Eclipse Marketplace..."

    2. "Find" 中输入 "gnu mcu eclipse" 或 "gnu arm eclipse",查找和安装

      图 2‑1 Eclipse Marketplace

  • SDK安装包 Tools\Debug\ilg.gnuarmeclipse.repository-3.2.1-201701141320.zip

    1. 打开eclipse,菜单中选择"Help → Install New Software..."

    2. 单击"Add...",弹出窗口"Add Repository"

    3. 单击"Archive...", 弹出目录,选择插件位置,点击"Add"

      图 2‑2 选择插件集文件位置

    4. 选择所有可选插件

      图 2‑3 选择所有GNU ARM Eclipse插件

    5. 单击"Next >",列出所有即将安装的插件集

      图 2‑4 选择安装的GNU ARM Eclipse插件

    6. 单击"Next >",同意license

      图 2‑5 同意安装软件协议

    7. 单击"Finish",开始安装。安装结束后会弹出窗口,提示重启Eclipse。

      图 2‑6 安装软件后重启

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

      图 2‑7 安装新软件

      图 2‑8 查看已安装软件

2.2.2. Eclipse Debug环境配置

  1. 单击菜单" 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. 其他页面配置请参照以下各图

    图 2‑10 Debugger配置页1

    图 2‑11 Debugger配置页2

    图 2‑12 Startup配置页1

    图 2‑13 Startup配置页2

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

    图 2‑14 窗口配置页

  4. 窗口左侧选择 "Run/Debug → String Substitution",更新配置如图

    图 2‑15 字符串配置页

  5. 窗口左侧选择 "C/C++ → Debug → GDB",更新配置如图

    图 2‑16 GDB配置页

2.3. 调试

  1. 确保JTAG Debugger工具和USB转UART数据线已正确连接电脑和CarDV。

  2. 打开tera term,配置正确的端口,并激活为当前应用窗口。

  3. 按电脑任意键,通电开机,系统会停留在Boot部分。

    图 2‑17 系统启动

  4. 打开Eclipse,单击菜单 "Run→ Debug Configuration...",选择刚新建的配置,在弹出窗口右侧选择 "Debug",开始Loading。

    图 2‑18 JTAG Downloading

  5. 停在设置的断点

    图 2‑19 停在设置断点

  6. Eclipse Debug主要tab介绍

  7. "Variables" tab会列出当前函数所有变量,可实时查看各变量的值

    图 2‑20 查看当前函数变量

  8. "Expressions" tab会列出通过"Watch"添加的变量

  9. "Memory" tab左侧可以添加查看的地址,右侧会显示对应的值

    在"Variable","Expressions"等tab某个变量上右键,弹出快捷菜单,选择"View Memory",可以直接查看该变量的内存地址和对应的值

    图 2‑21 查看变量内存

    图 2‑22 变量内存

    我们可以保存当前查看的一段内存,比如100个字(WORD)

    图 2‑23 保存一段内存

    注意,在读写中0x20000000~0x28000000 属于CACHE,0x90000000~0x98000000 属于NON CACHE。

  10. "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。