C 在Linux中获得更精确的定时控制
我正在尝试为数字电视创建一个低抖动多播源。有问题的程序应该缓冲输入,根据流中的PCR值计算预期时间,然后以相对精确的间隔发送数据包。但是,这并不是在RTOS上运行的,因此预计会出现一些时间差异 这是基本代码(相关变量已初始化,我在这里省略了代码): 但是,这会导致发送速度太慢(因为有些处理也需要时间),因此缓冲区会被填满。所以,我想我应该得到“睡眠时间”(应该是的时间)和“缩短时间”(实际时间)之间的差值,然后从未来的“等待时间”中减去它。这几乎可以工作,但现在有点太快了,现在我得到了一个空的缓冲区 我的下一个想法是将差值乘以某个值,然后再减去它,就像这样(就在“while…”上面):C 在Linux中获得更精确的定时控制,c,linux,timing,C,Linux,Timing,我正在尝试为数字电视创建一个低抖动多播源。有问题的程序应该缓冲输入,根据流中的PCR值计算预期时间,然后以相对精确的间隔发送数据包。但是,这并不是在RTOS上运行的,因此预计会出现一些时间差异 这是基本代码(相关变量已初始化,我在这里省略了代码): 但是,这会导致发送速度太慢(因为有些处理也需要时间),因此缓冲区会被填满。所以,我想我应该得到“睡眠时间”(应该是的时间)和“缩短时间”(实际时间)之间的差值,然后从未来的“等待时间”中减去它。这几乎可以工作,但现在有点太快了,现在我得到了一个空的缓
difn=curtime.tv\u nsec-ostime.tv\u nsec;
if(difn)您可以使用计时器安排输出,并反转过程:立即执行输出计时器触发器,然后再执行下一次触发的处理。@user3528438,我将尝试此操作,谢谢。有时我需要将计时器设置为不同的值,但希望在发送数据包后立即执行此操作。
while (!sendstop) {
//snip
//put 7 MPEG packets in one UDP packet buffer "outpkt"
//snip
waittime = //calculate from PCR values - value is in microseconds
//waittime is in the order of 2000 -> 2ms
sleeptime=curtime;
sleeptime.tv_nsec += waittime * 1000L;
sleeptime.tv_sec += sleeptime.tv_nsec / 1000000000;
sleeptime.tv_nsec %= 1000000000;
while (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &sleeptime, NULL) && errno == EINTR) {
printf("I");
}
sendto(sck,outpkt,1316,0,res->ai_addr,res->ai_addrlen); //send the packet
clock_gettime(CLOCK_MONOTONIC,&curtime);
}
difn=curtime.tv_nsec-ostime.tv_nsec;
if (difn<0) difn+=1000000000;
sleeptime.tv_nsec = sleeptime.tv_nsec-(difn*difnc)/1000; //difnc - adjustment
if (sleeptime.tv_nsec<0) {
sleeptime.tv_nsec+=1000000000;
sleeptime.tv_sec--;
}