Forum: Compiler & IDEs AVR, kann bei array im flash den index nicht über variable ansprechen


von Jan (Gast)


Lesenswert?

Moin zusammen,

ich habe mal eine Idee für ein LCD Menü aus einem anderen Thread 
aufgegriffen.

Das Problem ist in Codezeile 48. Hier Versuche ich den richtigen array 
Eintrag über die variable gMenuPageIndex anzusprechen. Das funktioniert 
aber nicht, auf dem Display erscheint dann Schwachsinn.
Wenn ich allerdings 0 (welches der richtig Index ist) anstatt der 
variable dahin schreibe, funktioniert es. Mit einer über #define 
definierten Konstanten geht es auch. Die variable hat an der Stelle 
definitiv den Wert 0, daran liegt es also nicht.
1
 11 #include <stdlib.h>
2
 12 #include <avr/pgmspace.h>
3
 13 #include "lcd.h"
4
 14 #include "menu.h"
5
 15 
6
 16 struct MenuPage_s {
7
 17         const char *pText;
8
 18 };
9
 19 
10
 20 /*** global variable ***/
11
 21 volatile uint8_t gMenuPageIndex = 0;    /* The current page */
12
 22 volatile uint8_t gMenuReturnPage = 0;   /* The page in the calling menu for return */
13
 23 
14
 24 /*** Menu strings ***/
15
 25 const char MainString0[] PROGMEM = "Anzeigemodus";
16
 26 
17
 27 /*** Menu entries ***/
18
 28 const struct MenuPage_s Menu[] PROGMEM =  {
19
 29         {&MainString0[0]}
20
 30 };
21
 31 
22
 32 /*** functions ***/
23
24
25
 42 void MenuPageDisplay(void)
26
 43 {
27
 44         char c;
28
 45         char *addr ;
29
 46         uint8_t loop_counter = 1;
30
 47 
31
 48         addr = Menu[gMenuPageIndex].pText;
32
 49 
33
 50         lcd_clrscr ();
34
 51         while ( (c = pgm_read_byte(addr++)) != '\0') {          /* read single bytes from flash and put on lcd, until string terminator \0 is found */
35
 52                 if (loop_counter++ == 8) lcd_gotoxy (0,1);      /* change line after 8 chars, needed for 1x16 display */
36
 53                 lcd_putc (c);
37
 54         }
38
 55 }

Hat jemand eine Idee?
Achja, avr-gcc (GCC) 4.4.2 hat and em code nichts zu meckern.

Danke, Jan

von Sven P. (Gast)


Lesenswert?

Nur ein Verdacht: Der Optimierer schlägt halbherzig zu.

Wenn du eine Konstante einsetzt, optimiert er den Zugriff auf dein 
Zeigerarray ganz heraus und es funktioniert.

Greifst du über die flüchtige Variable darauf zu, musst du den Eintrag 
(d.h. eine einzelne MenuPage_s-Struktur) im Array selbst ja auch erst 
einmal über eine pgm_read_...-Funktion auslesen!
Erst dann kannst du auf den Inhalt der Struktur zugreifen, den String 
benutzen und wiederum mit pgm_... auslesen.

von Bten (Gast)


Lesenswert?

Sven P. hat es ja schon gesagt: Deine Menu[] ist eine Konstante im Flash 
und daher musst du die Werte auch über pgm_read... auslesen. Im Moment 
liest dein Programm nur den Wert der im SRAM an der Speicherstelle mit 
der Adresse Menu[gMenuPageIndex].pText liegt und das ist eben nicht der 
gleiche Wert wie der den du im Flash abgelegt hast.

von Jan (Gast)


Lesenswert?

Ja, danke - daran lag es natürlich. Ist aber auch gemein, daß der Fehler 
bei einem festen Wert nicht auftritt - dadurch tauchte er nicht auf als 
ich ihn gemacht habe, sondern als ich später die variable einsetzte ...

So funktioniert es:
1
 45         addr = pgm_read_word(&(Menu[gMenuPageIndex].pText));

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.