×

简析获取单片机代码运行时间的方法资料下载

消耗积分:3 | 格式:pdf | 大小:106.14KB | 2021-04-24

分享资料个

单片机编程者需要知道自己的程序需要花费多长时间、while周期是多少、delay延时是否真如函数功能描述那样精确延时。很多时候,我们想知道这些参数,但是由于懒惰或者没有简单的办法,将这件事推到“明天”。笔者提出了一种简便的测试方法,可以解决这些问题。测试代码的运行时间的思路:使用单片机内部定时器,在待测程序段的开始启动定时器,在待测程序段的结尾关闭定时器。为了测量的准确性,要进行多次测量,并进行平均取值。借助示波器的方法是:在待测程序段的开始阶段使单片机的一个GPIO输出高电平,在待测程序段的结尾阶段再令这个GPIO输出低电平。用示波器通过检查高电平的时间长度,就知道了这段代码的运行时间。显然,借助于示波器的方法更为简便。以下内容为这两种方案的实例,以STM32为测试平台。如果读者是在另外的硬件平台上测试,实际也不难,思路都是一样的,自己可以编写对应的测试代码。借助示波器方法的实例Delay_us函数使用STM32系统滴答定时器实现#include "systick.h"/* SystemFrequency / 1000 1ms中断一次* SystemFrequency / 100000 10us中断一次* SystemFrequency / 1000000 1us中断一次*/#define SYSTICKPERIOD 0.000001#define SYSTICKFREQUENCY (1/SYSTICKPERIOD)/*** @brief 读取SysTick的状态位COUNTFLAG* @param 无* @retval The new state of USART_FLAG (SET or RESET).*/static FlagStatus SysTick_GetFlagStatus(void){if(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk){return SET;}else{return RESET;}}/*** @brief 配置系统滴答定时器 SysTick* @param 无* @retval 1 = faiLED, 0 = successful*/uint32_t SysTick_Init(void){/* 设置定时周期为1us */if (SysTick_Config(SystemCoreClock / SYSTICKFREQUENCY)){/* Capture error */return (1);}/* 关闭滴答定时器且禁止中断 */SysTick->CTRL &= ~ (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);return (0);}/*** @brief us延时程序,10us为一个单位* @param* @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us* @retval 无*/void Delay_us(__IO uint32_t nTime){/* 清零计数器并使能滴答定时器 */SysTick->VAL = 0;SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;for( ; nTime > 0 ; nTime--){/* 等待一个延时单位的结束 */while(SysTick_GetFlagStatus() != SET);}/* 关闭滴答定时器 */SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;}检验Delay_us执行时间中用到的GPIO(gpio.h、gpio.c)的配置#ifndef __GPIO_H#define __GPIO_H#include "stm32f10x.h"#define LOW 0#define HIGH 1/* 带参宏,可以像内联函数一样使用 */#define TX(a) if (a) \GPIO_SetBits(GPIOB,GPIO_Pin_0);\else \GPIO_ResetBits(GPIOB,GPIO_Pin_0)void GPIO_Config(void);#endif#include "gpio.h"/*** @brief 初始化GPIO* @param 无* @retval 无*/void GPIO_Config(void){/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启LED的外设时钟*/RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);}在main函数中检验Delay_us的执行时间#include "systick.h"#include "gpio.h"/**

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !