获取单片机运行时间

测试代码的运行时间的两种方法
使用单片机内部定时器,在待测程序段的开始启动定时器,在待测程序段的结尾关闭定时器。为了测量的准确性,要进行多次测量,并进行平均取值。
借助示波器的方法是:在待测程序段的开始阶段使单片机的一个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/** * @brief 主函数 * @param 无 * @retval 无 */int main(void){ gpio_config(); /* 配置systick定时周期为1us */ systick_init(); for(;;) { tx(high); delay_us(1); tx(low); delay_us(100); } } 可见delay_us(100),执行了大概102us,而delay_us(1)执行了2.2us。
更改一下main函数的延时参数:
int main(void){ /* led 端口初始化 */ gpio_config(); /* 配置systick定时周期为1us */ systick_init(); for(;;) { tx(high); delay_us(10); tx(low); delay_us(100); } }示波器的观察结果: 软件测试方法
操作起来复杂,由于在原代码基础上增加了测试代码,可能会影响到原代码的工作,测试可靠性相对较低。由于使用32位的变量保存systick的计数次数,计时的最大长度可以达到2^32/72m = 59.65 s。
示波器方法
操作简单,在原代码基础上几乎没有增加代码,测试可靠性很高。由于示波器的显示能力有限,超过1s以上的程序段,计时效果不是很理想。但是,通常的单片机程序实时性要求很高,一般不会出现程序段时间超过秒级的情况。


华米Q1季度实现营收约10.86亿元,总出货量达760万部
物联网存在巨大可能性, 罗伯特·卡恩将于中国合作建立全球协调的物联网系统
苏州国芯已成功开发43款高性能嵌入式CPU系列
一个深信服AF双向地址转换原理分析与配置案例
不断增加,特斯拉电动皮卡预订量超50万辆
获取单片机运行时间
中国智慧灯杆行业现状、市场竞争格局及产业链分析
5G智慧安防来临会造就哪些领域
罗姆新技术——用手机的“一角”听电话
挖孔屏造型手机的井喷,高通骁龙855手机也许提前亮相
浅谈智能网联有哪些核心技术?
测试测量技术如何保证O-RAN网络的成功部署
XMOS宣布在中国大陆和台湾与威健签署新的地区分销协议
中国电信ATG网络建设步入实质性阶段,2021年实现全国网络覆盖
《关于推进智能网联汽车产业发展的通知》印发
韩国5G有哪些驱动力,中国5G进一步加速的“引擎”在哪
iPhone成为三星与台积电的转折 3nm成为三星赶超最大希望
我国智能锁市场占有率与发达国家相差较大主要有以下原因
Vinci发布比Airpods更加颠覆的最强大的耳机
加密货币未来真会取代黄金吗