【问题标题】:Fixed time error between two continuous time points固定两个连续时间点之间的时间误差
【发布时间】:2020-10-23 05:04:16
【问题描述】:

以下代码周期性地休眠到预期时间点(ts),并立即获取系统时间(tm2)。为什么tstm2之间存在固定时间误差(~52us),因为两个时间点相邻。

运行环境是实时打补丁的linux,如果我改变周期性时间间隔的大小,固定时间误差几乎没有变化。

#include <time.h> 
#include <string.h> 
#include <stdio.h> 
#include <stdlib.h> 
  
#define US 100         /* sleep US micro-seconds */
#define LOOP 20 
  
double delayed[LOOP]; 
  
int main(void) 
{ 
    int loop = 0; 
    struct timespec tm1, tm2, tm2_old; 
    struct timespec ts; 
  
    clock_gettime(CLOCK_MONOTONIC, &tm1); 
    ts.tv_sec   = tm1.tv_sec; 
    ts.tv_nsec  = tm1.tv_nsec; 
  
    while(1){ 
        ts.tv_nsec  = ts.tv_nsec + US * 1000L; 
        ts.tv_sec   = ts.tv_sec + (ts.tv_nsec)/1000000000L; 
        ts.tv_nsec  = (ts.tv_nsec)%1000000000; 
  
        clock_gettime(CLOCK_MONOTONIC, &tm1); 
        clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &ts, NULL); 
        clock_gettime(CLOCK_MONOTONIC, &tm2); 
  
        delayed[loop] = (tm2.tv_sec-ts.tv_sec)*1000000.0 + \ 
                (tm2.tv_nsec - ts.tv_nsec)/1000.0; 
        ++loop; 
        if(loop >= LOOP) break; 
    } 
    for(int ii=0; ii<LOOP; ++ii){ 
        printf("delayed %4.2f\n", delayed[ii]); 
    } 
}

运行结果:

 delayed 55.62 
 delayed 53.02 
 delayed 52.47 
 delayed 52.30 
 delayed 52.25 
 delayed 52.32 
 delayed 52.30 
 delayed 52.45 
 delayed 52.28 
 delayed 52.29 
 delayed 52.16 
 delayed 52.16 
 delayed 52.19 
 delayed 52.28 
 delayed 52.26 
 delayed 52.23 
 delayed 52.24 
 delayed 52.26 
 delayed 52.32 
 delayed 52.15

【问题讨论】:

    标签: timer sleep gettime time-measurement


    【解决方案1】:

    timerslack 在 Linux 内核 4.6 中引入,用于对 CPU 功耗的定时器到期进行分组。

    内核使用“当前”定时器松弛来对定时器进行分组 调用线程的到期时间接近 1 其他;因此,线程的计时器到期 可能迟到指定的纳秒数(但 永远不会提前到期)。分组计时器到期可以提供帮助 通过最大限度地减少 CPU 唤醒来降低系统功耗。

    引用自Prctl Linux manual

    用户可以通过编辑文件/proc/{self}/timerslack_ns来更改timerslack的值。

    【讨论】:

      猜你喜欢
      • 2017-02-14
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2013-12-29
      • 1970-01-01
      相关资源
      最近更新 更多