如何测量代码运行时间
01、示波器
测量一段代码运行时间第一时间想到的当然是示波器了,在测量开始的代码前面拉高某个GPIO,在结束测量的位置拉低这个GPIO,直接使用示波器查看这个GPIO的高电平时间长度即可,就是我们要测量的这段代码的运行时间。
那么直接上示例,为了模拟代码运行一段时间,这里我直接采用之前文章《STM32的四种延时方法》直接延时。
while (1){
GPIO_SetBits(GPIOE,GPIO_Pin_4);
//熄灭LED灯delay_ms(500);//延时500ms
GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯
delay_ms(500);//延时500ms
}
延时500ms时波形如下
当修改代码,延时100ms时
while (1){
GPIO_SetBits(GPIOE,GPIO_Pin_4);
//熄灭LED灯delay_ms(100);//延时100ms
GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯
delay_ms(100);//延时100ms
}
波形如下
02、定时器测量
定时器不仅仅我们可以实现我们之前讲解的《基础定时功能》《PWM输出功能》《输入捕获功能》《触摸按键功能》,还可以用于测量一段代码的运行时间。在学习使用定时器测量代码运行时间之前,如果对定时器不了解的同学先看刚刚提到的定时器的文中,重点文章《STM32基础定时器简介》。本篇文章不再讲解定时器的基础功能。
定时器本质上就是向上累加的计数器(如果配置成向上计数时),所以我们在测量开始的代码前面读取定时器的计数器,在结束测量的位置再读取定时器的计数器,获得两次的差值,这样就可以计算出这段代码的运行的时间。这就是简单的原理,下面直接撸代码。
首先配置定时器,这里我使用定时器3,配置定时器的计数器每增加1,表示100us。并且将溢出值设置为最大。
void TIM_Config(void){
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* TIM3 clock enable */RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period
= 0xFFFF-1;TIM_TimeBaseStructure.TIM_Prescaler
= (uint16_t) ((SystemCoreClock / 2) / 10000) - 1;TIM_TimeBaseStructure.TIM_ClockDivision
= TIM_CKD_DIV2;TIM_TimeBaseStructure.TIM_CounterMode
= TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,
&TIM_TimeBaseStructure);TIM_Cmd(TIM3, ENABLE);
}
测量代码运行时间的代码如下,这里进行了防溢出的处理
while (1){
GPIO_SetBits(GPIOE,GPIO_Pin_4);
//熄灭LED灯delay_ms(100);//延时100ms
GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯
old_counter = TIM_GetCounter(TIM3);
delay_ms(100);//延时100ms
couter_current = TIM_GetCounter(TIM3);
if(couter_current > old_counter)
counter = couter_current - old_counter;
else
counter = couter_current + 0XFFFF - old_counter;
time_ms = counter / 10;
}
上述代码延时100ms,通过定时器测量结果同样为100ms,准确无误。如下所示:
float Time_Difference_ms(void){
static uint32_t old_counter;uint32_t counter,couter_current;
couter_current
= TIM_GetCounter(TIM3);if(couter_current > old_counter)counter
= couter_current - old_counter;elsecounter
= couter_current + 0XFFFF - old_counter;old_counter
= couter_current;return (counter / 10);}
这样就可以实现,测量两次调用这个接口的是时间差,如下,可以准确测得两次调用Time_Difference_ms这个函数的时间差是100ms。
float Time_Difference_ms(uint8_t flg){
static uint32_t old_counter[5];uint32_t counter,couter_current;
couter_current
= TIM_GetCounter(TIM3);if(couter_current > old_counter[flg])counter
= couter_current - old_counter[flg];elsecounter
= couter_current + 0XFFFF - old_counter[flg];old_counter[flg]
= couter_current;return (counter / 10);}
这样就可以得到多个位置两次运行到相同位置的时间差。
当然,这样也存在缺点:
1、需要占用一个定时器
2、按上述配置,最长测量时间为0XFFFF*0.1=6553.5ms=6.553.5s。
Keil和IAR的工程文件下载地址:
PCB和工程代码开源地址:
https://github.com/spanercjd/STM32F207VCT6
点击查看本文所在的专辑,STM32F207教程
以上是 如何测量代码运行时间 的全部内容, 来源链接: utcz.com/z/519887.html