Ich habe einen Roboter, der Steuercode mit Echtzeitpriorität auf einem PREEMPT-RT Patched Linux OS auf einem Beaglebone Black ausführt. Der gesamte Code ist in C geschrieben und läuft mit 500Hz.Latenzspitzen während der Datenprotokollierung in Echtzeit Embedded Linux
Ich habe bemerkt, Latenz im Bereich von ein paar hundert Millisekunden hin und wieder beim Ausführen des Codes und ich habe es auf die Datenprotokollierungsfunktion, die ich schrieb. Diese Latenz führt dazu, dass die Steuerung meines Roboters fehlschlägt, da ich abhängig von der Echtzeitfunktion viel habe.
Der relevante Teil des Codes ist unten. Ich habe eine Menge Code aus Gründen der Übersichtlichkeit geschnitten, aber ich werde diesen Beitrag bearbeiten, wenn etwas benötigt wird.
Ich muss Daten von mehreren Variablen (wahrscheinlich 20-50) mit einer guten Rate, vielleicht 100-125Hz protokollieren. Daten müssen nicht mit der Kontrollrate protokolliert werden (alle 2 ms), aber ich habe sie auf 12 ms verringert und sehe immer noch Latenzspitzen alle paar Minuten.
Die Latenz kann ein Problem mit dem fprintf
Aufruf sein. Ist dies eine Einschränkung des BeagleBone Black, mein Code oder nur die Art der Datenprotokollierung?
Eine ähnliche Frage wurde hier gefragt, aber schien nicht mein Problem zu beheben: Finding latency issues (stalls) in embedded Linux systems
Ein Nicht-TTY-Datei-Handle ist standardmäßig blockweise gepuffert. Nach dem "fprintf" von 4096 Bytes wird der Puffer auf den Datenträger geleert, was die Latenz verursachen kann. Können Sie die eigentliche Protokollierung nicht in einen separaten Thread auslagern? Queue logMessages und entnimmt sie in Ihrem Logthread. – Ctx
Wird dieser Code als Teil eines normalen Prozesses ausgeführt? Steuert es Mutexe, Semaphore usw., die einen Gerätetreiber blockieren? – wallyk
@jekso: Erstellen Sie einen Protokollierungs (p) -Thread und verwenden Sie so etwas wie eine doppelt verkettete Liste als Warteschlange (Enqueue am Kopf, entmutigen am Ende) und pthread_cond_wait/notify, um neue Einträge zu signalisieren. – Ctx