Що заважає роботі мого потоку RT?


1

У мене є деякі програми збору даних, що працюють під Linux 2.6.37 на DM8148 з TI Linux. У мене є дві теми:

  • нитка з назвою IDE, запланована як SCHED_RR, prio 114 (75), яка збирає дані з HW FIFO, що надходить у 200KiB / s в буфер кільця 30MiB кожні 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, чого вистачить на 150s, все буде добре.

Ні! Це не!
Я ставлю код вимірювання часу. І те, що я бачу, це те, що коли письменник зависає довго (f.e.1342ms), то вхід до потоку колекторної нитки теж дуже великий (306мс). Це викликає переповнення HW FIFO і невідповідність даних.

Я перевірив поширення пріоритетів потоків в системі (ps command) - нічого не в реальному часі, окрім мене. Всі системні завдання заплановані як OTHER (TS in ps output), навіть нитки USB ядра. Тільки завдання IRQ є FF, але навіть вони мають нижчий пріоритет.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.