Martin 567 schrieb:
> gibt es nicht die möglichkeit im Studio 6 etwas umzustellen?
Du willst alse explizit, dass Code mit undefiniertem Verhalten
akzeptiert wird? Dann siehe oben: -D__PROG_TYPES_COMPAT__ als
Compiler-Option ist dein schlechter Freund.
Wilhelm K. schrieb:
> Uuuups! Das verblüfft mich nun total. Wie kann man dann noch
> unterscheiden, ob eine Variable im SRAM oder im Flash liegt?
PROGMEM aka. __attribute__((progmem)) funktioniert ähnlich wie das
section-Attribut: Es bestimmt die Ablage, d.h. die Section, des damit
markierten Objekts.
Im folgenden Beispiel liegen alle p1...p4 im Flash (Section
.progmem.data, denn PROGMEM wirkt auf das jeweils definierte Objekt,
nämlich p1...p4:
1 | #include <stdlib.h>
|
2 | #include <avr/pgmspace.h>
|
3 |
|
4 | // p1 liegt im Flash (.progmem.data) und wird mit
|
5 | // NULL initialisiert.
|
6 | char * const p1 PROGMEM = NULL;
|
7 |
|
8 | // p2 liegt im Flash und wird mit der Adresse eines
|
9 | // String-Literals initialisier, das "P2" enthält.
|
10 | // Das Literal liegt im RAM (.rodata).
|
11 | char * const p2 PROGMEM = "P2";
|
12 |
|
13 | // p3 liegt im Flash und wird mit "P3" initialisiert.
|
14 | char const p3[] PROGMEM = "P3";
|
15 |
|
16 | // p4 liegt im Flash und wird mit der Adresse eines
|
17 | // String-Literals initialisier, das "P4" enthält.
|
18 | // Das Literal liegt im RAM (.rodata).
|
19 | const char PROGMEM * const p4 = "P4";
|
Am Beispiel p4 sieht man, daß prog_char nicht einfach durch char PROGMEM
ersetzt werden darf.
Ich rate davon ab, __PROG_TYPES_COMPAT__ zu verwenden, denn das progmem
in Typedefs hatte nie ein definiertes/dokumentiertes Verhalten. Die
GCC-Dokumentation definiert diese Attribut ausschließlich für
Deklarationen und nicht für Typen.
Man kann nun auf avr-gcc schimpfen und fragen, warum er progmem in
typedef je akzeptiert hat. Das war ein Designfehler, der nicht
korrigiert wurde, weil niemand ihn als so wichtig erachtete, es in
avr-gcc einzupflegen.
Die AVR-Libc wiederum hat das Feature fleissig verwendet nach dem Motto
"alles was keine Warnung bringt ist in Ordnung", obwohl progmem für
Typen nie dokumentiert war. Es ist einzig und allen für Deklarationen
dokumentiert und im Compiler unterstützt.
Ich für meinen Teil verwende die Zeit, die ich auf avr-gcc verwende,
lieber auf Dinge, die den Compiler weiter bringen, anstatt Aufwand in
Features zu stecken, die nie dokumentiert waren und auch keine neue
Funktionalität bringen.
Jeder, der seine Prioritäten bei der avr-gcc Entwicklung anders gesetzt
hat, kann natürlich die entsprechende Erweiterung zum Compiler
beitragen.
Und die Anwender von avr-gcc sind gut damit beraten, die Dokumentation
zu lesen...