In Assembler macht man das so, dass man den Z-Pointer auf den Flash setzt, an die Stelle wo der String liegt, und dann mit LPM ausliest.
In AVR-GCC gibt es dafür PSTR("MeinText") und pgm_read_byte(Adresse), was dem Compiler sagt, dass er hier direkt aus dem Flash lesen soll.
In Pascal habe ich das jetzt mit
Code: Alles auswählen
buffer : array[0..16] of char;
buffer := pchar('MeinTextMeinText');
for i := 0 to 15 do
sendezeichen(buffer[i]);
versucht.
Was auch soweit funktioniert, ich kann verschiedenen Zeichenketten in den Buffer geben und die Zeichen auslesen.
Dummerweise werden die Zeichenketten zwar im Flash gespeichert - wo auch sonst -, aber dann nicht beim Aufruf buffer := pchar aus dem Flash gelesen, sondern aus dem RAM, wie das Listing zeigt.
Code: Alles auswählen
ldi r19,lo8(_sGH_DISPLAYs_Ld3)
ldi r18,hi8(_sGH_DISPLAYs_Ld3) <= Ram-Adresse holen
ldi r26,17 <= Anzahl Zeichen
mov r20,r26
mov r30,r19
mov r31,r18 <= Ram-Adresse in Z-Pointer
ldi r18,lo8(U_sGH_DEFINE_ss_BUFFER)
ldi r19,hi8(U_sGH_DEFINE_ss_BUFFER) <= Adresse Buffer
# Peephole PushPushPopPop2Movw performed
movw r26,r18 <= Buffer in X-Pointer
.Lj33:
ld r0,Z+ <= aus Ram lesen
st X+,r0 <= in Buffer schreiben
dec r20
brne .Lj33
Jetzt bin ich der Sache mal nachgegangen und finde im Disassembling des kompletten Hexfiles gleich am Anfang:
Code: Alles auswählen
72: a0 e0 ldi r26, 0x00 ; 0
74: b1 e0 ldi r27, 0x01 ; 1
76: d1 e0 ldi r29, 0x01 ; 1
78: ee ee ldi r30, 0xEE ; 238 <= Z-Pointer auf Flash Adresse, wo die Zeichenketten stehen
7a: f8 e0 ldi r31, 0x08 ; 8
7c: 02 c0 rjmp .+4 ; 0x82
7e: 05 90 lpm r0, Z+ <= Daten aus Flash laden
80: 0d 92 st X+, r0 <= und in Ram ablegen
82: a6 34 cpi r26, 0x46 ; 70
84: bd 07 cpc r27, r29
86: d9 f7 brne .-10 ; 0x7e
Da werden also gleich am Anfang alle Zeichenketten in den Ram umkopiert. Ist nur bedingt eine gute Idee, weil der Ram des AVR Controllers begrenzt ist und ich da noch paar Messwerte speichern wollte.
Gibt es eine Möglichkeit dem Compiler zu sagen, dass er bei buffer := pchar('MeinTextMeinText'); bitte direkt aus dem Flash in buffer kopieren soll?
Leider findet man zur AVR Programmierung unter Lazarus / FPC nur sehr wenige Informationen.