一些SEGGER RTT、MDK Event Recorder等记录/跟踪软件的思考

2019-12-13 18:23发布

本帖最后由 XIVN1987 于 2019-2-27 14:39 编辑

论坛里很多大神分享了SEGGER RTT、SEGGER J-Scope、SEGGER System View、MDK Event Recorder、MDK System Analyzer等记录、跟踪软件的使用方法,,受益匪浅,,

但这么多功能类似的软件,它们有什么区别和联系呢??我自己做了一些比较和思考,,分享在这里和坛友一起探讨,,欢迎指正

SEGGER RTT VS MDK Component Viewer,侵入式 VS 非侵入式
所谓侵入式,即需要编写额外代码,将想要跟踪的信息通过组件API写入跟踪Buffer。比如RTT,需要将SEGGER_RTT.c等文件加入自己的项目工程中,然后调用其中的SEGGER_RTT_Write()等函数将想要发送出去的信息写入upBuffer

所谓非侵入式,即不需要在单片机程序中加入额外代码,比如MDK Component Viewer,它只需要你编写*.SCVD文件,告诉上位机你想显示单片机内存哪个地址的变量、这个变量是什么类型的,上位机就通过调试器读取该地址的指定长度,然后依照*.SCVD的描述显示该变量

非侵入式的优点显而易见,即不需要更改产品代码,但也有如下缺点:
1、不能完整跟踪变量的变化过程,只能快照式抓取部分状态,所以只适合跟踪缓慢变化的变量;而侵入式可以通过API将变量的所有变化过程存入Buffer,记录完整状态变化
2、只能跟踪有固定地址的变量,即全局变量和静态变量
3、需要某种手段告诉上位机你想要跟踪的变量在RAM中的位置、以及它的大小,比如MDK Component Viewer中的*.SCVD文件

我之前分享的SVDView和HFView也都属于非侵入式的调试手段,它们都不要求修改单片机代码,SVDView的跟踪变量描述信息来自器件的SVD文件,HFView的跟踪变量描述信息来自单片机的栈寄存器SP和反汇编文件中解析出的函数调用关系

MDK Component Viewer要求编写SCVD文件描述想要跟踪变量的地址和类型、以及希望的显示格式,通过SCVD文件可以非常精确的描述跟踪需求。但其实程序中全局/静态变量的地址、大小等信息在编译生成的.map文件中已经有描述,所以如果不要求非常精确的跟踪的话,可以从.map文件中解析变量信息、而非手写SCVD文件,我编写的VarView即用此方法实现的

MDK Event Recorder VS SEGGER RTT,结构化信息 VS 非结构化信息
SEGGER RTT通过SEGGER_RTT_Write()等函数写入upBuffer的就是直接的跟踪数据字节流,数据中并没有记录数据的结构信息,一般只能当作类似printf()打印出的字符来显示。

而MDK Event Recorder通过EventRecord2()等函数写入Buffer的不仅有跟踪数据,还有该数据的时间戳、组件ID、消息ID、数据长度、校验位等信息,因此上位机可以结构化甚至图形化的显示这些跟踪信息,结构化的Event Recorder可以完成很多RTT无法完成效果:
1、记录了跟踪数据的格式信息,从而上位机可以自动确定数据的显示格式
2、提供了8位消息ID、8位组件ID、消息等级,方便消息筛选;RTT只提供了通道
3、EventRecord_t中记录了时间戳(基于DWT Cycle Counter),方便分析事件发生的时间
4、Event Filter使得无需修改目标板程序即可设定记录哪些跟踪信息

SEGGER公司的System View类似于Event Recorder,它底层基于RTT完成信息的传递,但提供了SEGGER_SYSVIEW_RecordU32()等记录API,给要输出的跟踪信息添加事件ID、时间戳等信息




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
ch2003_23
1楼-- · 2019-12-13 23:09
还没用过类似的,谢谢
sup888
2楼-- · 2019-12-14 04:29
“Event Recorder ”是不是只能处于仿真状态才可以看到数据?
security
3楼-- · 2019-12-14 10:10
关注一下。
只用过 RTT。
XIVN1987
4楼-- · 2019-12-14 10:50
sup888 发表于 2019-2-27 17:09
“Event Recorder ”是不是只能处于仿真状态才可以看到数据?


理论上不是,,

但因为只有Keil进入调试状态时,,才能从它的菜单下调出 Event Recorder 窗口,,所以要用Keil中的Event Recorder窗口的话必须进入调试状态

但理论上我们可以自己写一个Event Recorder上位机,,这样就不用进入调试状态了,,因为Event Recorder只是需要通过调试器从芯片RAM中读取数据,,并不需要芯片进入调试状态
sup888
5楼-- · 2019-12-14 11:08
 精彩回答 2  元偷偷看……
canspider
6楼-- · 2019-12-14 16:57
调试是个复杂的事情,做得最好的就是Visual Studio
VS的做法是在debug版本代码中,在合适的地方插入额外代码,追踪运行过程
这样外面看起来就是非入侵式的,这个需要编译器支持

同理,关于结构化的信息,在调用记录函数的时候,通过编译器生成额外的类型签名信息,再通过分析elf文件还原数据类型

综上,要构建一个很好用的调试环境,得在编译器上做文章

一周热门 更多>