单片机系统的运行时间如何获取?
内容提要
单片机编程者需要了解程序的执行时间、循环周期和延时函数的准确性。测试代码执行时间的两种方法:利用单片机内部定时器和示波器。示例展示了在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秒。