struct mit strings im flash unterbringen

Gast #505343
Lesenswert?
• ▲
▼
Hallo!
Die strings in bef_tab sollen direkt aus dem flash gelesen werden. So 
habe ich naiv erstmal versucht sie als prog_char zu deklarieren, um dann 
die strcmp_P Funktion zu benutzen. Das geht nicht. So wie es unten steht 
läuft es, aber dabei werden die strings ja ins RAM umkopiert. Wie mache 
ich es richtig und spare am meisten kostbares RAM?
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html 
kennt viel und ich wenig...
Danke
1
typedef struct {
2
  const prog_char *name;
3
  char (*func)(char *);
4
}bef_struct;
5

6
bef_struct bef_tab[] = {    
7
  {"led", led},
8
  {"?", help},
9
  {"", NULL}            
10

11
char bef_pars( char *buf ) {
12
...
13
  if (!strcmp(buf, bef_tab[i].name)) {
14
  return bef_tab[i].func(&buf[p + 1]);
15
  }
16
...
17
}
#505436
Lesenswert?
• ▲
▼
Das geht nur über einen Umweg:
1
const uint8_t PROGMEM led_str[] = "led";
2
const uint8_t PROGMEM help_str[] = "help";
3

4
const bef_struct_typ PROGMEM bef_tab[] = {
5
  {led_str, led},
6
  {help_str, help},
7
  {empty_str, NULL}
8
}
Und nicht vergessen, in dem Array sind POINTER auf Strings gespeichert. 
Der Zugriff auf die Strings geht also nur, indem zuerst der ptr aus dem 
Array geholt wird:
1
my_str_ptr = pgm_read_word (&(bef_tab[0].name));
erst danach kannst Du auf die Zeichen des Strings wiederum z.B. per
1
my_char = pgm_read_word(my_str_ptr);
zugreifen.

Gruß, Stefan
Gast #505962
Lesenswert?
• ▲
▼
Mal ganz intuitiv ohne große Tests:
müsste es nicht auch so gehen?

bef_struct bef_tab[] = {
  {PSTR("led"), led},
  {PSTR("?"), help},
  {PSTR(""), NULL}

Um Antwort eines wissenden wird gebenten!!!
#506227
Lesenswert?
• ▲
▼
@Ulrich:
muss Dich leider enttäuschen.

Wenn ich mich recht erinnere, hat selbst Jörg Wunsch keine andere Lösung 
als die oben genannte parat gehabt (was soviel heisst wie: es gibt keine 
andere).

Bei Verwendung von PSTR kommen u.a. folgende Fehler:

test.c:299: error: braced-group within expression allowed only inside a 
function
test.c:299: error: initializer element is not constant

Ohne PSTR und PROGMEM direkt eiingesetzt:
1
const bef_struct_typ PROGMEM bef_tab2[] = {
2
  {((const PROGMEM char *)("test")), 1},
3
  {help_str, 2}
4
};
läuft zwar ohne Fehler durch. Der String wird aber im RAM angelegt 
PROGMEM also komplett ignoriert.

Gruß, Stefan

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.