Ich habe mir das Archiv angesehen. Leider ist keine Doku dabei. Und es
scheinen Quellen zu fehlen, jedenfalls kompiliert tinymenu_test.c nicht
soweit, dass man mit einer Simulation des Istzustandes starten kann
bevor man zum Wunschzustand umbaut.
Was ich sehe: In dem Tinymenu kann man die Strings (entry.name) im Flash
ablegen. Andere Mitglieder der Menüstruktur werden im Programmablauf
verändert, um die aktuelle Position im Menü nachzuführen. Man kann also
in dieser Library nicht das komplette Menü im FLASH halten.
Die fehlenden Sourcen habe ich durch Dummys ersetzt und dann mit AVR
Studio 4.121 SP2/WiNAVR 20071222 für den Modell-AVR Atmega32 ohne
Optimierung kompiliert.
Die Simulation geht zunächst schief, weil in tinymenu_test.c die
Menüstrukturen falsch aufgebaut sind (zig Nullpointer). Nachdem das
korrigiert wurde, sehe ich eine vernünftig aussehende Arbeitsweise bei
meinem Breakpoint in der Dummy/Debugfunktion lcd_putchar().
Dann das Umschreiben auf STRINGS_IN_FLASH. Diese Codeteile lassen sich
mit diesem #define in tinymenu.h an- oder abschalten. Dort gibt es auch
noch ein weiteres #define zu Debugzwecken. Im Prinzip bin ich streng
nach der Anleitung in AVR-GCC-Tutorial vorgegangen.
Am besten sieht man die Änderungen beim Durchtracen im
Einzelschrittmodus. An den wichtigen Stellen habe ich lokale Puffer
eingerichtet, die die gerade aus dem Flash kommenden Daten aufnehmen und
kontrollierbar machen. Meine Version von AVR Studio schafft es nicht im
Watch-Fenster die Daten im Flash anzuzeigen, wenn man per Pointer darauf
zugreifen will.
Leider ist es mir auch nicht gelungen, die Daten byteweise aus dem Flash
zu holen (per pgm_read_byte()). Es interessiert mich wieso. Ich bin dann
auf strncpy_P() bzw. strcpy_P() ausgewichen. Der dafür benötigte Puffer
ist eine Menüzeile gross aber lokal auf dem Stack, d.h. kurzlebig.
Insgesamt ist der Platzersparnis im RAM (ohne den lokalen Puffer
gerechnet): 9 x 16 Bytes für die Zeichen in den Strings - 9 x 2 Bytes
für die Pointer im RAM auf die Strings im FLASH = 126 Bytes.
Die Datei im Anhang ist der komplette AVR Studio Projektordner von mir.
Die Pfade in der Projektdatei sind auf
e:\elektronik\sb_avr\tinymenu_test\... bezogen. Achtung: Wegen der
Dummyfunktionen darauf achten, dass keine eigenen Dateien
überschrieben werden. Eigenen Projektordner anlegen oder Original
backuppen!
ADD: In der Artikelsammlung ist ein weiteres Menüsystem: Tinykon.
Ich habe selbst aber keine Erfahrung damit.