开启辅助访问 切换到窄版

打印 上一主题 下一主题

【STM32时间戳的妙用,ucos 时间戳】如何测量程序的运行时间,精度为ns级别

[复制链接]
版块:
嵌入式操作系统 ucOSII 发布时间:2018-6-18 18:49:36
17440
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ucos-iii 源码中,有一个功能是测量关中断时间的功能,使用的是STM32的时间戳,即记录程序运行的某个时刻,如果记录下程序前后的两个时刻点,即可以算出这段程序的运行时间。


ucos 时间戳使用的是 Cortex-M内核中的一个时钟计数器来实现的,内核时钟跳动一次,该计数器就加1,精度非常高,决定内核的频率是多少,如果是F103系列,内核时钟是72M,那精度就是1/72M = 14ns,而程序的运行时间都是微秒级别的,所以14ns的精度是远远够的。

但是有关内核寄存器的描述的资料非常少,还好在arm的官网找到一个,里面有这些内核寄存器的详细描述,其中时间戳相关的寄存器在第10章和11章有详细的描述。

下面的代码是我从ucos-iii里面抽离出来的ucos 时间戳相关的功能代码,测试完全可用,这部分代码可以用来测量程序的运行时间,也可以用来实现us级别的延时。

这个文件是Cortex-M3内核的技术参考手册,里面有内核寄存器的全部描述。

/*
************************************************************************************************************************
*                       时间戳相关寄存器定义
************************************************************************************************************************
*/
/*
在Cortex-M3里面有一个外设叫DWT(Data Watchpoint and Trace),该外设有一个32位的寄存器叫CYCCNT,它是一个向上的
计数器,记录的是内核时钟运行的个数,最长能记录的时间为:60s=2的32次方/72000000(假设内核频率为72M,内核跳一次的时间大概为1/72M=14ns)
当CYCCNT溢出之后,会清0重新开始向上计数。
使能CYCCNT计数的操作步骤:
1、先使能DWT外设,这个由另外内核调试寄存器DEMCR的位24控制,写1使能
2、使能CYCCNT寄存器之前,先清0
3、使能CYCCNT寄存器,这个由DWT_CTRL(代码上宏定义为DWT_CR)的位0控制,写1使能
*/


#define DWT_CR   *(uint32_t *)0xE0001000
#define DWT_CYCCNT *(uint32_t *)0xE0001004
#define DEM_CR   *(uint32_t *)0xE000EDFC


<span class="hljs-default-section" style="color: rgb(224, 108, 117);background: rgba(0, 0, 0, 0);display: inline;width: 330px;text-decoration: none solid rgb(224, 108, 117);font-weight: 400;font-style: normal;">#define DEM_CR_TRCENA          (1
回复

使用道具 举报

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

本版积分规则

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