У меня есть приложение для сбора данных, работающее под Linux 2.6.37 на DM8148 с TI Linux. У меня есть две темы:
поток с именем IDE, запланированный как SCHED_RR, prio 114 (75), который собирает данные из HW FIFO, поступающего со скоростью 200 КБ / с, в кольцевой буфер 30 МБ каждые 2 мс:
while(1) {
sleep(ms);
while(DataInFIFO) {
CollectToRingBuffer();
SignalToWriter(); }
}
thread WriterIDE, запланированный как SCHED_RR, prio 113 (74), записывающий этот кольцевой буфер на USB-диск-на-ключе.
while(1) {
WaitForSignal();
writeToFileOnDOK();
}
Я знаю по показателям функции write()
, что иногда эта запись USB может «зависать» в течение 1,5 и даже 2 секунд, пытаясь записать в DOK. Но я был уверен, что, когда я дал задание для сборщика 30MiB, которого хватит на 150 с, все будет хорошо.
Нет! Это не так!
Я поставил код измерения времени. И то, что я вижу, это то, что когда писатель зависает в течение длительного времени (например, 1334 мс), то время входа в поток коллектора также очень велико (306 мс). Это вызывает переполнение HW FIFO и несогласованность данных.
Я проверил распределение приоритетов потоков в системе (команда ps) - ничего, кроме меня, в режиме реального времени. Все системные задачи запланированы как ДРУГИЕ (TS в выводе ps), даже потоки ядра USB. Только задачи IRQ являются FF, но даже они имеют более низкий приоритет.
Я не знаю, куда идти отсюда ...: - (