[AVR] Strings im Flash mit __flash

OP #5009616
Hi,

für eine kleine (Debug-)Shell benutze ich allgemein eine Tabelle mit den 
unterstützten Befehlen, also:
1
struct cmd {
2
  char *cmd;
3
  int  (*func)(char *args);
4
  char *help;
5
};
6

7
static const struct cmd cmds[] = {
8
  { "help", cmd_help, "Show help." },
9
  { "read", cmd_read, "Read value." },
10
}

Gibt es eine elegante Möglichkeit, die Tabelle und auch alle Strings in 
den Flash zu verbannen, ohne sie (klassisch mit PROGMEM) einzeln 
deklarieren zu müssen? Mit "const __flash char *cmd __flash" oder so 
sollte es ja gehen, aber wie sieht ein dazu passender Initializer aus?

Hat da jemand zufällig was funktionierendes rumliegen? Foren- und 
Artikelsuche hat spontan nichts passendes ergeben, zumindest nichts, was 
ich auf Anhieb hinbekommen hätte.

Gruß,
svenska
#5009634
1
#define FSTR(X) ((const __flash char[]){X})
2

3
struct cmd {
4
  const __flash char *cmd;
5
  int  (*func)(char *args);
6
  const __flash char *help;
7
};
8

9

10
static const __flash struct cmd cmds[] = {
11
  { FSTR("help"), cmd_help, FSTR("Show help.") },
12
  { FSTR("read"), cmd_read, FSTR("Read value.") },
13
}
#5010235
S. R. schrieb:
> Ein printf_P("%s", cmds[0].cmd) funktioniert nicht, weil das "%s" ja im
> RAM steht und nicht im Flash.

%s -> %S

Und wenn du die _P-Variante benutzt, muss natürlich der Formatstring 
selber auch ins Flash: PSTR("%S")

S. R. schrieb:
> Außerdem nutze ich ja kein PROGMEM...

Für die Funktion spielt es keine Rolle, auf welche Weise du den String 
ins Flash befördert hast.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.