如何限制Linux执行操作的时间?

时间:2015-03-15 14:38:04

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

问题看起来很模糊,因为很难在一行中描述问题,所以就这样了。 我在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的计算不正确。看起来像这样。 enter image description here

我很乐意回答如何将raspoded移近实时系统。

修改

谢谢,anaken78以及任何帮助过的人。使用RR_FIFO计划工作完美,处理速度始终为380-400hz。 enter image description here

1 个答案:

答案 0 :(得分:2)

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

如果您没有网络连接,那么您可以尝试的一件事就是提高您的流程优先级并关闭您的wifi和eth接口。我想说,这些是异步中断的主要来源,最终可能会破坏您的流程执行。将会有其他中断继续触发,你可以查看/ proc / interrupts和/ proc / softirq以了解中断触发,但在像raspberry pi这样的平台中,它们应该是priodic(定时器)或者它们将非常短暂的(例如USB中断)不应该在你的过程中造成滞后,大约几毫秒。