0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Event Recorder的使用

汽车电子技术 来源:嵌入式之入坑笔记 作者: 嵌入式之入坑笔记 2023-02-10 14:09 次阅读

单片机的软件开发中,经常会遇到各种各样的问题,很多时候为了定位到出现bug的地方,我们可能会借助很多的手段或者工具。比如串口打印、MDK在线仿真上位机调试工具等等的。但是,有时候想要用串口打印输出某些结果,而硬件设计又没有预留串口,这种时候就感觉很不方便。我个人使用串口调试的频率还是蛮多的,主要是简单易操作,可以在想要观察运行结果的代码位置随便加调试输出,很方便定位问题。在硬件上没有多余的串口预留的话,如果有外接仿真引脚出来的话,在MDK环境下就可以使用ST-LINK、J-LINK等的各种LINK进行调试,实现printf输出的功能,简直是不要太棒了!在MDK的开发IDE环境下,支持仿真调试的组件有好几个,我这里使用的是Event Recorder。这个组件功能是在MDK5.22的版本是哪个开始增加的,所以想要使用这个组件功能,需要将自己的MDK开发工具升级到5.22以上,建议是当前最新的版本!

1、添加 Event Recorder 组件

1)打开你需要添加调试组件的项目工程,点击如下图所示的图标:

pYYBAGPl3oOAdGhCAABKe-ugfoU937.png

2)选择 “Compiler”,并按照如下勾选,勾选之后点击“ok”即可。如下图:

pYYBAGPl3pCAe2rzAACStiKdwfI693.png

勾选之后可以看到工程目录上出现一个“Compiler”的选项,说明组件添加成功了,如下图:

pYYBAGPl3ueAXCjkAAB1gI1u5LI697.png

3)检查组件的工程配置,如下:

pYYBAGPl3vKAW0OSAAFPC0GOVD4584.png

说明如下:

Number of Records:表示 Event Recorder 缓冲可以记录的消息条数。Time Stamp Source:表示时间戳的来源其中,Time Stamp Source 有如下四种可以选择,一般使用 DWT 时钟周期计数器。如下图:

poYBAGPl3v2AGp3GAAAS3zyYi8I176.png

至此,Event Record组件就已经添加完成了。

2、printf 重定向

在Event Recorder 实现printf输出需要使用MDK的 Debug 功能,输出的效果就跟串口调试工具上的显示效果是一样的。Event Recorder 中的重定向代码如下:

int fputc (int c, FILE * stream) {
#if (!defined(RTE_Compiler_IO_STDOUT) && !defined(RTE_Compiler_IO_STDERR))
  (void)c;
  (void)stream;
#endif
 
#ifdef RTE_Compiler_IO_STDOUT
  if (stream == &__stdout) {
#if (STDOUT_CR_LF != 0)
    if (c == 'n') stdout_putchar('r');
#endif
    return (stdout_putchar(c));
  }
#endif
 
#ifdef RTE_Compiler_IO_STDERR
  if (stream == &__stderr) {
#if (STDERR_CR_LF != 0)
    if (c == 'n') stderr_putchar('r');
#endif
    return (stderr_putchar(c));
  }
#endif
 
  return (-1);
}

注意:使用 Event Recorder 实现printf重定向时,一定要取消掉自己的项目中原本的重定向!

1)进入仿真调试模式,如下:

pYYBAGPl3wuALctGAAAxhoV4-D0964.png

2)选中 Debug(printf)Viewer 调试组件,如下图:

poYBAGPl3xeAa7f9AAMXkalcjzg602.png

3)选择仿真时周期更新,如下图:

pYYBAGPl3ySAKl9XAAMsqzVAvhA382.png

4)添加初始化代码,如下:

/* 初始化 EventRecorder 并开启 */
   EventRecorderInitialize(EventRecordAll, 1U);
    EventRecorderStart();

5)全速运行即可以看到结果。

poYBAGPl3zCAcgiIAABoQ7jU4M0498.png

示例:

测试代码如下:

poYBAGPl3zqAQ9sXAAE-ZmJKzRU919.png

仿真结果如下:

poYBAGPl30aAKOp7AADfB0rjQW4368.png

鼠标右键还可以对 Debug(printf)Viewer 进行设置,如下图:

pYYBAGPl31SAbpRNAAFpwzo6K-U868.png

3、简单方便的时间测量功能

Event Recorder 也可以测量代码运行的时间,时间测量功能简单易用,仅需一个起始函数,一个停止函数即可。

3.1、时间测量起始函数

EventStartG (slot)
或者
EventStopGv (slot, val1, val2)

函数说明:

1)函数中的字母 G 是表示分组 A,B,C,D,即实际调用函数为 EventStartA,EventStartB,EventStartC 和 EventStartD。2)函数的第一个形参 slot 的范围是 0-15,也就是最大可以测量 16 路。3)函数后面的两个形象 val1 和 val2 是 32 Bit变量,用户可以用这两个形参来传递变量数值给 Event Statistics 调试组件里面,用于图形化展示。

3.2、时间测量结束函数

EventStopG (slot)
或者
EventStopGv (slot, val1, val2)

函数说明:

1)函数中的字母G是表示分组A,B,C,D,即实际调用函数为EventStopA,EventStopB,EventStopC 和 EventStopD。2)函数的第一个形参 slot 的范围是 0-15,也就是最大可以测量 16 路。3)函数后面的两个形象 val1 和 val2 是 32 位变量,用户可以用这两个形参来传递变量数值给 Event Statistics 调试组件里面,用于图形化展示。

3.3、使用示例

1)添加初始化代码

/* 初始化 EventRecorder 并开启 */
EventRecorderInitialize(EventRecordAll, 1U);
EventRecorderStart();

2)在代码前后加上起始和结束时间的测量API函数,如下所示:

poYBAGPl32WAU9bLAAFVbwk3L8g506.png

3)选择 Event Statistics 调试组件,如下:

pYYBAGPl33OAUz0FAAYRAqFym9E226.png

4)全速运行,查看结果,如下:

pYYBAGPl33-AJECJAAFhG1Z328I392.png

从图中可以看出,开始测量的位置是在 149 行处,结束测量的位置是在152 行处,下方的红色方框处标出了测量的最大时间和最小时间。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6030

    文章

    44486

    浏览量

    631847
  • 软件开发
    +关注

    关注

    0

    文章

    597

    浏览量

    27314
  • 上位机
    +关注

    关注

    27

    文章

    930

    浏览量

    54688
收藏 人收藏

    评论

    相关推荐

    【原创专题教程第7期】终极调试组件Event Recorder,各种Link通吃,支持时间和功耗测量,printf打印,RTX5及中间件调试

    Recorder实现的串口打印,无需占用系统额外的硬件资源,而且速度超快,是替代串口调试的绝佳方式。5、Event Recorder的API可以在中断和多任务环境中正常调用。最重要的是速度快。6、对于
    发表于 06-19 18:54

    灵动微课堂 (第164讲) | MM32F013x——Event Recorder使用方法

    Recorder则没有以上的限制,Event Recorder是MDK在5.22版本加入的新功能,使用标准SWD的下载接口,基本上适用于各种Link,只要MDK v5.22以上的版本即可,支持时间测量、功耗测量
    发表于 04-23 11:21

    STM32F407的终极调试组件Event Recorder

    第8章 STM32F407的终极调试组件Event Recorder本章节为大家介绍终极调试方案Event Recoder,之所以叫终极解决方案,是因为所有Link通吃,支持时间测量,功耗测量
    发表于 08-03 08:22

    移植Event Recorder调试工具

    、Output3.3、C/C++(AC6)3.4、Debug3.5、模板代码(main.c)3.6、开始移植RTX53.6、隔离Device上的文件四、代码4.1、main.h4.2、main.c五、DEBUG5.1、RTX RTOS六、细节补充6.1、移植Event Recor
    发表于 08-24 06:07

    Event Recorder是什么?Event Recorder的特色有哪些

    Event Recorder是什么?Event Recorder的特色有哪些?JTAG接口和SWD接口区别在哪?
    发表于 10-09 06:01

    请问一下Event Recorder的特色是什么?

    JTAG接口和SWD接口区别是什么? Event Recorder的特色是什么?
    发表于 10-11 07:00

    STM32H7的终极调试组件Event Recorder是什么

    STM32H7的终极调试组件Event Recorder是什么
    发表于 10-13 07:32

    怎样使用keil的Event Recorder中间件进行打印呢

    怎样使用keil的Event Recorder中间件进行打印呢?有何缺点?怎样使用jlink-RTT Viewer组件进行打印?有何缺点?
    发表于 01-19 06:44

    Event Recorder的特色主要有几点

    1、最好使用比较新的cmsis库,否则添加event recorder将无法编译通过2、rte设置如下:3、sct文件开辟一个NOINIT的sram区域,不开辟好像也可以,官网教程是开辟的。4
    发表于 01-19 06:27

    浅析基于GD32F427适配RTX4+调试组件Event Recorder

    :使用板载的GD_Link就能方便调试而不需要串口1.打开Manage Run_Time Enviornment -> Compiler 选项中Event Recorder
    发表于 12-21 09:39

    【STM32F429开发板用户手册】第8章 STM32F429的终极调试组件Event Recorder

    【STM32F429开发板用户手册】第8章 STM32F429的终极调试组件Event Recorder
    发表于 12-04 14:06 17次下载
    【STM32F429开发板用户手册】第8章 STM32F429的终极调试组件<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>

    【STM32F407开发板用户手册】第8章 STM32F407的终极调试组件Event Recorder

    【STM32F407开发板用户手册】第8章 STM32F407的终极调试组件Event Recorder
    发表于 12-04 14:21 18次下载
    【STM32F407开发板用户手册】第8章 STM32F407的终极调试组件<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>

    【STM32H7教程】第8章 STM32H7的终极调试组件Event Recorder

    【STM32H7教程】第8章 STM32H7的终极调试组件Event Recorder
    发表于 12-05 20:06 7次下载
    【STM32H7教程】第8章 STM32H7的终极调试组件<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>

    MM32F013x——Event Recorder使用方法

    在前面几个专题中介绍了Ozone、RTT-Viewer、J-Scope在MM32F013x上的使用方法,虽然以上的几种方式简单方便,但是也仅仅局限于J-Link工具...
    发表于 01-25 18:22 2次下载
    MM32F013x——<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>使用方法

    MM32F013x——Event Recorder使用方法

    在前面几个专题中介绍了Ozone、RTT-Viewer、J-Scope在MM32F013x上的使用方法,虽然以上的几种方式简单方便,但是也仅仅局限于J-Link工具。
    发表于 02-08 16:19 1次下载
    MM32F013x——<b class='flag-5'>Event</b> <b class='flag-5'>Recorder</b>使用方法