- LiFePO4 Speicher Test         
Ergebnis 1 bis 4 von 4

Thema: bitfelder

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.11.2009
    Beiträge
    29

    bitfelder

    Anzeige

    E-Bike
    hallo,

    möchte einen kleinen netzwerk stack schreiben.

    dabei sieht der header wie folgt aus:

    8bit adresse
    2bit addressentyp
    4bit messagetype
    1bit ack
    1bit nack

    habe den hader also in eimen struct mit bitfeldern angelegt:

    Code:
    typdef struct
    {
     uint8_t adresse;
     uint8_t adresstype:2;
     uint8_t messagetype:4;
     uint8_t ack:1;
     uint8_t nack:1;
    }header_t;
    jetzt will ich das ganze versenden. zuerst die 8 bit adresse und dann die 8 bit restlichen header (ack, nack, messagetype....). gibt es eine möglichkeit auf die gesamten zweiten 8 bit zuzugreifen.

    soweit ich das verstanden habe, ist nicht garantierte, wie und wo der compiler die bitfelder ablegt. somit hat es mit pointern auch keinen sinn. oder verstehe ich da etwas falsch. das ganze sollte noch halbwegs schnell laufen, da recht viele pakete versendet werden.

    mfg

    dominik

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Bei solchen Problemen heisst das Zauberwort: "union"

    Hier mal ein Beispiel:
    Code:
    typedef union
    {
    	uint16_t Raw;
    
    	struct
    	{
    		uint16_t Command : 6;
    		uint16_t Address : 5;
    		uint16_t Toggle  : 1;
    		uint16_t Field   : 1;
    		uint16_t Start   : 1;
    	} Structured;
    } type_RC5_Frame;
    In diesem Fall kann auf den gleichen Speicherbereich wahlweise per "Structured" als Bitfeld, oder aber per "Raw" an einem Stück zugegriffen werden
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.10.2007
    Ort
    41462 Neuss
    Alter
    56
    Beiträge
    375
    Zitat Zitat von Felix G
    Bei solchen Problemen heisst das Zauberwort: "union"

    Hier mal ein Beispiel:
    Code:
    typedef union
    {
    	uint16_t Raw;
    
    	struct
    	{
    		uint16_t Command : 6;
    		uint16_t Address : 5;
    		uint16_t Toggle  : 1;
    		uint16_t Field   : 1;
    		uint16_t Start   : 1;
    	} Structured;
    } type_RC5_Frame;
    In diesem Fall kann auf den gleichen Speicherbereich wahlweise per "Structured" als Bitfeld, oder aber per "Raw" an einem Stück zugegriffen werden
    bei einem struct von bitfeldern kann der compiler im prinzip jedes bitfeld in einem eigenen word oder an beliebiger stelle speichern. greift man dann über ein union darauf zu, hat man keine controlle über die position der bitfelder. union garantiert nur, dass jeweils platz vorhanden ist für die daten die man ablegen will. dabei hat man keine garantie für die position.

    das kann natürlich trotzdem funktionieren, da compiler ja kein interesse daran haben, die dinge unnötig kompliziert zu machen. aber verlassen würde ich mich darauf nicht

    ich würde mir auf jeden fall mal die optimierungsoptionen des compilers anschauen.

    sicherer ist es vermutlich, über eigene masken auf bitfelder in einem uint16_t zuzugreifen.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    41
    Beiträge
    1.780
    Naja, sagen wir mal es kann nicht schaden den vom Compiler erzeugten Code zu überprüfen. Mein Beispiel wird vom AVR-GCC jedenfalls sinnvoll übersetzt, obwohl er es theoretisch auch anders machen dürfte.

    Das Verhalten, das der C99 Standard für Bitfelder vorschreibt, ist außerdem auf diese Art am leichtesten zu erreichen. Daher ist es wahrscheinlich, daß derartige Konstrukte von allen Compilern korrekt übersetzt werden.
    So viele Treppen und so wenig Zeit!

Berechtigungen

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

LiFePO4 Speicher Test