www.mikrocontroller.net

Forum: Compiler & IDEs struct mit strings im flash unterbringen


Autor: axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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__... 
kennt viel und ich wenig...
Danke
typedef struct {
  const prog_char *name;
  char (*func)(char *);
}bef_struct;

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

char bef_pars( char *buf ) {
...
  if (!strcmp(buf, bef_tab[i].name)) {
  return bef_tab[i].func(&buf[p + 1]);
  }
...
}

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht nur über einen Umweg:
const uint8_t PROGMEM led_str[] = "led";
const uint8_t PROGMEM help_str[] = "help";

const bef_struct_typ PROGMEM bef_tab[] = {
  {led_str, led},
  {help_str, help},
  {empty_str, NULL}
}
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:
my_str_ptr = pgm_read_word (&(bef_tab[0].name));
erst danach kannst Du auf die Zeichen des Strings wiederum z.B. per
my_char = pgm_read_word(my_str_ptr);
zugreifen.

Gruß, Stefan

Autor: axel (Gast)
Datum:

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

Autor: Ulrich (Gast)
Datum:

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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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:
const bef_struct_typ PROGMEM bef_tab2[] = {
  {((const PROGMEM char *)("test")), 1},
  {help_str, 2}
};
läuft zwar ohne Fehler durch. Der String wird aber im RAM angelegt 
PROGMEM also komplett ignoriert.

Gruß, Stefan

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.