本帖最后由 XIVN1987 于 2019-2-27 14:41 编辑
论坛里很多大神分享了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、时间戳等信息
|