Unions oder bit shiften????
-
Hallo ich habe mal eine Frage zum gutem programmier.
Ich möchte über SPI einen 32bit Wert übertragen der aus verschieden Information besteht. Jetzt fallen mir 2 Möglichkeiten ein wie ich den Wert für die SPI zusammen stellen kann. Zum einen lege ich mir eine Union an in welcher ich die einzelne Information ablege. Zum anderen könnte ich die betreffenden Information auch an die richtige Stelle shiften und dann alles verunden.
Welche Variante wurdet ihr nehmen?
Besten Dank schon mal.
-
Das heißt, du bekommst einen 32 Bit-Wert und willst diesen zum Beispiel in vier 8 Bit-Werte aufteilen? Auch wenn's streng genommen undefiniert ist, würde ich der Bequemlichkeit wegen eine Union nehmen und einfach davon ausgehen, dass es funktioniert. Denn den Compiler der da etwas anderes macht als man erwartet, muss man mir erst noch zeigen.
-
Nein der Wert für die SPI kann sich wie folgt zusammen setzen. Bit 26 bis 32 sind die Adresse für ein Register, Bit 20 gibt an ob es ein schreibe oder lese Befehl ist und in Bit 4 bis 12 stehen Daten wenn es ein lese Befehl ist. Alle anderen bits werden nicht benutzt.
-
Denis.Z schrieb:
Nein der Wert für die SPI kann sich wie folgt zusammen setzen. Bit 26 bis 32 sind die Adresse für ein Register, Bit 20 gibt an ob es ein schreibe oder lese Befehl ist und in Bit 4 bis 12 stehen Daten wenn es ein lese Befehl ist. Alle anderen bits werden nicht benutzt.
Die Details sind dir überlassen.
Falls du aber auch noch vollkommen plattformunabhängig sein möchtest und nicht auf Endianess achten willst, würde ich an deiner Stelle dann wohl doch eher rechnen. Insbesondere da deine Struktur ja wohl doch eher kompliziert ist und ein Bitfield oder etwas vergleichbares her müsste.
-
Denis.Z schrieb:
Nein der Wert für die SPI kann sich wie folgt zusammen setzen. Bit 26 bis 32 sind die Adresse für ein Register, Bit 20 gibt an ob es ein schreibe oder lese Befehl ist und in Bit 4 bis 12 stehen Daten wenn es ein lese Befehl ist. Alle anderen bits werden nicht benutzt.
Ich glaube, du verwechselst unions mit Bitfeldern.
-
Er meint wahrscheinlich sowas:
#ifndef BITBYTE #define BITBYTE #pragma pack(1); /******************************************************** * declare byte with accessible bits * ********************************************************/ typedef struct _bit_def_ { char b0:1; char b1:1; char b2:1; char b3:1; char b4:1; char b5:1; char b6:1; char b7:1; } bit_def; typedef union _byte_def_{ bit_def bit; char byte; } byte_def; #endif
Davon ist vieles konventionell und nichts davon ANSI-C. Läuft so auf fast allen meinen embedded- Compilern und unter Pelles C (Win32). pack ist nicht einheitlich, die Größe der kleinsten Zugriffseinheit auch nicht, nicht die Bitfields und die Endianness auch nicht. Also theoretisch nicht portabler Code.
Faktisch kriegt man es aber mit ein paar macros auf allen Plattformen zum Laufen, zumindest auf denen, die ich bedienen muß.