Ich habe eine Datenerfassungsanwendung, die unter Linux 2.6.37 auf DM8148 mit TI Linux ausgeführt wird. Ich habe zwei Themen:

  • Thread mit dem Namen IDE, geplant als SCHED_RR, Prio 114 (75), der Daten aus dem HW-FIFO sammelt, die mit 200 KB / s in einem 30-MB-Ringpuffer alle 2 ms ankommen:

    while(1) {
      sleep(ms);
      while(DataInFIFO) {
          CollectToRingBuffer();
          SignalToWriter(); }
    }
    
  • thread WriterIDE, geplant als SCHED_RR, prio 113 (74), schreibt diesen Ringpuffer auf den USB-Stick.

    while(1) {
      WaitForSignal();
      writeToFileOnDOK();
    }
    

Ich weiß aus Messungen der Funktion "write ()", dass dieses USB-Schreiben manchmal für 1,5 und sogar 2 Sekunden "hängen" kann und versucht, in das DOK zu schreiben. Aber ich war mir sicher, dass alles in Ordnung sein wird, als ich dem Collector-Task 30MiB gab, was für 150s ausreicht.

Nein! Es ist nicht!
Ich habe den Zeitmesscode eingegeben. Und was ich sehe ist, dass, wenn der Schreiber für eine lange Zeit hängt (zB 1342 ms), die Eingabe der Kollektor-Thread-Zeit ebenfalls sehr groß ist (306 ms). Dies verursacht einen HW-FIFO-Überlauf und Dateninkonsistenz.

Ich habe die Priorität der Thread-Verteilung im System überprüft (Befehl ps). Außer mir ist nichts in Echtzeit. Alle Systemaufgaben werden als SONSTIGES (TS in ps-Ausgabe) geplant, auch Kernel-USB-Threads. Nur IRQ-Tasks sind FF, aber auch sie haben eine niedrigere Priorität.

Ich weiß nicht, wohin ich von hier aus gehen soll ... :-(
Bitte helfen Sie!

leonp
quelle