如何限制时间 Linux 采取行动?

How to restrict time Linux takes for an action?

问题可能看起来很模糊,因为很难用一行来描述一个问题,所以就这样吧。 我在 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 左右。

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

如果您不介意没有网络连接,您可以尝试的一种方法是提高您的进程优先级并关闭您的 wifi 和 eth 接口。我想说,这些是异步中断的主要来源,它们最终可能会中断您的流程执行。还会有其他中断不断触发,您可以查看 /proc/interrupts 和 /proc/softirq 以了解中断触发,但在像 raspberry pi 这样的平台中,它们应该是周期性的(计时器)或者它们的寿命很短(例如 USB 中断)不应该导致您的过程滞后,大约几毫秒。