如何在Linux中提高1ms定时器的实时性能?

如何在Linux中提高1ms定时器的实时性能?,linux,timer,embedded,real-time,preempt-rt,Linux,Timer,Embedded,Real Time,Preempt Rt,我正在做一个嵌入式Linux项目,使用arago发行版,大概是3.3版左右 我已经配置了一个高分辨率的Linux定时器,以每毫秒唤醒我的进程一次。这工作正常,但计时有两个问题: 唤醒时间的抖动 唤醒时处理时间的变化,尽管该过程所做的处理是恒定的 我将这些问题归因于Linux的实时性差。但我需要 研究提高实时性能的方法 我已经检查过内核是否配置了CONFIG_PREEMPT内核选项,这有利于实时性 我还将SCHED_FIFO调度类应用于我的流程: struct sched_param schedp

我正在做一个嵌入式Linux项目,使用arago发行版,大概是3.3版左右

我已经配置了一个高分辨率的Linux定时器,以每毫秒唤醒我的进程一次。这工作正常,但计时有两个问题:

  • 唤醒时间的抖动
  • 唤醒时处理时间的变化,尽管该过程所做的处理是恒定的
  • 我将这些问题归因于Linux的实时性差。但我需要 研究提高实时性能的方法

    我已经检查过内核是否配置了CONFIG_PREEMPT内核选项,这有利于实时性

    我还将SCHED_FIFO调度类应用于我的流程:

    struct sched_param schedparm;
    memset(&schedparm, 0, sizeof(schedparm));
    schedparm.sched_priority = 1; // lowest rt priority
    sched_setscheduler(0, SCHED_FIFO, &schedparm);
    
    但这没什么区别

    我想一个合理的步骤是将抢占补丁应用到内核构建中,但我还没有确定如何做到这一点

    我还能做些什么来改善抖动/持续时间的可变性吗


    或者有人能推荐一个关于如何应用PREEMPT\u-RT补丁的可访问教程吗?

    看来PREEMPT\u-RT是合乎逻辑的下一步。你试过这个教程吗

    更新:我建议您看看其他人是如何构建抢占式内核的,例如:


    您可以阅读PKGBUILD以了解所做的工作。

    如果您使用Debian测试或LMDE,他们在x86和amd64体系结构的repo中有一个预编译的抢占内核

    apt-get install linux-image-rt-686-pae
    


    如果我错了,请纠正我,但时钟永远不能绝对精确到一毫秒。时钟所依赖的基本频率不是1ms频率的干净倍数,因此一定存在抖动。这是迫在眉睫的。处理步骤的持续时间相同。我得说,标准计算机不适合这样的精度,这不是它们的用途。你将不得不使用一个特殊的电路来完成这些任务。我不同意,Linux高分辨率定时器的分辨率是1ns。当然,我不希望这样的准确性,但我认为我应该能够改进我所看到的。@user176:你是如何解决这个问题的。就连我现在也面临同样的问题?如果您已经解决了问题,请更新答案。请看下面的问题:这里有很多问题没有回答。你在哪个站台上跑步?Linux可用计时器的质量非常重要。你在做什么?你是如何测量抖动的?我对抢占补丁相当困惑。我读到补丁从2.6版开始就包含在内核中。我使用的是Linux3.3。这是否意味着它已经包含了补丁?我是否仍然需要使用选项CONFIG\u PREEMPT\u RT=y构建内核?如果包含补丁,则不需要应用补丁,但是“从2.6开始”没有意义。其次,您需要设置CONFIG\u PREEMPT\u RT=y。我坚信发行版使用的默认内核配置没有使用这样的选项进行编译。您可以检查发行版使用的配置。它是内核包的一部分,有时是内核src包的一部分。另请参阅我的最新答案。
    apt-get install linux-image-rt-amd64