我在装有 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,但即使是它们也具有较低的优先级。
我不知道从这里去哪里...:-(
请帮忙!