Почему Linux "системный" поток мешает работе моего RT потока? - PullRequest
0 голосов
/ 23 января 2019

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

Я не знаю, куда идти отсюда ...: - (

...