在单片机的软件开发中,经常会遇到各种各样的问题,很多时候为了定位到出现bug的地方,我们可能会借助很多的手段或者工具。比如串口打印、MDK在线仿真、上位机调试工具等等的。

但是,有时候想要用串口打印输出某些结果,而硬件设计又没有预留串口,这种时候就感觉很不方便。我个人使用串口调试的频率还是蛮多的,主要是简单易操作,可以在想要观察运行结果的代码位置随便加调试输出,很方便定位问题。

在硬件上没有多余的串口预留的话,如果有外接仿真引脚出来的话,在MDK环境下就可以使用ST-LINK、J-LINK等的各种LINK进行调试,实现printf输出的功能,简直是不要太棒了!

在MDK的开发IDE环境下,支持仿真调试的组件有好几个,我这里使用的是Event Recorder。这个组件功能是在MDK5.22的版本是哪个开始增加的,所以想要使用这个组件功能,需要将自己的MDK开发工具升级到5.22以上,建议是当前最新的版本!

1、添加 Event Recorder 组件

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

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

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

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

说明如下:

Number of Records:表示 Event Recorder 缓冲可以记录的消息条数。
Time Stamp Source:表示时间戳来源

其中,Time Stamp Source 有如下四种可以选择,一般使用 DWT 时钟周期计数器。如下图:

至此,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_STDOUTif (stream == &__stdout) {#if (STDOUT_CR_LF != 0)if (c == '\n') stdout_putchar('\r');
#endifreturn (stdout_putchar(c));}
#endif#ifdef RTE_Compiler_IO_STDERRif (stream == &__stderr) {#if (STDERR_CR_LF != 0)if (c == '\n') stderr_putchar('\r');
#endifreturn (stderr_putchar(c));}
#endifreturn (-1);
}

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

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

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

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

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

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

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

示例:
测试代码如下:

仿真结果如下:

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

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

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

3.1、时间测量起始函数

EventStartG (slot)
或者
EventStartGv (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函数,如下所示:

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

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

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

对嵌入式技术感兴趣欢迎关注微信公众号“嵌入式之入坑笔记”,一起学习讨论啊!

单片机调试 — Event Recorder 的使用相关推荐

  1. Keil MDK高级调试——Event Recorder

    前言 如今,灵活且易于使用的中间件组件在现代微控制器应用中至关重要. 这些软件组件通常是应用程序程序员的"黑匣子". 即使提供了全面的文档和源代码,对潜在问题的分析也具有挑战性.M ...

  2. eclipsevue代码怎么运行_打了多年的单片机调试断点到底应该怎么设置? | 颠覆认知...

    导读:程序运行过程中,有些数据被莫名修改了,在哪里修改的?又是怎么修改的?这个代码我只想知道是否运行过,或者运行了多少次,但是不想让程序停下来,或者仅打印调试信息,怎么办?当这个变量设置成某个数据后, ...

  3. Keil4中颖单片机调试不正常

    问题:中颖单片机调试不正常,不按顺序走,乱跳. 原因一: 在keil4中尝试新建工程,发现中颖单片机的库找不到了,可能是安装其他库的时候出错了. 卸载中颖库,双击,先卸载,再重新安装在C:\keil中 ...

  4. 没有串口,如何打印单片机调试信息?

    输出调试信息是嵌入式开发中必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的打印log到文件的方法基本不适用. 最常用的是通过串口输出uart log,例如51单 ...

  5. Linux-hexdump命令调试event驱动—详解(13)

    2018-01-03阅读 6300 hexdump: 查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试驱动用 描述: 我们以event1为例,当我们insmod挂载了键盘驱动后,出现一个 ...

  6. tm1650中文资料_TM1650+msp430单片机 调试及遇到问题的总结

    最近做了用到三个tm1650及msp430f149项目,其中还涉及到其他的一大堆东西,在这里就不一一说了,这里主要分享一下TM1650调试过程中遇到的问题和解决的办法.仅供大家参考. 首先,先描述一下 ...

  7. Linux-hexdump命令调试event驱动

    转自:https://blog.csdn.net/xiaodingqq/article/details/80807145 hexdump:查看文件的内容,比如二进制文件中包含的某些字符串,通常用来调试 ...

  8. 赛元触摸单片机调试记录

    大致过程,烧写官方的调试固件,然后使用对应上位机调试.根据硬件pcb获取对应的参数,获得一个头文件,添加到工程,然后就可以使用了,这个头文件里面的参数就是根据自己画的pcb得到的还是比较靠谱的. 主函 ...

  9. STM32F 系列单片机 调试记录

    1.RTC 配置 调一个 RTC,刚开始运行都正常,设置的时间跟读出的时间一样.但是换了一个芯片出现读出的年不对的情况,调试才发现是RTC设置的时候有些参数漏掉没填导致的. T_S32 DRIVER_ ...

  10. EFM8SB1芯科单片机调试 打开NoOverlay.hwconf文件报错

    使用EFM8SB1-SLSTK2010A 开发板,打开NoOverlay.hwconf文件进行相应配置时报错如下: The document loaded with errors.   Issues ...

最新文章

  1. 泰安服务器维护公司,神云 泰安服务器
  2. 新书上市 | 豆瓣评分8.4,美国数学学会推荐必读经典,重版再现!
  3. apache httpd服务器403 forbidden的问题
  4. 34. Leetcode 234. 回文链表 (链表-双指针)
  5. Android 开发工具类 27_多线程下载大文件
  6. OpenGL中的几何体实例化(OpenGL Geometry Instancing)
  7. java比赛题目_【蓝桥杯2016第七届比赛题目】JAVA A组
  8. opengl es java_java – 在Android OpenGL ES App中加载纹理
  9. pcl里面的法线估计
  10. 酒驾、超速、加塞、路怒、拒载?来吧,我们专治各种不服
  11. 给Xcode增加复制行、删除行快捷键的方法
  12. 位运算 进制转化 STL中bitset用法
  13. 【渝粤教育】国家开放大学2018年秋季 1131t卫生经济学 参考试题
  14. 【爬虫】网页抓包工具--Fiddler--Request和Response
  15. Oracle SQL基础
  16. Educational Codeforces Round 89 (Rated for Div. 2)
  17. 华为手机如何设置主页面_华为手机怎么进行桌面管理?正确管理华为手机桌面图标及屏幕的方法...
  18. 苏泊尔C21-SDHC19电磁炉维修
  19. 小组取什么名字好_有创意的小组名有哪些
  20. note:记各种资源

热门文章

  1. 官网USB读卡器移植(TF卡SDIO模式 + SPI-flash)
  2. KV杀毒软件创始人离世
  3. 相似对角化与二次型的标准化联系
  4. 在线apt-get安装mysql_apt-get安装mysql
  5. Scratch入门:软件界面介绍
  6. guided filter matlab,导向滤波(Guided Filter)的解析与实现
  7. 京东背调一星期,范围广到可怕。网友:这特么比入党还难?
  8. jquery提示sucess
  9. isSucess = result == sucess_signal
  10. 牛郎织女都见面,而你却在吃狗粮---男士星座脱单指南