Forum: Mikrocontroller und Digitale Elektronik WinAVR: Einzelne Strings aus dem Flash auslesen


von Pl L. (atmega169)


Lesenswert?

Hallo!

Mit "PROGMEM" kann ich ja Daten im Flashspeicher ablegen. Jetzt würde 
ich gerne wieder darauf zugreifen. Nach intensiver Recherche glaube ich, 
dass man nicht auf einzelne Strings zugreifen kann.

Dazu folgendes Beispiel:
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
4
const char MenuItem1[] PROGMEM = "Menu Item 1";
5
const char MenuItem2[] PROGMEM = "Menu Item 2";
6
const char MenuItem3[] PROGMEM = "Menu Item 3";
7
8
char* MenuItemPointers[] PROGMEM = {MenuItem1, MenuItem2, MenuItem3};
9
10
void main (void)
11
{
12
   while (1) // Eternal Loop
13
   {
14
      char EnteredNum = USART_GetNum();
15
16
      USART_TxString_P((char*)pgm_read_word(&MenuItemPointers[EnteredNum]));
17
   } 
18
}


Wäre es jetzt irgendwie möglich, dass ich direkt ohne den Index 
"EnteredNum" z.B. MenuItem2 als gültigen "char*"-Pointer aus dem Flash 
lesen kann? Oder muss ich wirklich all meine Strings als char-array 
deklarieren und dann in einem char*-Array verpacken?

Bei folgender Version wird nämlich nicht der Flash-Speicher verwendet:
1
  char* Text_Test1 PROGMEM = "Teststring test test";

Das geht alles ins SRAM

von Karl H. (kbuchegg)


Lesenswert?

Pl Lp schrieb:

> Bei folgender Version wird nämlich nicht der Flash-Speicher verwendet:
>
>
1
>   char* Text_Test1 PROGMEM = "Teststring test test";
2
>
>
> Das geht alles ins SRAM

Alles nicht. Das was du als PROGMEM markiert hast, geht ins Flash. Und 
das ist: Ta ta, der Pointer der auf den String zeigt.

Du hast hier 2 Teile:
Einen Pointer und den String selber

  Text_Test1
  +----+
  |  o---------------------> "Teststring test test"
  +----+


Text_Test1 liegt im Flash, "Teststring test test" liegt im SRAM

Das hier
1
const char MenuItem1[] PROGMEM = "Menu Item 1";
ist anders. Das hier generiert

   MenuItem1
   +---+---+---+---+---+---+---+--
   | M | e | n | u |   | I | t | ....
   +---+---+---+---+---+---+---+--

also ein Array. Und dieses Array liegt im Flash.


> Nach intensiver Recherche glaube ich,
> dass man nicht auf einzelne Strings zugreifen kann.

Auf einen String kann man sowieso nicht zugreifen. Wohl aber auf die 
Character eines Strings.

1
      USART_TxString_P((char*)pgm_read_word(&MenuItemPointers[EnteredNum]));
und wie sieht dein USART_TxString_P aus?
(Ich hege den Verdacht, dass da mittels Makro noch ein implizites PSTR 
drinnen steckt)

von Oliver (Gast)


Lesenswert?

Pl Lp schrieb:
> Nach intensiver Recherche glaube ich,
> dass man nicht auf einzelne Strings zugreifen kann.

Wenn du damit meinst, daß du jeden Buchstaben einzeln aus dem Flash per 
pgm_read auslesen musst, wenn du etwas damit machen willst, dann hast du 
richtig recherchiert.

Oliver

von Loonix (Gast)


Lesenswert?

Pl Lp schrieb:
> Nach intensiver Recherche glaube ich,
> dass man nicht auf einzelne Strings zugreifen kann.

Offenbar nicht intensiv genug, um den direkt im libc-Manual zugänglichen 
Erklärungstext zur Anwendung von PROGMEM zu lesen...

http://www.nongnu.org/avr-libc/user-manual/pgmspace.html

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.