Chapter9 调试方法
1. Debug Tools
SEGGER RTT
调试备忘录-J-Link RTT的使用(原理 + 教程 + 应用 + 代码)
RTT(Real Time Transfer)是一种用于嵌入式中与用户进行交互的I/O技术,它结合了SWO和半主机的优点,具有极高的性能。
使用RTT可以从MCU非常快速输出调试信息和数据,且不影响MCU实时性。这个功能可以用于很多支持J-Link的设备和MCU,兼容性强。
- 下载SEGGER JLink并且安装
- Github-SEGGERMicro/RTT获取源码,获得SEGGER_RTT.c、SEGGER_RTT.h、SEGGER_RTT_printf.c、SEGGER_RTT_Conf.h
- 将上面四份代码文件添加到代码工程目录中。
- 文件添加入工程后,在想要用到RTT的文件中包含#include "SEGGER_RTT.h",然后直接调用SEGGER_RTT_printf()即可
- 打开J-Link RTT Viewer 选择好你的芯片型号后,点击确认,开始查看打印
//封装为log形式
#if LOG_ENABLE
#define log(term, ...) (SEGGER_RTT_SetTerminal(term), SEGGER_RTT_printf(0,__VA_ARGS__))
#else
#define log(term, ...)
#endif
SEGGER JScope
J-Scope、可以在目标MCU运行时,实时分析数据并图形化显示的软件。
它不需要SWO或目标上的任何额外引脚等功能,使用可用的标准调试端口JTAG\SWD。
J-Scope能够以类似示波器的方式显示多个变量的值。通过读取elf\obj\out\axf文件,允许选择多个变量进行可视化。
-
HSS模式
HSS模式是通过采样周期定时从内存文件中读取变量的值,所以采样周期和可执行文件是必须的。
为了更加准确有效的采集到对的数据,最好用volatile声明变量。
优点:随时可连接MCU,不影响MCU正常运行,因为不需添加任何代码,所以也不会占用MCU紧张的资源。
缺点:速度慢,采样速率基本固定在1khz左右,因此仅仅适合采样变量变化速率低于1khz的情况, 因为数据是根据采样率来的,所以实时性不是太准,不够低速率下影响不大。
如图,再选中工程中的.elf/.obj/.out/.axf等可执行文件,即可开始调试,IAR对应.out,MDK对应.axf
-
RTT模式
RTT模式下,所有的数据和时间戳均是有MCU来提供。
优点:比HSS更高的数据吞吐量,最高可达2MB/S,不过这个是由MCU上使用的缓冲区大小决定, 即使只有512字节的小缓冲区也可以达到1MB/S,够用了;J-Scope数据采集与MCU的应用程序执行同步, 因为应用程序决定何时以及如何采样数据;不需要知道变量位置, RTT缓冲区的位置由J-Scope自动检测;时间戳等数据可以被添加到数据样本中。
缺点:稍微比较麻烦,需要移植RTT代码,占用mcu资源,大概需要1.4kb左右的flash,1KB左右的RAM。
LKS Scope
一款国产的上位机跟踪软件,和JScope一样的功能,但是可以修改变量,这点jscope不行。推荐使用
Amaocom
一款功能丰富的串口调试软件,相比于一般调试工具SSCOM等等。有如下功能
发送帧与接收帧计数,可以用于测试通信设备的通信丢包率。
指定关键字高亮与过滤,可以用于再快速通信下查找数据包。
2. Debug Components
CmBacktrace
CmBacktrace (Cortex Microcontroller Backtrace)是一款针对 ARM Cortex-M 系列 MCU 的错误代码自动追踪、定位,错误原因自动分析的开源库。易用于分析系统性崩溃错误。
CmBacktrace 输出的信息包括函数调用栈、故障诊断结果、堆栈、故障寄存器及产品固件信息,极大的提升了错误定位的效率及准确性。
关于故障寄存器信息,可以参考CortexM的寄存器组,重点关注SP、LR、PC寄存器
嵌入式必知 | 一张图看懂 Cortex‑M 寄存器组(附汇编实战)
Easylogger
一款超轻量级(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志库,非常适合对资源敏感的软件项目,在项目调试过程中,日志系统是非常重要的功能,可以在关键运行位置通过打印日志来判断运行过程。易用于分析软件功能性错误、系统崩溃性错误。