LabVIEWForum.de - DMA FIFO auf RT System auslesen --> Hängt manchmal

LabVIEWForum.de

Normale Version: DMA FIFO auf RT System auslesen --> Hängt manchmal
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,
das ganze Real Time System bringt mich langsam an den Rand der Verzweiflung.

Ich lese Werte vom FPGA mittels eines DMA FIFOs und schreibe die gelesenen Werte in einen RT FIFO
der die Daten in weitere Verarbeitungsprozess übergibt.

Nun passiert es, warum auch immer das der DMA Puffer auf der Seite vom RT schlagartig vollläuft.
Das System läuft z.B. 5min, dabei sind die Elemente im Puffer immer in einem bestimmten Rahmen.
Nun "hängt" irgendwas kurz und der Puffer füllt sich bis zum Überlauf.
Ich habe den Puffer natürlich schon in seiner Größe verändert, nun passiert der Overflow nicht mehr ganz so häufig.
Aber das kann ja auch nicht die Lösung des Problems sein.

Das RT System sollte ja in der Lage sein deterministisch Daten aus dem DMA FIFO abzuholen und dem RT FIFO zu übergeben.
Wir sprechen hier von ca. 10000 Elementen alle 500ms.

[attachment=49937]

Jemand ne Idee woran es liegen kann?


Die Anzeigeelemente sind nur zum "aktuellen" Puffestand anzeigen und werden im fertigen Programm entfernt Smile

Danke euch Smile
Da ich deine früheren Fragen schon kenne:
Von welchem RT-System und welchem FPGA reden wir jetzt? Beides auf dem cRIO?

Und hatten wir nicht schon darüber gesprochen, dass Speicher-Allozierung nichts in einer Timed-Loop verloren hat? Du arbeitest ja immer noch mit "Insert Into Array"...

Gruß, Jens
So frisch zurück vom Urlaub und weiter geht es.

System ist:
CRIO 9076: Nur FPGA wird verwendet.
RT Desktop PC: Abholen der Daten vom CRIO9076 und Berechnungen.
Windows Host PC: Abholen der decodierten Daten und Auswertung.

Ich habe das Problem heute eingrenzen können.
Habe das Programm soweit bereinigt das nur noch die Elemente aus dem DMA FIFO von einer Zeitgesteuerten Schleife auf dem RT Desktop PC ausgelesen werden.

Siehe VI im Anhang:

Nach einer gewissen Zeit läuft der DMA FIFO Über, da es der RT nicht mehr rechtzeitig schafft die Daten abzuholen.
Die Zeit variiert, mal 5min mal nach einer Stunde.

Die Ursache ist mir immer noch ein Rätsel. Da eigentlich nichts mehr im VI enthalten ist was das RT Verhalten/Stabilität beeinflussen sollte.
Hallo B.,

du hast deine "FIFO.Lesen" in einer TWL mit einem dt=500ms, gibst aber ein TimeOut von 1000ms vor.
Da muss die Schleife ja aus dem Tritt kommen! Big Grin

Wenn du in der Schleife mit TimeOuts arbeitest, brauchst du keine hochpräzise TWL…
OK,
dann was soll ich bei dem Timeout anschließen Angel_not.

Bzw. einfach ne While Schleife nehmen und das Timeout auf unendlich? Ansage
(24.06.2014 14:26 )B.Buerkert schrieb: [ -> ]OK,
dann was soll ich bei dem Timeout anschließen Angel_not.

Bzw. einfach ne While Schleife nehmen und das Timeout auf unendlich? Ansage

nein, das macht man anders:

der FPGA bekommt einen Zähler wieviel Samples er in den FIFO geschrieben hat. Wird ein von dir festgelegter Grenzwert überschritten (der natürlich zur größe des FIFOs passen sollte) setzt der FPGA einen Interrupt und setzt den Zähler zurück. Das RT-VI wartet in einer Schleife auf den Interrupt. Wird dieser erkannt holt das RT-VI die entsprechende Menge Daten aus dem FIFO ab. Das ganze kann in einer ganz normalen while-Schleife laufen.

Den FIFO mit "0 Elemente lesen" zu pollen klappt zwar irgendwie ist aber auch "irgendwoe nicht so toll" Wink ... am besten schaust du dir mal die entsprechenden Beispiele im Example-Finder zum Thema Interrupt an, da gibt's auch glaub ich ein Beispiel, dass die oben beschriebende Methode demonstriert ...

Und wenn du's richtig gut machen willst und unnötige Speicher-anforderungen vermeiden willst, dann benutzt du Referenzen auf die Daten im FIFO beim "weiterreichen" an deine Funktion zum Verschicken der Daten über TCP/IP ...

viele Grüße
cb
Irgendwie bin ich immer noch skeptisch, auch wenn es programm- und LabVIEW-technisch geht.

Nur der FPGA läuft auf dem cRIO, ohne ein RT-VI auf dem cRIO.
Dort ist ein FIFO definiert. Im Normal schiebt der FPGA ja per Bus seine Daten zum RT-Teil des cRIO. In so einem Fall läuft das sicher zuverlässig.

Bei dir ist aber zwischen Reinschreiben in FIFO und Auslesen im RT-Teil eines Desktop-PC eine Netzwerkverbindung (denn irgendwie müssen die Daten ja rübergehen). Wie das LabVIEW-intern gelöst ist, kA, aber ich kann mir nicht vorstellen, dass diese Datenübertragung noch "Echtzeitfähig" ist. In allen Tutorials heißt es immer: Netzwerk-Traffic ist nicht echtzeitfähig.

Ich hatte dir schon früher empfohlen, die Daten mglw. lieber im RT-Teil des cRIO abzuholen und dann z.B. per NetworkStream weiterzugeben.

Gruß, Jens
Referenz-URLs