[AVR] Strings im Flash mit __flash

OP #5009616
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

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