1

У меня есть приложение для сбора данных, работающее под 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, но даже они имеют более низкий приоритет.

Я не знаю, куда идти отсюда ...:-(
Пожалуйста помоги!

0