PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitfelder beschreiben und kopieren



Marten83
30.09.2009, 17:46
Guten Abend,

ich stehe mal wieder vor einem Problem und würde gerne Eure Meinung dazu hören.

Ich habe verschiedene Daten mit unterschiedlichen Bitbreiten.
Zum Beispiel: ID (30 bit), Status (4 bit), Position (28 bit), etc.
Die möchte ich in einer Struktur "Pdata" speichern und dann in einen seriellen SRAM kopieren.

Nun die Frage: Kann ich die Struktur
struct Pdata
{
unsigned long int id:30;
unsigned char status:4;
signed long int position28;
}pos;

mittels Pointer, welcher immer um ein Byte inkrementiert wird um die Daten an die SPI-Schnittstelle zu übergeben, in das SRAM kopieren und auch so wieder auslesen?

Vielen Dank!

MfG, Marten83

cmock
30.09.2009, 18:14
du kannst daraus eine union machen:
union Pdata
{
struct _bf {
unsigned long int id:30;
unsigned char status:4;
signed long int position:28;
} bf;
unsigned char c[8];
} pos;

und dann über das array c auf die bytes einzeln zugreifen... das wär der IMHO elegantere weg. über den pointer geht's natürlich auch:
int i;
unsigned char *p;

for(p=(unsigned char*)&pos, i = 0; i < sizeof(pos); i++, p++)
printf("%02x ", *p);

cm.

Marten83
13.10.2009, 21:38
Ich habe das mal ausprobiert......

Erstmal danke für den Tipp, aber ich habe leider gemerkt und mittlerweile auch nachgelesen, dass die Reihenfolge der der einzelnen Feldelemente nicht mit der von mir vorgegebenen übereinstimmt.

Gibt es mit Winavr eine Möglichkeit das zu ändern?
Oder kann ich eine Stuktur in Inlineassembler erstellen womit das dann klappt?
Wenn ja, wie mache ich das?

MfG, Marten83

cmock
13.10.2009, 23:21
hmm... ich hab den code damals, als ich ihn gepostet hab, auch getestet und die erwarteten ergebnisse bekommen; allerdings nicht am AVR, sondern mit gcc unter linux.

aber ich schlaf auch nicht mit den C-standards unterm kopfkissen und hab daher keine ahnung, was zum memory-layout von structs wirklich vorgeschrieben ist...

cm.