OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4600|回复: 7

需要精确统计代码段运行的时间(无操作系统,基于Cube库)

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-3-30
在线时间
8 小时
发表于 2016-4-25 20:09:01 | 显示全部楼层 |阅读模式

由于在我的代码中,需要统计代码段运行时间,运行了多少微妙。
所以写了如下代码, 用定时器验证过,可以精确到2微妙以内。(我的开发板是正点的ALIENTEK探索者STM32F407)
(当然如果系统中断很多,待测代码内部被打断,那就没有办法了。不过可以多次测量,取最小的那次为准。)
以下代码,供互相学习。请批评指正。

static uint32_t dwStartMs=0;
static uint32_t dwStartTick=0;
static uint32_t dwEachTickUs=168;// 后面会赋值

void start_during(void )
{
        uint32_t  StMsCheck;
         dwEachTickUs=(HAL_RCC_GetHCLKFreq()/1000000);
        dwStartMs=HAL_GetTick();
        dwStartTick=SysTick->VAL;  
        StMsCheck=HAL_GetTick();  
        if(dwStartMs!=StMsCheck)
          {// 确保毫秒和微妙在同一个周期内。
                 dwStartTick=SysTick->VAL;  
                 dwStartMs=StMsCheck;
          }       
}

uint32_t get_during_us(void)
{
   uint32_t CurMsCheck;
    uint32_t CurMs;
    uint32_t CurTick;

       
      CurMs=HAL_GetTick();
     CurTick=SysTick->VAL;
      CurMsCheck=HAL_GetTick();  

           if(CurMs!=CurMsCheck)
          {// 确保毫秒和微妙在同一个周期内。
                 CurTick=SysTick->VAL;  
                  CurMs=CurMsCheck;
         }

          if(CurTick < dwStartTick){
            return (CurMs-dwStartMs)*1000+ (dwStartTick-CurTick)/dwEachTickUs;
                }
          if(CurTick == dwStartTick)
                        return (CurMs-dwStartMs)*1000;
       
          if(CurTick > dwStartTick){
            return (CurMs-dwStartMs-1)*1000+ (SysTick->LOAD - CurTick + dwStartTick)/dwEachTickUs;
                }               

          return 0;
}
使用方法:
start_during();
要测量的代码段;
during =get_during_us(); // 返回值就是结果,微妙为单位。









正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-4-25 20:10:32 | 显示全部楼层
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

307

主题

1427

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7875
金钱
7875
注册时间
2015-10-15
在线时间
2874 小时
发表于 2016-4-25 21:10:46 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-4-26 09:38:17 | 显示全部楼层
问一下
hal 库好用吗?
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-3-30
在线时间
8 小时
 楼主| 发表于 2016-5-4 10:00:39 | 显示全部楼层
止天 发表于 2016-4-26 09:38
问一下
hal 库好用吗?

我也是初学,才接触两个礼拜,用了一个多礼拜,个人感觉,cube 挺好用的,前期要看官网的几个英文文档。后期用起来就很方便了。 而且 ,把正点原子光盘里的一些基于标准库的代码,稍作修改,能跑在Cube生成的代码上。
回复 支持 反对

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2016-5-4 16:13:56 | 显示全部楼层
HAL_RCC_GetHCLKFreq()是要包含那个库?#include"cube.h"吗?
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-3-30
在线时间
8 小时
 楼主| 发表于 2016-5-9 16:24:07 | 显示全部楼层
k-ad 发表于 2016-5-4 16:13
HAL_RCC_GetHCLKFreq()是要包含那个库?#include"cube.h"吗?

#include "stm32f4xx_hal.h"
只要这个头文件,HAL的大部分函数都包含了。

(我用的是,cube生成的keil MDK V5的 )
回复 支持 反对

使用道具 举报

17

主题

237

帖子

0

精华

高级会员

Rank: 4

积分
925
金钱
925
注册时间
2012-2-27
在线时间
393 小时
发表于 2016-5-9 17:36:44 | 显示全部楼层
恩,没有用过cube
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 05:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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