如何在系统时间变更时准确测量脚本运行时长?
当系统时间会被GPS等外部源修改时,依赖time.time()这类基于墙钟时间的接口计算时长必然出错,以下是嵌入式场景下可靠的解决方法:
使用系统单调时钟
多数嵌入式Linux(或类Unix系统)都提供了不受墙钟时间影响的单调时钟,它从系统启动开始持续计时,不会因时间同步、手动修改等操作跳变。Python中可以直接用time.monotonic()或time.perf_counter():import time t1 = time.monotonic() # 系统时间被GPS更新(比如从1970-01-01跳转到2022-11-10) t2 = time.monotonic() elapsed = t2 - t1 # 结果完全准确time.perf_counter()精度更高,适合测量短时间间隔;time.monotonic()精度足够满足多数超时功能需求,且兼容性更好。利用硬件定时器/计数器
几乎所有嵌入式设备都配备了独立于操作系统的硬件定时器(比如ARM架构的SysTick、单片机的定时器外设),这类定时器只要设备上电就会持续计数,完全不受系统时间修改的影响。你可以通过对应的硬件驱动或系统接口读取计数器值,结合定时器的时钟频率计算真实运行时长:
比如定时器时钟频率为1MHz(每微秒计数+1),两次读取的计数器差值为count_diff,则时长为count_diff / 1000000秒。时间偏移补偿(兜底方案)
如果上述两种方法都无法实现,可以监听系统时间的修改事件,记录每次时间调整的偏移量。比如GPS同步前读取旧系统时间old_time,同步后读取新系统时间new_time,计算偏移量offset = new_time - old_time。后续计算时长时,需要根据调整发生的时间点,对time.time()的差值进行修正:
假设t1在时间调整前,t2在调整后,那么真实时长为(t2 - t1) - offset。但这种方法需要处理多次时间调整的累计偏移,逻辑复杂且容易出错,仅作为前两种方案的备选。
内容的提问来源于stack exchange,提问作者tfeldmann

