01用示波器测量一段代码的运行时间,第一个想到的当然是示波器。在开始测量的代码前拉高某个GPIO,在测量结束时拉低这个GPIO,直接使用示波器。只需查看这个GPIO的高电平时长,就是我们要测量的这段代码的运行时间。然后直接上例子,为了模拟代码运行一段时间,这里我直接用上篇文章《STM32的四种延时方法》直接延时。while(1){GPIO_SetBits(GPIOE,GPIO_Pin_4);//关闭LED灯delay_ms(500);//延时500msGPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯delay_ms(500);//延时500ms}延时500ms时,波形如下:修改代码时,延时100ms。while(1){GPIO_SetBits(GPIOE,GPIO_Pin_4);//关闭LED灯delay_ms(100);//延时100msGPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯delay_ms(100);//延时100ms}波形如下:测量准确,但缺点也很明显。它需要一个示波器。示波器通常非常笨重。即使是小型示波器也需要连接到硬件。还是很麻烦,需要一个空闲的GPIO。在此代码中,无法使用此GPIO。02Timer测量Timer不仅可以实现我们之前讲解的《基础定时功能》《PWM输出功能》《输入捕获功能》《触摸按键功能》,还可以用来测量一段代码的运行时间。在学习使用定时器测量代码运行时间之前,如果你对定时器一无所知,你应该先阅读刚才提到的关于定时器的文章,重点文章?。本文不再讲解定时器的基本功能。定时器本质上是一个向上计数的计数器(如果配置为向上计数),所以我们在测量开始的代码之前读取定时器的计数器,然后在测量结束的位置读取定时器的计数器,并求出两者的差值,从而可以计算出这段代码的运行时间。这个原理很简单,下面直接上代码。首先,配置定时器。这里我使用定时器3,配置定时器的计数器每加1,表示100us。并将溢出值设置为最大值。voidTIM_Config(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;/*TIM3clockenable*/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);//延迟100msGPIO_ResetBits(GPIOE,GPIO_Pin_4);//打开LED灯old_counter=TIM_GetCounter(TIM3);delay_ms(100);//Delay100mscouter_current=TIM_GetCounter(TIM3);if(couter_current>old_counter)counter=couter_current-old_counter;elsecounter=couter_current+0XFFFF-old_counter;time_ms=counter/10;}以上代码延迟100ms,result是定时器测量出来的,也是100ms,正好。如下图:可能有的同学已经想到了,上面的代码可以封装成一个函数如下:=couter_current-old_counter;elsecounter=couter_current+0XFFFF-old_counter;old_counter=couter_current;return(counter/10);}这样就可以实现了,测量两次调用这个接口的时间差,如下,函数Time_Difference_ms可以准确测量两次的时间差为100ms。上面的代码被打包用来测量代码两次运行到同一个位置的时间差。再次改进程序。floatTime_Difference_ms(uint8_tflg){staticuint32_told_counter[5];uint32_tcounter,couter_current;couter_current=TIM_GetCounter(TIM3);if(couter_current>old_counter[flg])counter=couter_current-old_counter[flgold];elsecounter=0;FF_current+old_counter[flg]=couter_current;return(counter/10);}这样就可以得到多个位置两次跑到同一个位置的时间差。当然这样也有缺点:1.需要占用一个定时器2.根据上面的配置,最长的测量时间为0XFFFF*0.1=6553.5ms=6.553.5s。本文转载自微信公众号「知乎编程」【编辑推荐】一篇文章带你了解内存中的Slice。一篇文章介绍了Containerd的使用。在云中执行灾难恢复的五种有效方法。为什么应该选择TypeScript而不是JavaScript。本文带你了解Python基础条件语句
