(15.04.2014 17:53 )akr74000 schrieb: Den Sprung von FPGA auf RT verstehe ich nicht ganz genau. wenn du noch detaillierter noch erklärst würde mich sehr freuen.
Gruss
das sind 2 getrennte VIs, die auf 2 unterschiedlichen Prozessoren laufen, das eine auf der CPU des cRIOs, das andere im FPGA. Damit die beiden VIs zusammenarbeiten müssen sie irgendwie kommunizieren. Dieser Daten-Austausch läuft über den FIFO. Das RT-VI ist der "Boss" und sagt dem FPGA-VI was es tun soll, und das FPGA-VI meldet per IRQ wenn es die Arbeit erledigt hat.
Die Write-Schleife läuft immer für "Number of Bytes" Iterationen, da sie keine Abbruch-Bedingung hat, auch dann wenn der FIFO leer ist. Wenn der FIFO leer ist, dann wartet er für 50 Tics darauf dass noch ein Byte reinkommt, tut es das nicht meldet er einen Timeout. Beim ersten Timeout wird das Schreiben auf den Port durch die Case-Struktur unterbunden. Alle weiteren FIFO-Read-Operationen für die restlichen Iterationen der For-Schleife werden ebenfalls durch die äußere Case-Struktur unterbunden.
Wenn die For-Schleife im Write-Case beendet ist springt die Sequenz einen Rahmen weiter zum IRQ Wait. Dort wird der IRQ an das RT-VI gesendet und drauf gewartet dass das RT-VI den IRQ bestätigt.
Die Funktion bei der 0 Daten in den FIFO geschoben werden ist eine "Krücke", da es keine eigene Funktion dafür gibt abzufragen wieviel Bytes noch im Puffer sind. Mit der Information wieviel Bytes noch im Puffer sind wird überprüft, ob der FIFO auch tatsächlich leer ist (=überflüssig, in 99,99999% der Fälle ist er leer.)
Im Prinzip wartet das FPGA VI nach dem Start immer beim IRQ (wie der erste Durchlauf der äußeren While-Loop aussieht hab ich schon beschrieben). Dann kann man vom RT-VI aus einstellen was es machen soll: lesen oder schreiben. Wenn man was schreiben will, schickt man vorher die Bytes in den FIFO und gibt mit dem Bestätigen des IRQ den Start-Schuss. Beim Lesen gibt man ebenfalls mit dem Bestätigen des IRQ den Startschuss, und wartet dann so lange bis der nächste IRQ kommt, damit sind dann entweder die gewünschte Anzahl Bytes empfangen worden oder es ist ggf. auch ein Timeout aufgetreten der analog zum Schreiben behandelt wurde.
viele Grüße
cb