gpt4 book ai didi

c - 时间戳比计时器短的同步计时器

转载 作者:行者123 更新时间:2023-11-30 15:09:37 27 4
gpt4 key购买 nike

为什么我有两个设备 A 和 B 都使用 64 位定时器。 1 个刻度等于 1ns。我想同步两个计时器的漂移。我已经知道A和B之间的延迟。通常我会频繁地将A的当前时间发送到B。在B中,我会添加传播延迟并使用该值作为同步B的比较值。在我的情况下,我只能发送每 100ms 定时器的低 32 位。我尝试简单地将 B 的下部替换为 A 的部分,但只有在 32 位没有溢出的情况下才有效。有没有办法检测这种溢出?溢出示例(定时器短路):

定时器B:0x00FF

定时器A:0x010A

=> 0x0A 到 B替换导致定时器 B 0x000A 而不是定时器 B 0x010A。

所以我需要检测 A 中已经发生了 B 中尚未发生的溢出。

下溢示例(短路定时器):

定时器B:0x0205

定时器A:0x01F6

=> 0xF6 => 定时器 B:0x02F6 而不是 0x01F6

在这种情况下,定时器 B 比定时器 A 更快。

最佳答案

这是我用来找出 timera 最接近的可能值的方法,给定timerbtimera的低32位在message ,以及 delay 中的预期传播延迟:

#include <stdint.h>

int64_t expected_timera(const int64_t timerb,
const uint32_t message,
const uint32_t delay)
{
const int64_t timer1 = (timerb / INT64_C(4294967296)) * INT64_C(4294967296)
+ (int64_t)message + (int64_t)delay;
const int64_t timer0 = timer1 - INT64_C(4294967296);
const int64_t timer2 = timer1 + INT64_C(4294967296);

const uint64_t delta0 = timerb - timer0;
const uint64_t delta1 = (timer1 > timerb) ? timer1 - timerb : timerb - timer1;
const uint64_t delta2 = timer2 - timerb;

if (delta0 < delta1)
return (delta0 < delta2) ? timer0 : timer2;
else
return (delta1 <= delta2) ? timer1 : timer2;
}

就我个人而言,我也会计算timerb使用线性调整从实际计时器 B 中得出:

static volatile int64_t real_timer_b;  /* Actual timer b */
static int64_t timerb_real; /* real_timer_b at last sync time */
static int64_t timerb_offset; /* timera at last sync time */
static int32_t timerb_scale; /* Q30 scale factor (0,2) */

static inline int64_t timerb(void)
{
return ((int64_t)(int32_t)(real_timer_b - timerb_real) * (int64_t)timerb_scale) / INT64_C(1073741824) + timerb_offset;
}

timerb_real = 0 , timerb_offset = 0 ,和timerb_scale = 1073741824 , timerb() == real_timer_b .

何时 timera > timerb() ,需要增加timerb_scale 。当timera < timerb() ,你需要减少timerb_scale 。您不想每 100ms 计算一次精确值,因为传播延迟中的抖动将直接影响timerb()。 ;你想慢慢地调整它,在几(几十)秒内。作为奖励,您可以保留 timerb()单调,没有突然向前或向后跳跃。

Network Time Protocol实现的作用非常相似,您可能会在那里找到进一步的实现帮助。

关于c - 时间戳比计时器短的同步计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36571471/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com