Forum: Mikrocontroller und Digitale Elektronik struct und PSTR


von C. Lechner (Gast)


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

von bone (Gast)


Lesenswert?

...willkommen in der harvard-architektur...

von C. Lechner (Gast)


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

von C. Lechner (Gast)


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}
        };
}

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Ich kann Dir zwar keine Antwort auf Deine Frage geben, dafür aber einen
- möglicherweise - hilfreichen Hinweis:

Du solltest keine underscores am Anfang Deiner Namen verwenden, das ist
durch den Standard den Entwicklern des Compilers bzw. dessen
Standardbibliothek vorbehalten.

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.