我有一些数据采集应用程序,该程序在带有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,但即使它们的优先级也较低。
我不知道从这里去哪里...:-(