为什么 Linux“系统”线程阻止我的 RT 线程工作?

Why Linux "system" thread prevent my RT thread from working?

提问人:leonp 提问时间:1/24/2019 最后编辑:Paulo Mattosleonp 更新时间:2/3/2019 访问量:359

问:

我在 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,但即使是它们的优先级也较低。

我不知道该何去何从... :-(

IO Linux-kernel 实时 线程优先级

评论

0赞 leonp 1/24/2019
@Tsyvarev,感谢您的编辑!:-)
0赞 xMutzelx 1/31/2019
恕我直言,错误可能在其他地方。我想到的第一件事是,write()(或连接的东西)正在使用互斥锁/信号量来阻止环形缓冲区 => fifo 数据无法写入其中。只是为了测试,您是否尝试创建第二个环形缓冲区,其中包含与第一个完全相同的数据。FIFO 写入第 1 个环,第 2 个环写入 USB-DOK。此外,您能否告诉我们这是否发生在某个固定的时间间隔内,或者这是随机的?
0赞 leonp 1/31/2019
@xMutzelx - 谢谢。我也想过这样的事情。这里的所有信号量请求都带有 timeout=0 和诊断打印,从不打印。此外,我还分别测量了FIFO清除时间(永远不会超过1ms)和返回第一个(IDE)任务的时间。TimeToReturn 很大 (>300ms)。至于规律性 - 事件之间没有规律的时间。可能需要 40 分钟,35 分钟。我打印出每个最大替换,并且不时发生巨大的时间,达到 1700 毫秒的写入时间和 370 毫秒的任务返回时间。我想这是DOK的问题,它做了一些内部NAND处理。
0赞 xMutzelx 2/1/2019
好的,谢谢你提供额外的信息。嗯,我已经做了一些研究,我可能已经找到了另外两个要尝试/检查的点。为什么您的 WriterIDE 线程比 IDE 线程更重要(优先级值较低)?在 linux 中,数字越低,优先级越高(据我所知)。其次,线程的所谓“好”值是如何设置的?
0赞 leonp 2/1/2019
谢谢你(!)愿意帮忙!WriterIDE 有意降低优先级 - 我想给 IDE 任务提供最高优先级,它需要在容量有限的 FIFO 之后运行。相反,环形缓冲区实际上很大,允许 WriterIDE 缓慢工作。这就是我的想法......关于不错的价值 - 我不知道。我确信 nice 与“正常”任务相关,而不是实时 - 我的任务是SCHED_RR创建的。这里有意义吗?

答: 暂无答案