调试笔记–keil 测量周期小技巧

  • cortex-m内核的单片机,内核内除了systick定时器外,还有一个用于调试的WDT定时器,可以在keil中协助测量代码运行周期。

WDT定时器默认是给调试器用的,自己最好不要使用。

直接看keil的状态栏计时器

  1. 一定要确保时钟周期和单片机内核一致
    如果使用daplink

如果使用jlink

keil与python实现bin文件时间信息 keil 如何看timer周期_stm32

  1. 在要测量代码前后打上断点

例如要测GPIO翻转函数所需时间,在翻转函数前后打上断点,然后右键将t2清零,再点击运行到下一个断点处,然后观察t2时间戳
t0代表从函数上电后开始计时到当前的时间(不用担心WDT溢出问题,keil会自动计算)
t1和t2是两个时间戳,用户可以用这两个时间戳互相配合,实现自己想要的功能

keil与python实现bin文件时间信息 keil 如何看timer周期_中间件_02


如果没有时间,可以切换到寄存器窗口

keil与python实现bin文件时间信息 keil 如何看timer周期_单片机_03

使用keil的Event Recorder中间件测量

Event Recorder中间件支持时间和功耗测量,printf打印,及keil其他中间件的调试,是keil专门用于调试的组件。其原理简单来说就是将一些调试信息以固定的格式存放在RAM中,然后通过调试器找到并读取RAM中固定格式的数据,通过keil的界面组件显示出来。因此使用Event Recorder中间件需要修改代码,并且需要占用一定的RAM空间。

  1. keil添加组件

如果网不好,可以通过 http://www.armbbs.cn/forum.php?mod=viewthread&tid=96992&highlight=pack 镜像下载后,自行安装

keil与python实现bin文件时间信息 keil 如何看timer周期_keil mdk_04

  1. 工程添加组件
  2. 初始化组件

keil与python实现bin文件时间信息 keil 如何看timer周期_keil mdk_05


并添加一下代码进行初始化组件

#include "EventRecorder.h"
/* 初始化 EventRecorder 并开启 */
EventRecorderInitialize(EventRecordAll, 1U);
  1. 调用计时API函数

计时API其实就是将DWT计时器的时钟数以固定格式存放到RAM中

//参数 slot范围 0-15 共16个计时通道
EventStartA(slot);

/* 要测量的代码 */

EventStopA(slot);

keil与python实现bin文件时间信息 keil 如何看timer周期_单片机_06

ps: 这个功能受调试器功能影响,虽然dap、jlink都可以用, 但是实测发现dap有时不能实时检测计时功能其实也是调用了MDK状态栏的计时器,如果时间不准,可以参考文章开头,先将状态栏计时器功能调准),不过Event Recorder中间件还带printf功能,并且keil其他中间件例如RTX5或者FREERTOS都有配套的Event Recorder文件,非常方便调试OS(可以获取OS堆栈情况,任务切换情况等信息)