Lesen von 2D-Arrays in einen Mikrocontroller [geschlossen]

Ich habe ein Szenario, in dem ich 2D-Arrays mit variablen Größen und verschiedenen Datentypen habe (ab sofort doppelt und boolesch). Diese Arrays sollten von einem Mikrocontroller mit 256 KB SRAM gelesen und verarbeitet werden.

In meinem Setup plane ich, diese Arrays zur Verarbeitung von der SD-Karte (als Dateien gespeichert) auf SRAM zu übertragen. Mir fallen derzeit folgende mögliche Ansätze ein

  1. Diese Arrays sind eigentlich Matrizen von MATLAB. Also beabsichtige ich, MATLAB-Variablen als .mat zu speichern und Code aus matimport.c wiederzuverwenden
  2. Speichern Sie die in den Variablen enthaltenen Daten in einer xml-Datei. Verwenden Sie einen XML-Parser für den Ziel-Mikrocontroller
  3. Erstellen Sie benutzerdefinierte Binärdateien mit zugehörigen Metadaten. Das Programm im Mikrocontroller liest also die Metadaten (Zeilen, Spalten, Datentyp) über die Binärdatei und extrahiert die Variable basierend auf den aus den Metadaten berechneten Offsets

Sol 1 sieht einfach und geradlinig aus. Aber ich denke, ich muss bestimmte externe MATLAB-Bibliotheken verwenden, und ich nehme an, dass diese vorkompilierten Bibliotheken (wie libmat.lib, libmx.lib) für ARM nicht verfügbar sind.

Sol 2 ist einfach, wenn gute Parser für einen Mikrocontroller geschrieben wurden. Vorschläge für XML-Parser sind willkommen

Sol 3 erfordert etwas mehr Arbeit. Für diese Methode beabsichtige ich, eine C-Anwendung zu schreiben, die .mat-Dateien liest und eine benutzerdefinierte Binärdatei mit Metadaten und tatsächlichen Daten erstellt. Und haben eine weitere identische Importfunktion im Mikrocontroller.

Die Gesamtgröße aller Variablen zusammen liegt im Bereich von 20 KB bis 40 KB. Daher wird im System eine SD-Karte verwendet.

Welche dieser Techniken eignet sich gut für eine eingebettete Lösung mit geringem Platzbedarf? Mein Ziel ist es, eine Lösung zu wählen und zu verwenden, die am wenigsten Speicherplatz beansprucht und die am flexibelsten für Erweiterungen ist. Schlagen Sie natürlich andere Ansätze vor, um dieses Problem zu lösen.

PS. Das Gerät ist nicht Arduino-basiert. Aber ich habe es trotzdem hinzugefügt, da die Arduino-Entwicklung in den Bereich dieser Frage fällt.

Können Sie erklären, warum Sie das arduinoTag hinzugefügt haben? Ich sehe keine Beziehung, es ist nicht einmal ARM-basiert.
Außerdem funktioniert Ihr erster Ansatz nicht, weil Sie kein libmat für ARM haben (vielleicht in Open-Source-Projekten wie scilab oder octave), sondern weil die MATLAB-Laufzeitumgebung nicht auf ein Mikro passt.
Sol 4) Speichern Sie sie nicht als .mat, speichern Sie sie als .txt und analysieren Sie sie dann in Matlab, wenn Sie sie einlesen. Verwenden Sie beim Prototyping einfache Ansätze
@DmitryGrigoryev Es gibt einige Nicht-ATmega-Boards, die auf ARM basieren. Stimmen Sie voll und ganz zu, dass die MATLAB-Laufzeit nicht für speicherbeschränkte Geräte geeignet ist. Habe nach dem Posten dieser Frage etwas recherchiert
@laptop2d Das Speichern in einer Binärdatei ist besser geeignet. Zum Bsp. Eine Ganzzahl würde die exakte Größe einer Ganzzahl im RAM annehmen. Wenn jedoch dieselbe Ganzzahl unter Verwendung von ASCII dargestellt werden soll, ist der erforderliche Speicher groß

Antworten (1)

Ich schlage vor, die Komplexität auf die PC-Seite und nicht auf die Mikrocontroller-Seite zu legen.

Sie sollten die Datei auf der SD-Karte als binäres Abbild des Speicherinhalts speichern, den Sie auf dem Mikrocontroller erhalten möchten. Das Speichern in einem definierten Binärformat sollte direkt von Matlab aus möglich sein.

Alles, was Sie tun müssen, ist, den Inhalt Ihrer SD-Karte Byte für Byte in einen vordefinierten Bereich im SRAM zu kopieren.

Eine noch einfachere Form wäre, auf ein Dateisystem ganz zu verzichten und die SD-Karte als Rohmedium zu verwenden. Ereignis einfacher auf der Mikrocontroller-Seite ...

Die Komplexität auf der PC-Seite macht dies viel einfacher:

  • Sie können jede beliebige Programmiersprache verwenden und sind nicht auf das beschränkt, was auf der MCU verfügbar ist. Ich würde dafür Python verwenden, aber das ist eine persönliche Präferenz.
  • Es ist einfach, PC-Software im Vergleich zu MCU zu debuggen.
  • Ihre MCU hätte weniger Dinge zu tun und damit mehr verfügbare Rechenzeit, um etwas anderes zu tun (oder in den Ruhezustand zu gehen, um Batterien zu sparen).
Das Schreiben von Binärdateien direkt aus MATLAB klingt interessant. Angenommen, die Daten werden in der Hauptzeile gespeichert. Wie kann der Interpreter in der MCU wissen, wann er in die zweite Reihe wechseln muss?
Alle üblichen Möglichkeiten. Ein Metadatenblock am Anfang, der die Matrixgröße oder ein Zeilentrennzeichen definiert.
Die Matrix wird sowieso serialisiert, also können Sie genauso gut einen Metadatenblock verwenden, um dem Mikro mitzuteilen, wie er ihn interpretieren soll.