
Rollover safe timer (tick) comparisons我在硬件中有一个计数器,出于时序考虑,我可以观察一下。 它以毫秒为单位,并以16位无符号值存储。 如何安全检查计时器值是否已过一定时间并安全处理不可避免的翻转:
当ms_timer溢出到0时,此代码将失败。
您实际上不需要在这里做任何事情。假设 (还假设计时器在两次检查之间不会两次溢出...) 要说服自己,请尝试以下测试:
在这种情况下,我经常像下面那样编写代码。
我使用此代码通过签名比较来说明该错误和可能的解决方案。
样本输出:
这似乎适用于最大64k / 2的间隔,这适合我:
利用带符号整数的性质。 (补码) 避免该问题的最安全方法可能是使用带符号的32位值。使用您的示例:
只需检查ms_timer
编辑:如果可能的话,您还需要最多一个uint32。
我发现使用其他计时器API更适合我。我创建了一个具有两个API调用的计时器模块:
计时器索引也在计时器头文件中定义:
我将unsigned long int用于我的计时器计数器(32位),因为那是我的硬件平台上的本机大小的整数,这使我经过的时间从1毫秒变为大约49.7天。您可能具有16位的计时器,这将使您经过的时间从1毫秒到大约65秒。
计时器计数器是一个数组,由硬件计时器递增(中断,任务或计数器值的轮询)。在处理无翻转计时器增量的函数中,可以将它们限制为数据类型的最大值。
然后您的代码变为:
有时我会这样:
|