mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik struct und PSTR


Autor: C. Lechner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bone (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...willkommen in der harvard-architektur...

Autor: C. Lechner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: C. Lechner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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}
        };
}

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.