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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren