你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
评分
查看全部评分
评分
查看全部评分
评分
查看全部评分
dwt
评分
查看全部评分