mikrocontroller.net

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


Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
 11 #include <stdlib.h>
 12 #include <avr/pgmspace.h>
 13 #include "lcd.h"
 14 #include "menu.h"
 15 
 16 struct MenuPage_s {
 17         const char *pText;
 18 };
 19 
 20 /*** global variable ***/
 21 volatile uint8_t gMenuPageIndex = 0;    /* The current page */
 22 volatile uint8_t gMenuReturnPage = 0;   /* The page in the calling menu for return */
 23 
 24 /*** Menu strings ***/
 25 const char MainString0[] PROGMEM = "Anzeigemodus";
 26 
 27 /*** Menu entries ***/
 28 const struct MenuPage_s Menu[] PROGMEM =  {
 29         {&MainString0[0]}
 30 };
 31 
 32 /*** functions ***/


 42 void MenuPageDisplay(void)
 43 {
 44         char c;
 45         char *addr ;
 46         uint8_t loop_counter = 1;
 47 
 48         addr = Menu[gMenuPageIndex].pText;
 49 
 50         lcd_clrscr ();
 51         while ( (c = pgm_read_byte(addr++)) != '\0') {          /* read single bytes from flash and put on lcd, until string terminator \0 is found */
 52                 if (loop_counter++ == 8) lcd_gotoxy (0,1);      /* change line after 8 chars, needed for 1x16 display */
 53                 lcd_putc (c);
 54         }
 55 }


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

Danke, Jan

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
 45         addr = pgm_read_word(&(Menu[gMenuPageIndex].pText));

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.