【发布时间】: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