【问题标题】:How to restrict time Linux takes for an action?如何限制 Linux 采取行动的时间?
【发布时间】:2015-05-17 16:21:50
【问题描述】:

问题可能看起来很模糊,因为很难在一行中描述一个问题,所以在这里。 我在 Raspberry Pi 上使用 Debian 来运行 PID 调节器,这意味着每次计算 PID 输出时都会获得 dt(循环执行之间的时间差)。 基本上dt是这样计算的。

    oldtime_ = time_;
    clock_gettime(CLOCK_MONOTONIC, &time_);
    Timer.dt = ((static_cast<int64_t>(time_.tv_sec) * 1000000000 + static_cast<int64_t>(time_.tv_nsec)) - (static_cast<int64_t>(oldtime_.tv_sec) * 1000000000 + static_cast<int64_t>(oldtime_.tv_nsec))) / 1000000000.0;

PID 大约每秒更新 400 次,运行良好,但有时 Linux 决定花费更多时间来执行操作。结果是大量的 dt,例如,不是 1/400 = 0.0025,而是 0.8,比需要的多 320 倍。 结果是 PID 计算不正确。看起来像这样。

我很想知道如何让 raspbian 更接近实时系统。

编辑

谢谢,anaken78 和任何帮助过的人。使用 RR_FIFO 调度运行良好,处理速度始终在 380-400hz 左右。

【问题讨论】:

  • 如果您需要高精度、廉价的计时器,我建议直接使用 TSC(如果可用),并将您的进程固定到单核(如果系统是多核)以避免 TSC 歪斜。
  • 到目前为止你尝试过什么?这并不像这个要求是全新的独特的,而且您似乎已经知道要搜索的关键字。另外,是计时器不精确还是调度程序与您的逻辑混淆了?
  • 系统本身是单核的。问题是调度程序搞砸了,所以我不确定直接使用 TSC 是否会有所帮助,但如果直接操作 TSC 会给调度程序更高的优先级,我会尝试一下。正如我所说,对我来说,谷歌的问题看起来很模糊。我尝试过的唯一关键字是“实时”,但我还没有使用过 RTlinux 或实时内核。如果在 debian 周围跳舞没有结果,我会这样做。
  • 我有一个想法,即使用系统信号每 X 纳秒启动一次 PID 处理,但我仍然不确定调度程序是否也不会这样做。
  • Linux 永远不会成为一个成熟的硬实时操作系统,但从去年开始,它有了一个硬 rt 风格的调度类型,SCHED_DEADLINE。对于高精度计时器,您可以查看无滴答内核。基本上,这允许内核随时安排定时器中断,而不是每秒 1000 或 100 次(HZ 的典型值)。顺便说一句,当我上周在香草内核上尝试 nanosleep() 时,我的睡眠时间降至约 60 微秒,而没有使用 tickless。

标签: c++ linux time raspberry-pi real-time


【解决方案1】:

我假设您使用的是原始 Raspberry pi 而不是 Raspberry pi 2。原始 Raspberry pi 的问题在于它使用单核 ARM11 cpu,这实际上意味着任何类型的 RT 计算(您正在做的方式) 必然会因为硬件中断而出现错误。例如,来自 Wifi 的数据包可能会中断您的系统,从而导致问题。

如果您对没有网络连接没有问题,您可以尝试的一种可能的方法是提高您的进程优先级并关闭您的 wifi 和 eth 接口。我想说,这些是异步中断的主要来源,可能最终会破坏您的流程执行。还会有其他持续触发的中断,您可以查看 /proc/interrupts 和 /proc/softirq 以了解触发的中断,但是在像树莓派这样的平台中,它们应该是 priodic(定时器)或者它们会非常短暂的寿命(例如 USB 中断)不应该在您的过程中造成延迟,大约为几毫秒。

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 2018-07-10
    • 2017-06-20
    • 1970-01-01
    • 2011-08-09
    • 2018-04-23
    • 2011-08-29
    • 1970-01-01
    • 2023-01-24
    相关资源
    最近更新 更多