Gast
#6395314
Ich stehe vor einem lästigen Problem welches ich gerne eliminieren würde: Ich habe ein SoC (Zynq) welches ich als Reglerplattform benutzen will. Beim Programmieren und Einstellen von Reglern habe ich des öfteren das Problem, dass ich gewissen physikalische Grössen mit einem Scope messen kann, der Zusammenhang mit diversen FPGA/CPU-internen Grössen (Messwerte und davon abhängige) aber interessant wäre und diese Grössen im Normalfall nicht zugänglich sind. Ich suche also eine Möglichkeit, diese Grössen im Betrieb mitzuloggen und nachträglich an einen PC zu schicken, damit ich sie mit den Daten vom Scope vergleichen kann, habe dabei aber nicht so wirklich einen Plan wie ich dabei am effizientesten vorgehen soll. Ich dachte dabei daran, die Daten vorher in einem Array mitzuschreiben (fixe Samplingfrequenz durch Timer-Interrupt) und das Array dann per UART an den PC zu schicken um die Daten zu plotten. Die Fragen die sich mir jetzt stellen: - Wie implementiert man das Loggen der Daten am einfachsten? Die simpelste Methode wäre in meinen Augen, einfach für jede Variable ein Array mit entsprechender Länge vorzusehen und die Daten nacheinander dort reinzuschreiben. Bei 20 kHz Samplingfrequenz kommen pro Sekunde dann 80000 Byte zusammen (für eine float Variable). Ich bin mir sicher, dass dies funktionieren würde, allerdings erscheint mir die Methode etwas brutal. Ausserdem muss ich damit de facto jede Variable doppelt anlegen (-> unübersichtlich und fehleranfällig?) und ich weiss nicht, wie sehr die Laufzeit der Regler-ISR sich freut wenn bei jedem Aufruf grössere Arrays beteiligt sind. Ist diese Holzhammer Methode akzeptabel oder gibts hier was besseres (programmiert wird in C)? - Gewisse Dinge laufen im FPGA mit Samplingfrequenz > 10 MHz. Als Lösung sehe ich hier, den Datastream in ein FIFO zu schreiben und die Daten per DMA ins RAM zu kopieren. Hier stellt sich für mich die Frage, wie ich die Daten in meinem C-Programm verwerten kann bzw. wie das Programm mit dem betreffenden Speicherbereich umgehen soll. Soll ich diesen per malloc() vorher reservieren, die DMA-Unit schreibt die Daten rein und das Programm liest sie anschliessend aus? - Wie kann ich die Daten am effizientesten zum PC übertragen? Ich habe nur eine UART Schnittstelle und über diese bis jetzt nur ein Terminal welches mit Putty kommuniziert laufen lassen. Wie ich Bytes über UART rausschicken kann ist mir bekannt, allerdings benötige ich am PC ein Programm das die Daten in eine Datei schreibt. Hier gibt es bestimmt fertige Lösungen, nur was bietet sich für sowas an?