目前,我正在开发一个嵌入式项目,其中大多数子系统都基于时序.
我已经搜索了许多解决方案,以避免计时器翻滚的问题,但有一件事仍然困扰我.
目前,我正在使用这样的无符号长度的二进制补码.
ulong t1 = tick of last event;
ulong t2 = current tick;
if ( t2 - t1 >= limit ){
do something
}
Run Code Online (Sandbox Code Playgroud)
其他人建议,有必要将t2-t1的结果转换为已签名的实体,然后才能生效,但我无法理解为什么.还有其他任何见解或建议吗?
如果在概念上保证t2
始终大于t1
,则转换为签名实体将是错误的。标准保证无符号整数的算术是正确的模,因此当计算为s 时,UTYPE_MAX + 1
差值t2 - t1
将是正确的模。当转换为签名实体时,如果该值无法在目标类型中表示,则行为是实现定义的。通常这会将大的正值转换为负值。ULONG_MAX + 1
unsigned long
考试
if ( t2 - t1 >= limit ){
Run Code Online (Sandbox Code Playgroud)
如果当前滴答计数与前一个未包装定时器的滴答计数之间的差异大于 ,则会崩溃ULONG_MAX
,但否则它会起作用。
但如果t2
可以早于t1
,则真正的差异t2 - t1
将为负数,但作为unsigned long
,它将是一个潜在的大正数。然后,在使用无符号类型无法正常工作的情况下,转换为有符号类型可以正常工作。