Daten in den Flash-Speicher übertragen und auslesen

Guten Morgen,

ich arbeite gerade an einer ePaper-Lösung. Dabei werden X11-Bitmaps in der Größe von circa 40Kbyte in einen zum Display gehörenden Flashspeicher übertragen, da der vom Uno zu klein ist. Anhand der Beispielcodes wird das mittels Pre-Processing Anweisungen und PROGMEN gemacht. Meine Frage ist nun, kann ich PROGMEN grundsätzlich immer einsetzen, auch im laufendem Programm oder bin ich vollständig auf dem Holzweg? Hat jemand Erfahrungen damit und fühlt sich bereit dazu mir eventuell ein paar blöde Fragen zu beantworten?

Vorab Danke

Siccc:
Meine Frage ist nun, kann ich PROGMEN grundsätzlich immer einsetzen, auch im laufendem Programm oder bin ich vollständig auf dem Holzweg? Hat jemand Erfahrungen damit und fühlt sich bereit dazu mir eventuell ein paar blöde Fragen zu beantworten?

PROGMEM ist ein Schlüsselwort bei der Deklaration von KONSTANTEN im Flash-Speicher.

Wenn Du das Schlüsselwort PROGMEM verwendest, werden die entsprechend deklarierten Konstanten im Flash-Speicher statt im RAM-Speicher abgelegt. Von dort können die Konstanten bei Bedarf mit Hilfe spezieller Lesebefehle gelesen werden, also auch z.B. vom Flash-Speicher ins RAM kopiert und dort weiter verarbeitet werden.

Die maximale Größe von PROGMEM deklarierten Konstanten ist auf ein Segment von 64 KB insgesamt beschränkt. Falls Du auf einem Controller mit mehr Flash-Speicher (z.B. MEGA mit 256 KB Flash) mehr als 64 KB Konstanten im Flash halten möchtest, wird es noch ein klein wenig komplizierter mit der Arduino-Software.

Leider hat sich das Arduino-Team noch immer nicht aufraffen können, den GCC-Compiler mit Libraries mal auf eine aktuelle Version zu hieven, bei der dieser ganze PROGMEM-Sermon für Flash-Konstanten nicht mehr notwendig ist. Denn vom AVR-GCC gibt es schon mindestens seit zwei Jahren eine Version, bei der dieses PROGMEM-Gehampel überhaupt nicht mehr notwendig ist. Aus mir unerfindlichen Gründen ist ein Compiler-Update aber wohl auch für die kommende 1.5.x/2.0.x Version der Arduino-Software leider nicht zu erwarten.

Es gibt aber im Netz wohl Bastelanleitungen, um die Arduino-Software selbst nachträglich auf AVR-GCC v 4.7.2 zu bringen. In neueren Compiler-Versionen würde das dann mit der Deklaration von Flash-Konstanten so funktionieren:

const _flash int values[] = { 42, 31 };

Und die Verwendung würde exakt genau erfolgen, ohne zusätzliche PROGMEM-Lesebefehle, wie man sonst auf "normale" Variablen und Konstanten zugreift. Falls Du Lust zum Basteln an Installationen der Arduino-Software hast, bringe Deine Software auf den Compilerstand 4.7.2 und arbeite mit dem "_flash" Keyword!

Und wenn Du mit einer originalen Arduino-Version Konstanten im Flash bis zu einer Größe von 64 KB benötigst, nutze das (inzwischen veraltete, aber bei Arduino immer noch notwendige) PROGMEM mit den lustigen, unterhaltsamen und lehrreichen "Program space utilities":
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

Hat es mal jemand geschafft den neueren Compiler für den Mega zum laufen zu bekommen? Ich habe es mal versucht, aber die Anleitung geht anscheinend nur auf dem UNO. Auf dem Mega ist mir bei compilieren dann eines der Utility Programme (ld.exe) abgestürzt. Und da bin ich nicht der einzige.

Wird auch hier in den Kommentaren erwähnt:

Zunächst mal herzlichen Dank für die Anregungen. Es stellte sich heraus, dass ich einen Flash-Speicher über SPI beschreiben kann, also auf das PROGMEN-Gedudel verzichten kann. Allerdings habe ich das auch noch nicht gemacht.....Studiere gerade das Datenblatt.