我有一个在Linux上运行的小程序(在嵌入式PC上,双核Intel Atom 1.6GHz,Debian 6运行Linux 2.6.32-5),它通过FTDI USB转串口转换器与外部硬件通信(使用ftdi_sio
内核模块和/dev/ttyUSB*
设备)。基本上,在我的主循环中我运行
clock_gettime()
使用CLOCK_MONOTONIC
select()
,超时时间为8毫秒clock_gettime()
clock_gettime()
来电的时差要获得某种程度的“软”实时保证,此线程将以SCHED_FIFO
的最高优先级运行(在top
中显示为“RT”)。它是系统中唯一以此优先级运行的线程,没有其他进程具有此类优先级。我的进程有另一个SCHED_FIFO
线程,优先级较低,而其他所有线程都在SCHED_OTHER
。这两个“实时”线程不受CPU限制,除了等待I / O和传递数据之外几乎没有。
我使用的内核没有RT_PREEMPT补丁(我将来可能会切换到该补丁)。我知道如果我想要“正确”实时,我需要切换到RT_PREEMPT,或者更好的是Xenomai等。但是,我想知道“vanilla”内核的后续时序异常背后的原因:
select()
次呼叫的时间超过10毫秒(请记住,超时时间为8毫秒)。cron.daily
的事实)。所以,我的问题是:在这种极端情况下,可以参与哪些因素?这只是Linux内核本身可能发生的事情,即我有切换到RT_PREEMPT,甚至是非USB接口和Xenomai,以获得更可靠的保证吗? /proc/sys/kernel/sched_rt_runtime_us
可能会咬我吗?还有其他因素我可能错过了吗?
提出这个问题的另一种方法是,如果没有切换到“更难”的实时环境,我还能做些什么来减少这些延迟异常?
更新:我观察到一个新的,“最糟糕的情况”,大约118.4毫秒(一次超过总共大约2500万select()
次呼叫)。即使我没有使用具有任何实时扩展的内核,我也有点担心截止日期显然会超过十分之一秒。
答案 0 :(得分:2)
如果没有更多信息,很难指出具体的内容,所以我只是在猜测:
sched_rt_period_us
和sched_rt_period_us
如果设置为合理的值并且代码的行为符合您的预期,则不应该成为问题。不过,我会删除RT线程的限制,看看会发生什么。
你还能做什么?写一个设备驱动程序!这并不困难,中断处理程序比实时线程获得更高的优先级。切换到实时内核可能更容易,但YMMV。