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

时间:2019-01-23 17:02:24

标签: multithreading io linux-kernel real-time thread-priority

我有一些数据采集应用程序,该程序在带有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秒钟,一切都会好起来的。

不!不是!
我把时间测量代码。我所看到的是,当编写器挂起很长时间(例如,1342ms)时,进入收集器线程的时间也非常大(306ms)。这会导致硬件FIFO溢出和数据不一致。

我检查了系统中线程传播的优先级(ps命令)-除了我之外,没有什么是实时的。所有系统任务都安排为OTHER(在ps输出中为TS),甚至是内核USB线程。只有IRQ任务是FF,但即使它们的优先级也较低。

我不知道从这里去哪里...:-(

0 个答案:

没有答案