单片机系统的运行时间如何获取?

💡 原文中文,约4800字,阅读约需12分钟。
📝

内容提要

单片机编程者需要了解程序的执行时间、循环周期和延时函数的准确性。测试代码执行时间的两种方法:利用单片机内部定时器和示波器。示例展示了在STM32平台上使用这两种方法测试代码执行时间的过程。推荐使用示波器方法。

🔎

延伸解读

两种测量方法的适用场景

文章对比了定时器与示波器两种测量代码执行时间的方法。定时器方法需在代码中插入测试逻辑,可能干扰原程序运行,且结果需通过调试界面查看,操作较复杂;示波器方法仅需操作GPIO电平,几乎不增加代码量,测量直观可靠。因此,对于实时性要求高、代码段较短的场景,示波器方法更合适;若需测量较长时间(如超过1秒),定时器方法因计时范围大而更具优势。

测量误差的来源与解读

从示波器实例可见,Delay_us(1)实测约2.2us,Delay_us(10)实测约11.4us,均比理论值偏大。这提示测量结果包含了函数调用、GPIO翻转等额外开销,并非纯粹延时。读者在评估延时函数精度时,应关注实际执行时间与理论值的偏差,而非仅看标称参数。多次测量取平均值可减少随机误差,但系统开销带来的固定偏差仍需留意。

定时器方法的实现要点

使用定时器方法时,文章以STM32定时器2为例,将定时周期设为1us,通过读取更新标志判断延时结束。测量时需借助调试器观察变量,如TimeWidthAvrage,再根据系统时钟换算实际时间。该方法的关键在于正确初始化定时器并处理计数溢出,同时注意测试代码可能影响原程序时序。若需输出结果,可自行添加串口打印,但并非必需。

❓

Q&A

单片机编程中,测量代码执行时间有哪两种常用方法?

一种是利用单片机内部定时器,在待测程序段开始时启动定时器,结束时关闭,多次测量取平均值;另一种是利用示波器,在程序段开始和结束时通过GPIO输出高低电平,用示波器测量高电平持续时间。

为什么推荐使用示波器方法来测量代码执行时间?

示波器方法操作简单,在原代码基础上几乎没有增加代码,测试可靠性很高。而定时器方法操作复杂,可能影响原代码工作,可靠性相对较低。

在STM32平台上,如何使用示波器方法测量Delay_us函数的执行时间?

在待测代码前后控制GPIO输出高电平和低电平,用示波器观察高电平持续时间。例如,在main函数中先拉高GPIO,调用Delay_us,再拉低GPIO,通过示波器测量高电平时间即可得到执行时间。

使用定时器方法测量代码执行时间时,如何查看测量结果?

在调试界面中将保存时间的变量(如Time)添加到Watch窗口,全速运行程序后观察变量变化,其中TimeWidthAvrage即为最终结果。例如,TimeWidthAvrage为72120,对应时间72120*1/72M秒,即1ms。

示波器方法测量代码执行时间有什么局限性?

由于示波器的显示能力有限,超过1秒以上的程序段计时效果不理想。但通常单片机程序实时性要求高,很少出现秒级以上的程序段。

定时器方法测量代码执行时间的最大计时长度是多少?

由于使用32位变量保存systick计数次数,最大计时长度为2^32/72M ≈ 59.65秒。

🏷️

标签

➡️

继续阅读