硬汉嵌入式论坛

 找回密码
 立即注册
查看: 263|回复: 4
收起左侧

[辅助工具] H7TOOL用DWT->CYCCNT寄存器监控freertos任务时间

[复制链接]

2

主题

13

回帖

19

积分

新手上路

积分
19
发表于 2026-3-24 11:23:06 | 显示全部楼层 |阅读模式
本帖最后由 Florence 于 2026-3-24 11:24 编辑

硬汉哥给的案例是在中断里每50us递增变量,其实freertos的portGET_RUN_TIME_COUNTER_VALUE() 计数不限制累加的频率,可以用DWT->CYCCNT 作为运行时间基准,这样就不需要新增中断,减小系统开销。

下面给出m3内核的示例,其他内核DWT->CYCCNT地址会不一样

板卡代码改动:

1)启动时打开 DWT 计数器

#include "core_cm3.h"

static void DWT_Init(void)
{
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;   // 使能 DWT/ITM
    DWT->CYCCNT = 0;
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;              // 开始计数
}

2)FreeRTOSConfig.h

#define configGENERATE_RUN_TIME_STATS        1
#define configUSE_STATS_FORMATTING_FUNCTIONS 1
extern void DWT_Init(void);
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()   DWT_Init()
#define portGET_RUN_TIME_COUNTER_VALUE()          (DWT->CYCCNT)

Lua改动:
1)把 ulHighFrequencyTimerTicks_off 改成 DWT_CYCCNT 地址
现在是:
"ulHighFrequencyTimerTicks_off", "ulHighFrequencyTimerTicks"

改成:

"ulHighFrequencyTimerTicks_off",  0xE0001004, -- 任务信息统计高精度时间基准--改成DWT->CYCCNT寄存器地址



回复

使用道具 举报

2

主题

13

回帖

19

积分

新手上路

积分
19
 楼主| 发表于 2026-3-24 11:45:57 | 显示全部楼层
不过这样大概半分钟计数器会溢出,统计的任务时间有点问题,50us计数的话要几天才会溢出
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121982
QQ
发表于 2026-3-24 14:19:06 | 显示全部楼层
谢谢楼主分享
这个有缺点,M0和M23内核不支持DWT
回复

使用道具 举报

9

主题

169

回帖

196

积分

初级会员

积分
196
发表于 2026-3-24 16:56:21 | 显示全部楼层
这种操作我用过,其实也可以用一个硬件定时器,比如分频到1us计数。这样32位定时器也能坚持一段时间不溢出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2026-4-10 14:38 , Processed in 1.041415 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表