跳至内容

时间戳回绕

tick 差值、回绕次数与超时宏。

正在准备工具…

无符号差值

计数器只有 N 位时,时间差用无符号减法:

Δ=(now−start) mod 2N \Delta=(now-start)\bmod 2^N

只要两次采样之间少于一个回绕周期,Δ\Delta 就是实际经过的 tick 数。32 位、1 kHz 时,回绕周期约为 49.7 天;起始 0xFFFFFF00、当前 0x00000100 的差值为 512 tick,即 0.512 s。

超时比较

超时判断同样使用无符号差值:

(now−start) mod 2N≥timeout (now-start)\bmod 2^N \ge timeout

不要直接比较 now > start,也不要把有符号差值当成时间。timeout 必须小于一个回绕周期,否则判断会失去意义。C 宏返回值使用无符号类型,编译器会在目标位宽上完成截断。

边界

起始和当前时间戳必须落在计数器位宽内,超时 tick 必须为正。页面假设两次采样之间最多发生一次回绕;如果任务可能停顿超过一个完整周期,需要额外的回绕计数或 64 位时间基。