硬汉嵌入式论坛

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

[客户分享] DWT 计时器 整理

[复制链接]

32

主题

295

回帖

391

积分

高级会员

积分
391
发表于 2018-3-15 16:12:15 | 显示全部楼层 |阅读模式
功能性硬汉的bsp_dwt 模块,RTOS我是用的RT-THREAD,最近看了ucos,看到有CPU时间戳获取的代码;
DWT这个外设,可以做很多测量用途,计算的时间和示波器、逻辑分析仪对比,几乎是一致的;

看到编程指南关于DWT中有剩余的计数器,它们典型地用于程序代码的“性能速写”(profiling)。通过编程它们,就可以让它们在计数器溢出时发出事件(以跟踪数据包的形式)。
最典型地,就是使用CYCCNT寄存器来测量执行某个任务所花的周期数,这也可以用作时间基准相关的目的(操作系统中统计CPU使用率可以用到它)。


可以做很多程序关于时间测量的应用,,比如测试SRAM的读写速度、

吧硬汉的代码稍微做了改动,
获取CPU hclk频率 168M
  1. /*
  2. *********************************************************************************************************
  3. *        函 数 名: BSP_CPU_ClkFreq
  4. *        功能说明: 获取CPU 时钟频率 HCLK_Frequency 168M
  5. *        形    参:  void
  6. *        返 回 值: 时钟频率 单位HZ
  7. *********************************************************************************************************
  8. */

  9. uint32_t  BSP_CPU_ClkFreq (void)
  10. {
  11.      RCC_ClocksTypeDef  rcc_clocks;

  12.      RCC_GetClocksFreq(&rcc_clocks);
  13.      
  14.      return ((uint32_t)rcc_clocks.HCLK_Frequency);
  15. }
复制代码



时间戳转换成us时间:

  1. uint32_t  CPU_TS32_to_uSec (uint32_t  ts_cnts)
  2. {
  3.     uint32_t  ts_us;
  4.     uint32_t  fclk_freq;

  5.     fclk_freq = BSP_CPU_ClkFreq();   
  6.     ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
  7.    
  8.        return (ts_us);
  9. }
复制代码



获取具体PU时间戳 时刻,做了溢出修正,自动处理异常;
  1. uint32_t CPU_TS_GET(void)
  2. {   
  3.     uint32_t _get_ts;

  4.     uint32_t _ts;
  5.    
  6.     static uint32_t _ts_bak;    /* 时间戳备份 */

  7.     /* 最新的时间戳 us */
  8.     _get_ts = CPU_TS32_to_uSec(DWT_CYCCNT);

  9.     if(_get_ts < _ts_bak)
  10.     {
  11.         /* 做溢出修正 */
  12.         _ts = MAXIMUM_TIMESTAMP_uS -_ts_bak+_get_ts;
  13.         
  14.         /* 加上上次数据 即可求出本次时间差*/
  15.         _ts = _ts+_ts_bak;
  16.     }
  17.     else
  18.     {
  19.         /* 正常情况 */
  20.         _ts = _get_ts;
  21.     }
  22.    
  23.     /* 上次时间戳备份 防止溢出情况 */
  24.     _ts_bak = _get_ts;
  25.    
  26.     return (_ts);
  27. }
复制代码



使用方法:

  1. /* 定义三个全局变量 */
  2.     uint32_t TimeStart;
  3.         uint32_t TimeEnd;
  4.         uint32_t TimeUse;

  5.         TimeStart = CPU_TS_GET();
  6.         rt_thread_delay(100);
  7.         TimeEnd = CPU_TS_GET();
复制代码


bsp_dwt.h

793 Bytes, 下载次数: 206

bsp_dwt.c

9.96 KB, 下载次数: 112

评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-3-15 17:18:06 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

9

主题

38

回帖

65

积分

初级会员

积分
65
发表于 2020-3-23 09:01:25 | 显示全部楼层
不知道楼主有没有试验过代码,我在main中一直循环调用,一段时间就异常中断了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2020-3-23 09:03:32 | 显示全部楼层
ice845930 发表于 2020-3-23 09:01
不知道楼主有没有试验过代码,我在main中一直循环调用,一段时间就异常中断了。

不会,除非你没有移植好。
这里新版uCOS例子里面就有,直接调用即可,uCOS-III的CPU利用率统计全靠这个。


基于V5,V6和V7的最新版uCOS-III V3.08.00程序模板,含MDK和IAR两个版本,支持uC/Probe(2020-03-19)
http://www.armbbs.cn/forum.php?m ... 6918&fromuid=58
(出处: 硬汉嵌入式论坛)


回复

使用道具 举报

6

主题

641

回帖

659

积分

金牌会员

积分
659
QQ
发表于 2020-3-24 22:12:42 | 显示全部楼层
Mark,好东西,测试有些读写速度时用得着
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 02:42 , Processed in 0.171374 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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