Arduino und x86: Crosskompilation trotz PROGMEM

07.05.2013 yahe arduino code hardware legacy

Bei meinem derzeitigen Projekt lege ich viel Wert darauf, dass die eigentliche Codebasis nicht nur auf dem Arduino, sondern auch auf normalen PCs mit x86- und x64-Architektur läuft. Bisher war das relativ einfach, da ich Plattformspezifika vermeide. Dieses Mal war das jedoch nicht möglich und eine Zwischenschicht musste her.

Was genau ist PROGMEM?

Ein großes Problem der Arduino-Plattform ist ihr begrenzter Hauptspeicher von 2kb. Dinge wie längere statische Strings werden normalerweise als Array definiert. Diese Arrays werden beim Starten des Programms in den Hauptspeicher geladen und verbrauchen dort Platz. Um diese unnötige Platzverschwendung zu umgehen, gibt es bei AVR-Plattformen PROGMEM. Statische Variablen, die damit markiert werden, werden nicht in den Haupt-, sondern in den Programmspeicher gepackt und von dort aus gelesen. Der Programmspeicher bietet immerhin satte 32kb Platz. Über spezielle Funktionen kann die Variable dann wieder ausgegeben werden.

Und wo ist jetzt das Problem?

Wie schon angesprochen, möchte ich meinen Code sowohl auf dem Arduino als auch auf dem PC verwenden. Dieser unterstützt PROGMEM jedoch nicht. Daher muss eine Möglichkeit gefunden werden, um Code, der das Schlagwort "PROGMEM" sowie die speziellen PROGMEM-Funktionsaufrufe enthält, trotzdem kompilieren zu können.

Und wie sieht die Lösung aus?

Um die PROGMEM-Funktionalität nutzen zu können, benötigt man sowohl die PROGMEM-Direktive als auch die speziellen Funktionen zum Auslesen des Speichers. Diese stehen auf dem PC natürlich nicht zur Verfügung. Aus diesem Grund habe ich mir einen kleinen Wrapper geschrieben. Dieser definiert "pm_*(x,y)" Funktionen, die anstelle der normalen Pgmspace-Funktionen verwendet werden sollen. Zudem werden die für PROGMEM verwendeten Datentypen definiert. Wenn man nun folgenden Code in eine Headerdatei packt, diese neue Headerdatei anstelle von "<avr/pgmspace.h>" inkludiert und die "pm_*(x,y)"-Funktionen nutzt, dann funktioniert der Code plattformübergreifend.

Wie sieht das in der Praxis aus?

Ich habe eine kleine Bibliothek namens Progmemuino geschrieben, die man einfach in sein Programm einbinden kann. Schon hat man die notwendige Abstraktionsschicht, um den speziell angepassten Arduino-Code auch plattformübergreifend auf dem PC nutzen zu können.


Search

Categories

administration (40)
arduino (12)
calcpw (2)
code (33)
hardware (16)
java (2)
legacy (113)
linux (27)
publicity (6)
review (2)
security (58)
thoughts (21)
windows (17)
wordpress (19)