你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
意法半导体官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
STM32CubeH7 里面有没有 测量运行时间的 例程?
[复制链接]
walker2012
提问时间:2019-6-17 10:20 /
测量某段代码的运行时间,感觉比较有用,特别对那些需要极度压榨硬件性能的应用。 STM32CubeH7 有没有这种例程?
赞
0
收藏
0
评论
5
分享
发布时间:2019-6-17 10:20
举报
请先
登录
后回复
5个回答
maxtch
回答时间:2019-6-17 18:35:33
a0a.1 32b0c
这个需要你自己开发了。你可以考虑用一个硬件定时器来干这个活(可以是 SysTick 也可以是外设定时器)。另外 CPU 有一个执行过多少条指令的计数器,这个也可以用。
评分
参与人数
1
蝴蝶豆
+2
收起
理由
STMCU
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
hua543
回答时间:2019-6-18 08:26:14
a0a.1 32b0c
来学习学习
评分
参与人数
1
ST金币
-1
收起
理由
STMCU
-1
不要在求助帖下回复无关话题
查看全部评分
赞
0
评论
回复
支持
反对
慎微
回答时间:2019-6-18 09:12:33
a0a.1 32b0c
MDK 工具就有这功能啊,右下角 有个 记时器 t1,可以看代码运行时间,不过,须要在option设置 debug为 trace enable及设置正确的 core clock.
评分
参与人数
1
蝴蝶豆
+2
收起
理由
STMCU
+ 2
查看全部评分
赞
0
评论
回复
支持
反对
byronsong
回答时间:2019-6-18 09:20:55
a0a.1 32b0c
参照这个按H7属性的改改。
dwtdelay.zip
(1.14 KB, 下载次数: 3)
2019-6-18 09:20 上传
点击文件名下载附件
dwt
评分
参与人数
1
蝴蝶豆
+4
收起
理由
STMCU
+ 4
查看全部评分
赞
0
评论
回复
支持
反对
byronsong
回答时间:2019-6-18 09:25:18
a0a.1 32b0c
一段测试代码
#include "DWTDelay.h"
//#include "SEGGER_RTT.h"
// 0xE000EDFC DEMCR RW Debug Exception and Monitor Control Register.
#define DEMCR ( *(unsigned int *)0xE000EDFC )
#define TRCENA ( 0x01 << 24) // DEMCR的DWT使能位
// 0xE0001000 DWT_CTRL RW The Debug Watchpoint and Trace (DWT) unit
#define DWT_CTRL ( *(unsigned int *)0xE0001000 )
#define CYCCNTENA ( 0x01 << 0 ) // DWT的SYCCNT使能位
// 0xE0001004 DWT_CYCCNT RW Cycle Count register,
#define DWT_CYCCNT ( *(unsigned int *)0xE0001004) // 显示或设置处理器的周期计数值
//#define DWT_DELAY_mS(mSec) DWT_DELAY_uS(mSec*1000)
static int SYSCLK = 0;
void DWT_INIT(int sys_clk)
{
DEMCR |= TRCENA;
DWT_CTRL |= CYCCNTENA;
SYSCLK = sys_clk; // 保存当前系统的时钟周期,eg. 72,000,000(72MHz).
}
// 微秒延时
void DWT_DELAY_uS(int uSec)
{
int ticks_start, ticks_end, ticks_delay;
ticks_start = DWT_CYCCNT;
if ( !SYSCLK )
DWT_INIT( MY_MCU_SYSCLK );
ticks_delay = ( uSec * ( MY_MCU_SYSCLK / (1000*1000) ) ); // 将微秒数换算成滴答数
ticks_end = ticks_start + ticks_delay;
if ( ticks_end > ticks_start )
{
while( DWT_CYCCNT < ticks_end );
}
else // 计数溢出,翻转
{
while( DWT_CYCCNT >= ticks_end ); // 翻转后的值不会比ticks_end小
while( DWT_CYCCNT < ticks_end );
}
}
void DWT_TIME_ES1(int start_or_stop,int* es)
{
static int ticks_start;
if ( !SYSCLK )
DWT_INIT( MY_MCU_SYSCLK );
if(!start_or_stop)
{
ticks_start = DWT_CYCCNT;
}
else
{
int ticks_stop = DWT_CYCCNT;
*es = ((ticks_stop - ticks_start)*1000)/(MY_MCU_SYSCLK/1000/1000);
// PRINTF_DEBUG("es1 [%d.%dus]\r\n",*es/1000,*es%1000);
}
}
int DWT_TIME_ES2(int start_or_stop)
{
static int ticks_start;
if ( !SYSCLK )
DWT_INIT( MY_MCU_SYSCLK );
if(!start_or_stop)
{
ticks_start = DWT_CYCCNT;
return ticks_start;
}
else
{
int ticks_stop = DWT_CYCCNT;
return ((ticks_stop - ticks_start)*1000)/(MY_MCU_SYSCLK/1000/1000);
// PRINTF_DEBUG("es1 [%d.%dus]\r\n",*es/1000,*es%1000);
}
}
复制代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM5)
{
int usetime;
DWT_TIME_ES1(0,0);
PRINTF_DEBUG("HAL_TIM_PeriodElapsedCallback TIM5 TICK[%8d]\r\n",HAL_GetTick());
DWT_TIME_ES1(1,&usetime);
DWT_TIME_ES2(0);
PRINTF_DEBUG("es1 [%d.%dus]\r\n",usetime/1000,usetime%1000);
usetime=DWT_TIME_ES2(1);
PRINTF_DEBUG("es2 [%d.%dus]\r\n",usetime/1000,usetime%1000);
}
}
复制代码
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于
意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
dwt
评分
查看全部评分