У меня есть приложение для сбора данных, работающее под 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(); } }
поток WriterIDE, запланированный как SCHED_RR, prio 113 (74), записывает этот кольцевой буфер в USB-диск на ключе.
while(1) { WaitForSignal(); writeToFileOnDOK(); }
Из мер функции write() я знаю, что иногда эта запись USB может "зависать" в течение 1,5 и даже 2 секунд, пытаясь записать в DOK. Но я был уверен, что, поскольку я дал задание для сборщика 30MiB, которого хватит на 150 с, все будет хорошо.
Нет! Это не!
Я поставил код измерения времени. И то, что я вижу, это то, что когда писатель зависает в течение длительного времени (fe1342ms), тогда время входа в поток коллектора также очень велико (306ms). Это вызывает переполнение HW FIFO и несогласованность данных.
Я проверил распределение приоритетов потоков в системе (команда ps) - в режиме реального времени нет ничего, кроме меня. Все системные задачи запланированы как ДРУГИЕ (TS в выводе ps), даже ядра USB. Только задачи IRQ являются FF, но даже они имеют более низкий приоритет.
Я не знаю, куда идти отсюда ...:-(
Пожалуйста помоги!