multithreading - 为什么 Linux“系统”线程阻止我的 RT 线程工作?
问题描述
我有一些数据采集应用程序在带有 TI Linux 的 DM8148 上的 Linux 2.6.37 下运行。我有两个线程:
名为 IDE 的线程,调度为 SCHED_RR,优先级 114 (75),每 2ms 从 HW FIFO 以 200KiB/s 的速度收集数据到 30MiB 环形缓冲区:
while(1) { sleep(ms); while(DataInFIFO) { CollectToRingBuffer(); SignalToWriter(); } }
线程 WriterIDE,调度为 SCHED_RR,prio 113 (74),将此环形缓冲区写入 USB 密钥。
while(1) { WaitForSignal(); writeToFileOnDOK(); }
我从write()
功能测量中知道,有时这种 USB 写入可能会“挂起”大约 1.5 甚至 2 秒,试图写入 DOK。但我确信,当我给收集器任务 30MiB,足够 150 秒时,一切都会好起来的。
不!它不是!
我把时间测量代码。我看到的是,当 writer 长时间挂起(fe1342ms)时,进入收集器线程的时间也非常大(306ms)。这会导致硬件 FIFO 溢出和数据不一致。
我检查了系统中线程优先级的分布(ps 命令)——没有什么是实时的,除了我。所有系统任务都安排为 OTHER(ps 输出中的 TS),甚至内核 USB 线程。只有 IRQ 任务是 FF,但即使它们的优先级也较低。
我不知道从这里去哪里...... :-(
解决方案
推荐阅读
- git - 是否可以在不更改行的 git 历史记录的情况下对代码进行 lint?
- snakemake - 规则之间的snakemake通配符范围
- sql - 我怎样才能从字符串中获取reqnum?
- laravel - 图像文件未在文件夹中创建
- python - 如何按照我想要的方式格式化数据框中的日期时间?
- javascript - 如何使用自定义身份验证声明来查询 Firestore(使用 vuexfire)
- excel - 查找放置值的单元格旁边的单元格
- overlay - 您可以仅以 1 个多边形图层为目标进行多个点图层的空间连接吗?
- javascript - 难以解决 Javascript 中的导入错误
- javascript - 使用 lodash 在数组中查找具有匹配键的对象