Hallo Leutz,
bin ein purer Einsteiger und versuche gerade einen Atmega168 mit dem
AVR-gcc zu programmieren. Ziel ist es, Die TN AVR447, die ja in IAR-C
geschrieben ist, auf einen 'Standard'-C-Compiler zu portieren.
Anscheinend machen die Compiler aber unterschiedliches aus einem
Bitfeld:
Teil aus der Headerdatei:
1 | typedef struct PMSMflags
|
2 | {
|
3 | unsigned motorStopped : 1;
|
4 | unsigned motorSynchronized: 1;
|
5 | unsigned actualDirection : 2;
|
6 | unsigned desiredDirection : 1;
|
7 | unsigned driveWaveform : 2;
|
8 | } PMSMflags_t;
|
Normalerweise sollte das in ein Byte reinpassen (AVR-GCC-Tutorial). Bei
Atmel ist das nur eine temporäre Variable, die die Struktur an andere
Variablen mit den gleichen Bitnamen übergibt. So z.B. in main.c:
Dummerweise weist Atmel der Variable fastFlags das Register GPIOR0 zu.
Das scheint in IAR-C ganz einfach zu gehen:
1 | __io volatile PMSMflags_t fastFlags @0x1e;
|
Mir fällt blos nichts dazu in GCC ein. Laut Herold/Arndt entsteht dabei
auch eine Variable mit der Länge von 5 Bytes; dass die nicht in ein
Register passen war mir dann auch klar. Was anscheinend funktioniert hat
war ein:
1 | #define fastFlags GPIOR0
|
direkt danach. Ich habe fastFlags damit aber anscheinend umdefiniert.
Ich bekomme jedenfalls folgende Fehlermeldungen:
1 | error: incompatible types in assignment // wenn ich die Variable als ganzes anspreche
|
oder auch
1 | error: request for member 'motorSynchronized' in something not a structure or union // wenn ich die einzelnen Bits der Variable anspreche
|
Da ich unter SUSE Linux arbeite, möchte ich mir auch kein WinAVR
installieren. Ich weiss, ich mache was falsch. Ist einer so nett und
kann mir das mal erklären?