如何测量代码运行时间

开发 前端
测量一段代码运行时间第一时间想到的当然是示波器了,在测量开始的代码前面拉高某个GPIO,在结束测量的位置拉低这个GPIO,直接使用示波器查看这个GPIO的高电平时间长度即可,就是我们要测量的这段代码的运行时间。

[[418173]]

01示波器

测量一段代码运行时间第一时间想到的当然是示波器了,在测量开始的代码前面拉高某个GPIO,在结束测量的位置拉低这个GPIO,直接使用示波器查看这个GPIO的高电平时间长度即可,就是我们要测量的这段代码的运行时间。

那么直接上示例,为了模拟代码运行一段时间,这里我直接采用之前文章《STM32的四种延时方法》直接延时。

  1. while (1) 
  2.   GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄灭LED灯                      
  3.   delay_ms(500);//延时500ms 
  4.   GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯                      
  5.   delay_ms(500);//延时500ms 

延时500ms时波形如下:

当修改代码,延时100ms时。

  1. while (1) 
  2.   GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄灭LED灯                      
  3.   delay_ms(100);//延时100ms 
  4.   GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯                      
  5.   delay_ms(100);//延时100ms 

波形如下:

测量准确无误,但是他的缺点也很明显啊,需要示波器,示波器一般很笨重的,即使是轻便的示波器,也需要接硬件,还是很麻烦的,而且需要一个空闲的GPIO,测量的这段代码中,不能使用到这个GPIO。

02定时器测量

定时器不仅仅我们可以实现我们之前讲解的《基础定时功能》《PWM输出功能》《输入捕获功能》《触摸按键功能》,还可以用于测量一段代码的运行时间。在学习使用定时器测量代码运行时间之前,如果对定时器不了解的同学先看刚刚提到的定时器的文中,重点文章《STM32基础定时器简介》。本篇文章不再讲解定时器的基础功能。

定时器本质上就是向上累加的计数器(如果配置成向上计数时),所以我们在测量开始的代码前面读取定时器的计数器,在结束测量的位置再读取定时器的计数器,获得两次的差值,这样就可以计算出这段代码的运行的时间。这就是简单的原理,下面直接撸代码。

首先配置定时器,这里我使用定时器3,配置定时器的计数器每增加1,表示100us。并且将溢出值设置为最大。

  1. void TIM_Config(void) 
  2.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; 
  3.   /* TIM3 clock enable */ 
  4.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 
  5.    
  6.   TIM_TimeBaseStructure.TIM_Period = 0xFFFF-1; 
  7.   TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t) ((SystemCoreClock / 2) / 10000) - 1; 
  8.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2; 
  9.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
  10.   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
  11.   TIM_Cmd(TIM3, ENABLE); 

测量代码运行时间的代码如下,这里进行了防溢出的处理。

  1. while (1) 
  2.   GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄灭LED灯                      
  3.   delay_ms(100);//延时100ms 
  4.   GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯 
  5.   old_counter = TIM_GetCounter(TIM3); 
  6.   delay_ms(100);//延时100ms 
  7.   couter_current = TIM_GetCounter(TIM3); 
  8.   if(couter_current > old_counter) 
  9.     counter = couter_current - old_counter; 
  10.   else 
  11.     counter = couter_current + 0XFFFF - old_counter; 
  12.   time_ms = counter / 10; 

上述代码延时100ms,通过定时器测量结果同样为100ms,准确无误。如下所示:

这样有的同学可能已经联想到了,上述代码完全可以封装成一个函数如下:

  1. float Time_Difference_ms(void) 
  2.   static uint32_t old_counter; 
  3.   uint32_t counter,couter_current; 
  4.   couter_current = TIM_GetCounter(TIM3); 
  5.   if(couter_current > old_counter) 
  6.     counter = couter_current - old_counter; 
  7.   else 
  8.     counter = couter_current + 0XFFFF - old_counter; 
  9.   old_counter = couter_current; 
  10.   return (counter / 10); 

这样就可以实现,测量两次调用这个接口的是时间差,如下,可以准确测得两次调用Time_Difference_ms这个函数的时间差是100ms。

上述代码经过封装,可以测量代码两次运行到相同位置的时间差。将程序再进化一下。

  1. float Time_Difference_ms(uint8_t flg) 
  2.   static uint32_t old_counter[5]; 
  3.   uint32_t counter,couter_current; 
  4.   couter_current = TIM_GetCounter(TIM3); 
  5.   if(couter_current > old_counter[flg]) 
  6.     counter = couter_current - old_counter[flg]; 
  7.   else 
  8.     counter = couter_current + 0XFFFF - old_counter[flg]; 
  9.   old_counter[flg] = couter_current; 
  10.   return (counter / 10); 

这样就可以得到多个位置两次运行到相同位置的时间差。

当然,这样也存在缺点:

1、需要占用一个定时器

2、按上述配置,最长测量时间为0XFFFF*0.1=6553.5ms=6.553.5s。

本文转载自微信公众号「 知晓编程 」

【编辑推荐】

 

责任编辑:姜华 来源: 知晓编程
相关推荐

2020-04-06 11:47:44

Linux命令脚本

2015-07-20 15:44:46

Swift框架MJExtension反射

2022-11-04 09:09:54

Linux服务器

2024-03-28 08:17:46

JestJS服务端

2010-01-27 14:14:48

C++程序运行时间

2024-03-21 09:15:58

JS运行的JavaScrip

2018-04-08 14:27:45

Linuxuptime系统运行时间

2019-10-14 09:14:37

Linuxbash命令

2014-03-14 13:29:24

VDI配置文件

2024-12-10 08:00:00

C++CRTP函数

2021-09-11 15:38:23

容器运行镜像开放

2019-07-12 09:30:12

DashboardDockerDNS

2022-10-08 00:00:00

V8channel对象

2009-06-17 15:46:36

Java运行时本机内存

2021-06-24 10:28:19

uptimed命令Linux

2016-08-23 10:17:42

2013-11-26 16:49:55

Android开发运行时KitKat

2020-12-07 13:31:43

GoMutex开发者

2024-03-20 10:46:00

云原生容器

2023-07-28 10:42:43

点赞
收藏

51CTO技术栈公众号