什么原因导致我的 RT 线程无法工作?

什么原因导致我的 RT 线程无法工作?

我在装有 TI Linux 的 DM8148 上的 Linux 2.6.37 下运行了一些数据采集应用程序。我有两个线程:

  • 名为 IDE 的线程,被调度为 SCHED_RR,优先级为 114 (75),每 2 毫秒从 HW FIFO 收集数据,以 200KiB/s 的速度到达 30MiB 环形缓冲区:

    while(1) {
      sleep(ms);
      while(DataInFIFO) {
          CollectToRingBuffer();
          SignalToWriter(); }
    }
    
  • 线程 WriterIDE,调度为 SCHED_RR,优先级为 113 (74),将此环形缓冲区写入 USB 密钥磁盘。

    while(1) {
      WaitForSignal();
      writeToFileOnDOK();
    }
    

我从“write()”函数的测量结果得知,有时此 USB 写入可能会“挂起”约 1.5 秒甚至 2 秒,尝试写入 DOK。但我确信,当我为收集器任务提供 30MiB(足够 150 秒)时,一切都会正常。

不!不是!
我放了时间测量代码。我看到的是,当写入器长时间挂起(fe1342ms)时,进入收集器线程的时间也非常大(306ms)。这会导致 HW FIFO 溢出和数据不一致。

我检查了系统中线程优先级的分布(ps 命令)——除了我之外,没有实时线程。所有系统任务都被安排为其他任务(ps 输出中的 TS),甚至内核 USB 线程也是如此。只有 IRQ 任务是 FF,但即使是它们也具有较低的优先级。

我不知道从这里去哪里...:-(
请帮忙!

相关内容