Forum: Compiler & IDEs struct mit strings im flash unterbringen


von axel (Gast)


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
}

von Stefan K. (_sk_)


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

von axel (Gast)


Lesenswert?

von hinten durch die Brust... :)
Danke
Mal sehen ob ich es verwertet bekomme.

von Ulrich (Gast)


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!!!

von Stefan K. (_sk_)


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

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.