struct und PSTR

Gast #304799
Lesenswert?
• ▲
▼
Hallo,

für die Ansteuerung meines aktuellen Projects über RS232 habe ich mir
eine Struktur gebaut, die so aussieht:

struct _cmd_tbl_entry {
        unsigned char *cmd;
        uint8_t (*proc)(void);
};

Mit

struct _cmd_tbl_entry cmd_tbl[] PROGMEM = { .... };

kann ich die Datenstruktur in das Flash ablegen. Das schluckt auch der
avr-gcc (Version 4.0.1) noch. Aber wie kann ich die Strings in cmd in
den Flash legen. PSTR hat keinen Erfolg gebracht ...

Bisher mache ich es über RAM:
struct _cmd_tbl_entry cmd_tbl[] = {
        {"set_speed", 0},
        {"set_temp", 0},
        {0, 0}
};

Aber ich möchte das ganze ins Flash packen, weil der RAM ist ja sehr
wertvoll und die ganzen Daten sind statisch.

Ich weis: Anstelle der 0 sollte NULL stehen :)

- cl
Gast #304801
Lesenswert?
• ▲
▼
Genau :)

Aber irgendwie müsste das doch gehen. Mit google findet man leider
nicht allzuviel. Ich werde heute noch mal nen Workaround versuchen:
Vielleicht hilft es, die Strings vorher zu deklarieren und dann mit den
Adressen die Struktur zu füllen! Bemerkenswerterweise erwischt es den
avr-gcc bei der Makroexpansion von PSTR. Da spuckt er Fehler aus. Ich
probiere am besten auch gleich mal ne neue avr-libc aus.

- cl
Gast #304802
Lesenswert?
• ▲
▼
Also sowas funktioniert. Mit beiden avr-libc Versionen. Wenn mans
außerhalb einer Funktion definiert, d.h. global dann krachts!

void testit(void)
{
        struct _xyz {
                prog_char *x;
                uint8_t i;
        };

        struct _xyz x[] = {
                {PSTR("Hallo, World"), 2},
                {PSTR("Blah"), 4}
        };
}

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