C 在Linux中获得更精确的定时控制

C 在Linux中获得更精确的定时控制,c,linux,timing,C,Linux,Timing,我正在尝试为数字电视创建一个低抖动多播源。有问题的程序应该缓冲输入,根据流中的PCR值计算预期时间,然后以相对精确的间隔发送数据包。但是,这并不是在RTOS上运行的,因此预计会出现一些时间差异 这是基本代码(相关变量已初始化,我在这里省略了代码): 但是,这会导致发送速度太慢(因为有些处理也需要时间),因此缓冲区会被填满。所以,我想我应该得到“睡眠时间”(应该是的时间)和“缩短时间”(实际时间)之间的差值,然后从未来的“等待时间”中减去它。这几乎可以工作,但现在有点太快了,现在我得到了一个空的缓

我正在尝试为数字电视创建一个低抖动多播源。有问题的程序应该缓冲输入,根据流中的PCR值计算预期时间,然后以相对精确的间隔发送数据包。但是,这并不是在RTOS上运行的,因此预计会出现一些时间差异

这是基本代码(相关变量已初始化,我在这里省略了代码):

但是,这会导致发送速度太慢(因为有些处理也需要时间),因此缓冲区会被填满。所以,我想我应该得到“睡眠时间”(应该是的时间)和“缩短时间”(实际时间)之间的差值,然后从未来的“等待时间”中减去它。这几乎可以工作,但现在有点太快了,现在我得到了一个空的缓冲区

我的下一个想法是将差值乘以某个值,然后再减去它,就像这样(就在“while…”上面):

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--;
   }