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.


  • Mod

    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.


  • Mod

    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ß. 🙂


Log in to reply