提问人:leonp 提问时间:1/24/2019 最后编辑:Paulo Mattosleonp 更新时间:2/3/2019 访问量:359
为什么 Linux“系统”线程阻止我的 RT 线程工作?
Why Linux "system" thread prevent my RT thread from working?
问:
我在 DM8148 和 TI Linux 上的 Linux 2.6.37 下运行了一些数据采集应用程序。我有两个线程:
名为 IDE 的线程,计划为 SCHED_RR,prio 114 (75),它从硬件 FIFO 收集数据,每 2 毫秒到达 30MiB 环形缓冲区,速度为 200KiB/s:
while(1) { sleep(ms); while(DataInFIFO) { CollectToRingBuffer(); SignalToWriter(); } }
线程 WriterIDE,计划为 SCHED_RR, prio 113 (74),将此环形缓冲区写入 USB 磁盘密钥。
while(1) { WaitForSignal(); writeToFileOnDOK(); }
我从功能测量中知道,有时这种 USB 写入可能会“挂起”大约 1.5 秒甚至 2 秒,试图写入 DOK。但我确信,当我给收集器任务 30MiB 时,这足以满足 150 秒的需求,一切都会好起来的。write()
不!事实并非如此!
我把时间测量代码。我看到的是,当写入器长时间挂起(f.e.1342ms)时,进入收集器线程的时间也非常大(306ms)。这会导致硬件 FIFO 溢出和数据不一致。
我检查了系统中线程优先级的分布(ps 命令) - 除了我之外,没有什么是实时的。所有系统任务都调度为 OTHER(ps 输出中的 TS),甚至内核 USB 线程。只有 IRQ 任务是 FF,但即使是它们的优先级也较低。
我不知道该何去何从... :-(
答: 暂无答案
评论