成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何測量代碼運行時間

開發 前端
測量一段代碼運行時間第一時間想到的當然是示波器了,在測量開始的代碼前面拉高某個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-21 09:15:58

JS運行的JavaScrip

2010-01-27 14:14:48

C++程序運行時間

2024-03-28 08:17:46

JestJS服務端

2018-04-08 14:27:45

Linuxuptime系統運行時間

2021-09-11 15:38:23

容器運行鏡像開放

2019-07-12 09:30:12

DashboardDockerDNS

2024-12-10 08:00:00

C++CRTP函數

2019-10-14 09:14:37

Linuxbash命令

2014-03-14 13:29:24

VDI配置文件

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

2023-01-03 09:10:21

2023-07-28 10:42:43

2020-12-07 13:31:43

GoMutex開發者
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产精品久久国产精品 | 激情网站在线 | 51ⅴ精品国产91久久久久久 | 亚洲国产日韩欧美 | 中文字幕国产精品视频 | 久久综合久色欧美综合狠狠 | 伊人热久久 | 国产激情第一页 | 在线播放中文字幕 | 成人免费在线观看 | 亚洲欧美在线观看视频 | a级毛片国产 | 国产精品久久久久久亚洲调教 | 中文字幕第一页在线 | caoporn视频在线 | 国产乱码精品1区2区3区 | 久久久免费电影 | 日韩欧美国产综合 | 欧美情趣视频 | 久久中文字幕一区 | 精品福利视频一区二区三区 | 欧美精品日韩 | 久久人体 | 欧美爱爱视频 | 久久久精品网站 | 婷婷色国产偷v国产偷v小说 | 在线欧美视频 | 男女视频在线免费观看 | 久久综合一区 | 久久中文免费视频 | 最新国产精品精品视频 | 国产精品视频久久久久 | 国产亚洲一区二区三区 | 国产精品久久久久久久久久 | www精品| av国产精品| 亚洲精品中文字幕 | 日本免费一区二区三区四区 | 国产精品久久久久久久午夜 | 久久人体视频 | 国产乱码精品一品二品 |