Hi, portiere gerade ein AVR Projekt vom IAR zum GCC. Problem: Es gibt viele printf_P(...) im Projekt. Beim IAR gibt es aber das PSTR Makro nicht. Dort heißt es also z.B. printf_P("Hallo Welt"); Nun kann ich per Define folgendes machen: #define printf_P(X) printf_P(PSTR(X)) Das klappt dann bestens; zumindest für strcpy_P und Konsorten und für's obige Hallo Welt Beispiel auch. Wenn es aber mal folgendes gibt: printf_P("Wert = %d", tmp); haut das mit dem Define natürlich nicht mehr hin.... Frage: Weiß jemand, wie man ein Define basteln kann, damit es unabhängig von der Anzahl der Parameter funzt? Oder gibt es eine andere Lösung? Oder muss ich per Hand alles ändern :-( DANKE!!
1 | #if defined (__ICCAVR__) // IAR
|
2 | # define PRINTF_P(fmt, ...) printf_P(fmt, __VA_ARGS__)
|
3 | #elif defined (__GNUC__) // GCC
|
4 | # include <avr/pgmspace.h>
|
5 | # define PRINTF_P(fmt, ...) printf_P(PSTR(fmt), __VA_ARGS__)
|
6 | #else
|
7 | # error "Unknown compiler"
|
8 | #endif
|
Die Variante, alles String-Konstanten im ROM unterzubringen, ist aber bei IAR auch nicht der Standard, da sie inkompatibel zum C-Standard ist. Eine portable Implementierung, die den Formatstring unabhängig von den Compileroptionen im ROM unterbringt, ist nicht ganz trivial. Auch wenn es aus Faulheitsgründen einfacher scheint, printf_P() neu zu definieren, würde ich das nicht tun. Die Schreibweise PRINTF_P() macht dem geneigten Leser sofort klar, dass er sich bei Bedarf die Definition des Makros nochmal angucken sollte. Ein parameterloses printf_P() funktioniert übrigens mit obigem Makro nicht. Dafür müsstest du zur Not noch einen zweiten Makro machen (z. B. ECHO_P()).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.