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

如何測(cè)量代碼運(yùn)行時(shí)間

開(kāi)發(fā) 前端
測(cè)量一段代碼運(yùn)行時(shí)間第一時(shí)間想到的當(dāng)然是示波器了,在測(cè)量開(kāi)始的代碼前面拉高某個(gè)GPIO,在結(jié)束測(cè)量的位置拉低這個(gè)GPIO,直接使用示波器查看這個(gè)GPIO的高電平時(shí)間長(zhǎng)度即可,就是我們要測(cè)量的這段代碼的運(yùn)行時(shí)間。

[[418173]]

01示波器

測(cè)量一段代碼運(yùn)行時(shí)間第一時(shí)間想到的當(dāng)然是示波器了,在測(cè)量開(kāi)始的代碼前面拉高某個(gè)GPIO,在結(jié)束測(cè)量的位置拉低這個(gè)GPIO,直接使用示波器查看這個(gè)GPIO的高電平時(shí)間長(zhǎng)度即可,就是我們要測(cè)量的這段代碼的運(yùn)行時(shí)間。

那么直接上示例,為了模擬代碼運(yùn)行一段時(shí)間,這里我直接采用之前文章《STM32的四種延時(shí)方法》直接延時(shí)。

  1. while (1) 
  2.   GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄滅LED燈                      
  3.   delay_ms(500);//延時(shí)500ms 
  4.   GPIO_ResetBits(GPIOE,GPIO_Pin_4);//點(diǎn)亮LED燈                      
  5.   delay_ms(500);//延時(shí)500ms 

延時(shí)500ms時(shí)波形如下:

當(dāng)修改代碼,延時(shí)100ms時(shí)。

  1. while (1) 
  2.   GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄滅LED燈                      
  3.   delay_ms(100);//延時(shí)100ms 
  4.   GPIO_ResetBits(GPIOE,GPIO_Pin_4);//點(diǎn)亮LED燈                      
  5.   delay_ms(100);//延時(shí)100ms 

波形如下:

測(cè)量準(zhǔn)確無(wú)誤,但是他的缺點(diǎn)也很明顯啊,需要示波器,示波器一般很笨重的,即使是輕便的示波器,也需要接硬件,還是很麻煩的,而且需要一個(gè)空閑的GPIO,測(cè)量的這段代碼中,不能使用到這個(gè)GPIO。

02定時(shí)器測(cè)量

定時(shí)器不僅僅我們可以實(shí)現(xiàn)我們之前講解的《基礎(chǔ)定時(shí)功能》《PWM輸出功能》《輸入捕獲功能》《觸摸按鍵功能》,還可以用于測(cè)量一段代碼的運(yùn)行時(shí)間。在學(xué)習(xí)使用定時(shí)器測(cè)量代碼運(yùn)行時(shí)間之前,如果對(duì)定時(shí)器不了解的同學(xué)先看剛剛提到的定時(shí)器的文中,重點(diǎn)文章《STM32基礎(chǔ)定時(shí)器簡(jiǎn)介》。本篇文章不再講解定時(shí)器的基礎(chǔ)功能。

定時(shí)器本質(zhì)上就是向上累加的計(jì)數(shù)器(如果配置成向上計(jì)數(shù)時(shí)),所以我們?cè)跍y(cè)量開(kāi)始的代碼前面讀取定時(shí)器的計(jì)數(shù)器,在結(jié)束測(cè)量的位置再讀取定時(shí)器的計(jì)數(shù)器,獲得兩次的差值,這樣就可以計(jì)算出這段代碼的運(yùn)行的時(shí)間。這就是簡(jiǎn)單的原理,下面直接擼代碼。

首先配置定時(shí)器,這里我使用定時(shí)器3,配置定時(shí)器的計(jì)數(shù)器每增加1,表示100us。并且將溢出值設(shè)置為最大。

  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); 

測(cè)量代碼運(yùn)行時(shí)間的代碼如下,這里進(jìn)行了防溢出的處理。

  1. while (1) 
  2.   GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄滅LED燈                      
  3.   delay_ms(100);//延時(shí)100ms 
  4.   GPIO_ResetBits(GPIOE,GPIO_Pin_4);//點(diǎn)亮LED燈 
  5.   old_counter = TIM_GetCounter(TIM3); 
  6.   delay_ms(100);//延時(shí)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; 

上述代碼延時(shí)100ms,通過(guò)定時(shí)器測(cè)量結(jié)果同樣為100ms,準(zhǔn)確無(wú)誤。如下所示:

這樣有的同學(xué)可能已經(jīng)聯(lián)想到了,上述代碼完全可以封裝成一個(gè)函數(shù)如下:

  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); 

這樣就可以實(shí)現(xiàn),測(cè)量?jī)纱握{(diào)用這個(gè)接口的是時(shí)間差,如下,可以準(zhǔn)確測(cè)得兩次調(diào)用Time_Difference_ms這個(gè)函數(shù)的時(shí)間差是100ms。

上述代碼經(jīng)過(guò)封裝,可以測(cè)量代碼兩次運(yùn)行到相同位置的時(shí)間差。將程序再進(jìn)化一下。

  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); 

這樣就可以得到多個(gè)位置兩次運(yùn)行到相同位置的時(shí)間差。

當(dāng)然,這樣也存在缺點(diǎn):

1、需要占用一個(gè)定時(shí)器

2、按上述配置,最長(zhǎng)測(cè)量時(shí)間為0XFFFF*0.1=6553.5ms=6.553.5s。

本文轉(zhuǎn)載自微信公眾號(hào)「 知曉編程 」

【編輯推薦】

 

責(zé)任編輯:姜華 來(lái)源: 知曉編程
相關(guān)推薦

2020-04-06 11:47:44

Linux命令腳本

2015-07-20 15:44:46

Swift框架MJExtension反射

2022-11-04 09:09:54

Linux服務(wù)器

2010-01-27 14:14:48

C++程序運(yùn)行時(shí)間

2024-03-28 08:17:46

JestJS服務(wù)端

2024-03-21 09:15:58

JS運(yùn)行的JavaScrip

2018-04-08 14:27:45

Linuxuptime系統(tǒng)運(yùn)行時(shí)間

2019-10-14 09:14:37

Linuxbash命令

2014-03-14 13:29:24

VDI配置文件

2022-10-08 00:00:00

V8channel對(duì)象

2019-07-12 09:30:12

DashboardDockerDNS

2021-09-11 15:38:23

容器運(yùn)行鏡像開(kāi)放

2009-06-17 15:46:36

Java運(yùn)行時(shí)本機(jī)內(nèi)存

2024-12-10 08:00:00

C++CRTP函數(shù)

2016-08-23 10:17:42

2021-06-24 10:28:19

uptimed命令Linux

2022-10-08 00:06:00

JS運(yùn)行V8

2023-08-29 08:20:35

Kubernete跨云容器

2021-08-27 00:21:19

JSJust源碼

2023-02-12 12:00:57

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美色影院 | 91精品国产综合久久婷婷香蕉 | 国产精品久久一区 | 成人精品国产 | 91福利影院 | www.久| 一级黄色短片 | 精品熟人一区二区三区四区 | 性国产xxxx乳高跟 | 先锋资源亚洲 | 午夜小电影| 欧美一区二区网站 | 99精品国产一区二区三区 | 欧美日韩在线一区二区三区 | 国产福利视频网站 | 草草在线观看 | 国产免费又色又爽又黄在线观看 | 精品久久精品 | 欧美日韩国产免费 | 日韩久久久久久 | 99re66在线观看精品热 | 国产视频一区在线 | 91精品国产91久久久久久吃药 | www.久久久久久久久久久 | 天天射天天操天天干 | 免费日韩av | 欧美一区视频 | 日韩免费视频一区二区 | www.色婷婷 | 欧美日韩综合一区 | 亚洲一区二区黄 | 久久三级av | 激情久久av一区av二区av三区 | 午夜免费福利片 | 亚洲国产精品久久 | 国内精品视频在线观看 | 亚洲一区视频在线 | 久久香蕉精品视频 | 91亚洲国产精品 | 不卡在线视频 | 日本a∨视频 |