У мене є деякі програми збору даних, що працюють під 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, але навіть вони мають нижчий пріоритет.
Я не знаю, куди йти звідси ... :-(
Будь ласка, допоможіть!