0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用SysTick實現(xiàn)測量程序運(yùn)行時間

算法&編程學(xué)院 ? 來源:網(wǎng)絡(luò)整理 ? 作者:工程師3 ? 2018-05-09 14:07 ? 次閱讀

在實際的項目開發(fā)過程中,常常遇到需要得到一段代碼的運(yùn)行時間,通常的方法是用示波器來測量,這篇博文將用SysTick來實現(xiàn)精確測量程序運(yùn)行的時間。STM32F4的內(nèi)核定時器SysTick是一個24位的定時器,需要注意最大的測量時間。

如何用SysTick實現(xiàn)測量程序運(yùn)行時間

1,開發(fā)環(huán)境

1,固件庫:STM32F4xx_DSP_StdPeriph_Lib_V1.8.0

2,編譯器:ARMCC V5.06

3,IDE:Keil uVision5

4,操作系統(tǒng)Windows 10 專業(yè)版

2,程序源碼

MeasureTime.h文件

[cpp] view plain copy/**

******************************************************************************

* @file MeasureTime.h

* @author XinLi

* @version v1.0

* @date 24-October-2017

* @brief Measure program run time module.

******************************************************************************

* @attention

*

* 《h2》《center》Copyright ? 2017 XinLi《/center》《/h2》

*

* This program is free software: you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by

* the Free Software Foundation, either version 3 of the License, or

* (at your option) any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program. If not, see 《https://www.gnu.org/licenses/》。

*

******************************************************************************

*/

#ifndef __MEASURETIME_H

#define __MEASURETIME_H

#ifdef __cplusplus

extern “C” {

#endif

/* Header includes -----------------------------------------------------------*/

#include “stm32f4xx.h”

/* Macro definitions ---------------------------------------------------------*/

/* Type definitions ----------------------------------------------------------*/

/* Variable declarations -----------------------------------------------------*/

/* Variable definitions ------------------------------------------------------*/

/* Function declarations -----------------------------------------------------*/

/* Function definitions ------------------------------------------------------*/

/**

* @brief Start measure time.

* @param None.

* @return None.

*/

__STATIC_INLINE void MeasureTimeStart(void)

{

SysTick-》CTRL |= SysTick_CLKSource_HCLK; /* Set the SysTick clock source. */

SysTick-》LOAD = 0xFFFFFF; /* Time load (SysTick-》 LOAD is 24bit)。 */

SysTick-》VAL = 0xFFFFFF; /* Empty the counter value. */

SysTick-》CTRL |= SysTick_CTRL_ENABLE_Msk; /* Start the countdown. */

__nop(); /* Waiting for a machine cycle. */

}

/**

* @brief Stop measure time.

* @param [in] clock: System clock frequency(unit: MHz)。

* @return Program run time(unit: us)。

*/

__STATIC_INLINE double MeasureTimeStop(uint32_t clock)

{

uint32_t count = SysTick-》VAL; /* Read the counter value. */

SysTick-》CTRL &= ~SysTick_CTRL_ENABLE_Msk; /* Close counter. */

double time = 0.0;

if(clock 》 0)

{

time = (double)(0xFFFFFF - count) / (double)clock; /* Calculate program run time. */

}

return time;

}

#ifdef __cplusplus

}

#endif

#endif /* __MEASURETIME_H */

main.c文件

[cpp] view plain copy/**

******************************************************************************

* @file main.c

* @author XinLi

* @version v1.0

* @date 24-October-2017

* @brief Main program body.

******************************************************************************

* @attention

*

* 《h2》《center》Copyright ? 2017 XinLi《/center》《/h2》

*

* This program is free software: you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by

* the Free Software Foundation, either version 3 of the License, or

* (at your option) any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program. If not, see 《https://www.gnu.org/licenses/》。

*

******************************************************************************

*/

/* Header includes -----------------------------------------------------------*/

#include “main.h”

#include “MeasureTime.h”

/* Macro definitions ---------------------------------------------------------*/

/* Type definitions ----------------------------------------------------------*/

/* Variable declarations -----------------------------------------------------*/

/* Variable definitions ------------------------------------------------------*/

static __IO double runTime = 0.0;

/* Function declarations -----------------------------------------------------*/

__STATIC_INLINE void delay_1us(void);

/* Function definitions ------------------------------------------------------*/

/**

* @brief Main program.

* @param None.

* @return None.

*/

int main(void)

{

for(;;)

{

MeasureTimeStart();

delay_1us();

runTime = MeasureTimeStop(84);

}

}

/**

* @brief One microsecond delay.

* @param None.

* @return None.

*/

__STATIC_INLINE void delay_1us(void)

{

__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

__nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop();

__nop(); __nop(); __nop(); __nop();

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    194

    瀏覽量

    28060
  • Systick
    +關(guān)注

    關(guān)注

    0

    文章

    62

    瀏覽量

    13094
收藏 人收藏

    評論

    相關(guān)推薦

    如何縮短Vivado的運(yùn)行時間

    在Vivado Implementation階段,有時是有必要分析一下什么原因?qū)е?b class='flag-5'>運(yùn)行時間(runtime)過長,從而找到一些方法來縮短運(yùn)行時間。
    的頭像 發(fā)表于 05-29 14:37 ?1.4w次閱讀
    如何縮短Vivado的<b class='flag-5'>運(yùn)行時間</b>

    獲取單片機(jī)運(yùn)行時間

    測試代碼的運(yùn)行時間的兩種方法 使用單片機(jī)內(nèi)部定時器,在待測程序段的開始啟動定時器,在待測程序段的結(jié)尾關(guān)閉定時器。為了測量的準(zhǔn)確性,要進(jìn)行多次測量
    的頭像 發(fā)表于 08-26 20:26 ?1861次閱讀
    獲取單片機(jī)<b class='flag-5'>運(yùn)行時間</b>

    請問6747如何測量代碼運(yùn)行時間?

    1. 我想用片上的硬件定時器的方法測量代碼運(yùn)行時間,使用timer,加頭文件:csl_timer.h,但是6747沒有csl,我下載了6747的cslr package,發(fā)現(xiàn)里面也沒有
    發(fā)表于 07-28 10:25

    請問stm32如何利用通用定時器實現(xiàn)函數(shù)運(yùn)行時間精確測量?

    請問stm32如何利用通用定時器實現(xiàn)函數(shù)運(yùn)行時間精確測量?
    發(fā)表于 12-01 07:58

    測量嵌入式軟件運(yùn)行時間的方法

    關(guān)注、星標(biāo)公眾號,不錯過精彩內(nèi)容整理:黃工素材來源:最后一個Bug程序運(yùn)行時間,對一個系統(tǒng)比較重要。有的地方要求精確延時Nus,有的地方要求程序運(yùn)行時間不能超過Nus。所以,今天給大
    發(fā)表于 12-21 08:21

    介紹幾種測量單片機(jī)程序運(yùn)行時間的方法

      有時我們需要知道自己的單片機(jī)程序需要花費(fèi)多長時間,delay延時的精確時間等。今天來介紹幾種測量程序運(yùn)行時間的方法?! ?.單片機(jī)內(nèi)部定
    發(fā)表于 03-23 14:55

    C語言教程之顯示程序運(yùn)行時間

    C語言教程之顯示程序運(yùn)行時間,很好的C語言資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-25 16:09 ?0次下載

    基于STM32單片機(jī)通過使用宏assert_param來實現(xiàn)運(yùn)行時間檢測

    固件函數(shù)庫通過檢查庫函書的輸入來實現(xiàn)運(yùn)行時間錯誤偵測。通過使用宏assert_param來實現(xiàn)運(yùn)行時間檢測。所有要求輸入?yún)?shù)的函數(shù)都使用這個宏。它可以檢查輸入?yún)?shù)是否在允許的范圍之內(nèi)。
    發(fā)表于 10-22 15:12 ?1451次閱讀
    基于STM32單片機(jī)通過使用宏assert_param來<b class='flag-5'>實現(xiàn)</b><b class='flag-5'>運(yùn)行時間</b>檢測

    電機(jī)運(yùn)行時間進(jìn)行排列 是分為兩個部分來完成這個程序的設(shè)計的

    前幾天有個學(xué)員咨詢一個程序設(shè)計的問題,程序的控制要求如下:需要控制5臺電機(jī)的運(yùn)行,每臺電機(jī)運(yùn)行時需要記錄運(yùn)行時間,電機(jī)啟動
    的頭像 發(fā)表于 07-19 08:57 ?7203次閱讀
    電機(jī)<b class='flag-5'>運(yùn)行時間</b>進(jìn)行排列 是分為兩個部分來完成這個<b class='flag-5'>程序</b>的設(shè)計的

    如何高效測量ECU的運(yùn)行時間

    ,最終可能會引起運(yùn)行時間方面的問題。這在項目后期需要大量的時間和金錢來解決。如果不能掌握系統(tǒng)的運(yùn)行狀態(tài),則很難發(fā)現(xiàn)系統(tǒng)內(nèi)缺陷的根源。 解決方案 將TA軟件工具套件與VX1000測量標(biāo)定
    的頭像 發(fā)表于 10-28 11:05 ?2229次閱讀

    淺析STM32代碼運(yùn)行時間的技巧

    前言 ????測試代碼的運(yùn)行時間的兩種方法: 使用單片機(jī)內(nèi)部定時器,在待測程序段的開始啟動定時器,在待測程序段的結(jié)尾關(guān)閉定時器。為了測量的準(zhǔn)確性,要進(jìn)行多次
    的頭像 發(fā)表于 11-09 09:52 ?3886次閱讀
    淺析STM32代碼<b class='flag-5'>運(yùn)行時間</b>的技巧

    幾種測量程序運(yùn)行時間的方法

    如果你的程序沒有多余的定時器可用,那么可以借助外部工具來測量。在待測程序開始時將一個GPIO置高,在待測程序結(jié)束時將GPIO置低。用示波器或者其他設(shè)備
    發(fā)表于 08-03 14:35 ?3300次閱讀

    AN021 測量MCU代碼運(yùn)行時間的幾種方法

    AN021 測量MCU代碼運(yùn)行時間的幾種方法
    發(fā)表于 02-27 18:23 ?0次下載
    AN021 <b class='flag-5'>測量</b>MCU代碼<b class='flag-5'>運(yùn)行時間</b>的幾種方法

    ch32v307記錄程序運(yùn)行時間

    ch32v307記錄程序運(yùn)行時間程序開發(fā)中,很重要的一項任務(wù)就是對程序運(yùn)行時間進(jìn)行評估。對于大型的
    的頭像 發(fā)表于 08-22 15:53 ?908次閱讀

    三菱plc累計運(yùn)行時間怎么編程

    具有重要意義。本文將詳細(xì)介紹如何使用三菱PLC編程實現(xiàn)累計運(yùn)行時間的統(tǒng)計功能。 一、概述 累計運(yùn)行時間是指設(shè)備或系統(tǒng)在一定時間內(nèi)的總運(yùn)行時間
    的頭像 發(fā)表于 06-20 11:31 ?2309次閱讀