Forum: Mikrocontroller und Digitale Elektronik [AVR] Strings im Flash mit __flash


von S. R. (svenska)


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

von Stefan E. (sternst)


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
}

von S. R. (svenska)


Lesenswert?

Das funktioniert, danke.

Muss ich beim Zugriff auf die Strings etwas beachten? Ein printf("%s", 
cmds[0].cmd) gibt komische Dinge aus, auch wenn ich das Argument auf 
(const __flash *char) caste.

von Arduinoquäler (Gast)


Lesenswert?

S. R. schrieb:
> Muss ich beim Zugriff auf die Strings etwas beachten?

Vermutlich so (ähnlich):

Beitrag "Re: Array über konstante C-String im Flash"

von S. R. (svenska)


Lesenswert?

Ein printf_P("%s", cmds[0].cmd) funktioniert nicht, weil das "%s" ja im 
RAM steht und nicht im Flash. Außerdem nutze ich ja kein PROGMEM...

Warum muss das so kompliziert sein? :-)

von Stefan E. (sternst)


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.

von S. R. (svenska)


Lesenswert?

Stefan E. schrieb:
> %s -> %S

Ach, das ist also der Trick! Danke!
Den habe ich nirgends gesehen bisher.
Wirklich vielen Dank!

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.