-
        

Ergebnis 1 bis 4 von 4

Thema: Bitfelder beschreiben und kopieren

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    Bitfelder beschreiben und kopieren

    Anzeige

    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
    Code:
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.07.2009
    Ort
    Wien
    Beiträge
    131
    du kannst daraus eine union machen:
    Code:
    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:
    Code:
    int i;
    unsigned char *p;
    
    for(p=(unsigned char*)&pos, i = 0; i < sizeof(pos); i++, p++)
      printf("%02x ", *p);
    cm.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.07.2009
    Ort
    Wien
    Beiträge
    131
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •