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]);
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
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
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.