0%

在高频定制内核下使用睡眠和忙等待结合实现精确定时

使用忙等待和睡眠结合实现节约CPU的同时保证精确定时

  • 单纯使用忙等待可以实现较高精度的定时,但是会导致CPU占用率升高,因此需要将忙等待和睡眠结合,让出CPU给其他进程使用,需要的时候再上处理机运行
  • 代码
    void* threadRT(void*)
    {
    // setThreadRT(98);
    FILE* fp;
    fp = fopen("log.txt", "w");
    uint64_t prev = get_us();
    uint64_t cur;
    while(1)
    {
    usleep(1500);
    while(get_us() - prev < 2500UL){}
    cur = get_us();
    fprintf(fp, "%lu,", cur-prev);
    prev = cur;
    }
    }
  • 将线程设置为实时线程

    纯忙等测试

    • 除了小部分误差很大的极端位置之外,运行时间极为稳定
    • picture 8
    • 大部分误差在50000微秒左右
    • 将上述位置除去之后,发现剩余的时间几乎不发生任何变化
    • picture 9
  • 推测是是实时线程的sched_rt_runtime_us设置为950000导致的
  • sched_rt_runtime_us设置为1000000之后,测试结果十分稳定
    • picture 12
    • picture 13

引入usleep节省CPU占用

  • usleep设置为1500的情况

    • picture 10
    • 可见误差最大不超过1微秒
  • usleep设置为2000

    • picture 11
    • 可见误差最大不超过2微秒
    • 而且在1600次测试中只发生了不超过三次
  • 注意上述测试不能在虚拟机完成,必须在物理机完成

  • 使用VMWare安装可插拔物理机教程

不设置为实时线程的情况

  • 不设置为实时线程的时候,线程大体定时是准确的,但是容易受到外界打扰,外界有操作的时候会导致进程延迟
  • picture 14