Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial Internet of Things >> Ingebed

Unions in C voor Efficiënte Dataverpakking en Uitpakken

Unions in C voor Efficiënte Dataverpakking en Uitpakken

Unions bieden een krachtige, geheugenefficiënte manier om dezelfde bytes als verschillende datatypen te interpreteren. Hoewel oorspronkelijk bedoeld voor gedeeld geheugen onder wederzijds exclusieve variabelen, gebruiken moderne C-programmeurs unions vaak voor dataverpakking, uitpakken en type punning – vooral bij het afhandelen van seriële protocollen of low-level communicatie.

Hoe een Union Geheugen Deelt

Alle leden van een union delen dezelfde geheugenregio. Het grootste lid bepaalt de grootte van de union, en elk lid begint op hetzelfde adres.

union { uint16_t word; struct { uint8_t byte1; uint8_t byte2; }; } u1;

Hier beslaat word twee bytes, geneste structuur splitst die twee bytes in byte1 en byte2. De layout kan gevisualiseerd worden als:

Unions in C voor Efficiënte Dataverpakking en Uitpakken

Twee Bytes Verpakken in een 16-bit Woord

Om twee 8-waarden x en y te combineren in een 16-bit woord, wij je ze toe aan de structuurleden en lees je het word lid:

u1.byte1 = y; u1.byte2 = x; uint16_t packed = u1.word;

Deze "data punning" is eenvoudig maar hangt af van de byte-volgorde van de processor.

Processor Endianness Is Belangrijk

Little-endian systemen slaan de minst significante byte eerst op, terwijl big-endian systemen de meest significante byte eerst opslaan. Overweeg de reeks 0x01020304:

Unions in C voor Efficiënte Dataverpakking en Uitpakken

Een eenvoudige test op een little-endian machine levert:

#include <stdio.h> #include <stdint.h> int main() { union { struct { uint8_t byte1; uint8_t byte2; }; uint16_t word; } u1; u1.byte1 = 0x21; u1.byte2 = 0x43; printf("Word is: %#X\n", u1.word); return 0; }

Uitvoer: Word is: 0X4321 – bevestigend little-endian opslag. Op een big-endian target zou dezelfde code 0X2143 produceren.

Bitwise Alternatief: Endianness-onafhankelijke Verpakking

Shiften en maskeren bieden een draagbare manier om een 16-bit waarde op te bouwen:

uint16_t word2 = (((uint16_t)byte3) << 8) | ((uint16_t)byte4);

Beide methoden vergeleken:

#include <stdio.h> #include <stdint.h> int main() { union { struct { uint8_t byte1; uint8_t byte2; }; uint16_t word1; } u1; u1.byte1 = 0x21; u1.byte2 = 0x43; printf("Word1 is: %#X\n", u1.word1); uint8_t byte3 = 0x21, byte4 = 0x43; uint16_t word2 = (((uint16_t)byte3) << 8) | ((uint16_t)byte4); printf("Word2 is: %#X\n", word2); return 0; }

Op een big-endian processor: Word1 is: 0X2143, Word2 is: 0X2143. Op een little-endian processor: Word1 is: 0X4321, Word2 is: 0X2143. De bitwise benadering garandeert consistente resultaten over architecturen heen.

Praktisch Voorbeeld: Een Float Versturen via UART

Seriële links versturen meestal één byte per keer. Om een 32-bit float te versturen, kunnen we een union gebruiken om de float te bekijken als een array van vier bytes:

union buffer { float f; struct { uint8_t byte[4]; }; };

Zijde van verzenden:

union buffer tx; union buffer rx; float f1 = 5.5f; tx.f = f1; for (int i = 0; i < 4; ++i) { // send tx.byte[i] over UART rx.byte[i] = tx.byte[i]; // Simulated receive } printf("The received data is: %f\n", rx.f); 

Uitvoer: The received data is: 5.500000. De union scheidt de byte-representatie netjes van de floating-point waarde, waardoor de code leesbaar en onderhoudbaar blijft.

Unions in C voor Efficiënte Dataverpakking en Uitpakken

Belangrijkste Inzichten

  • Unions staan type punning toe, maar resultaten hangen af van endianness.
  • Bitwise operatoren bieden draagbare, architectuur-onafhankelijke verpakking.
  • Voor duidelijkheid en onderhoud favoriseren veel ontwikkelaars nog steeds unions in embedded contexten.
  • Unions schitteren bij het verzenden van willekeurige datastructuren over byte-georiënteerde links.

Om meer te ontdekken over C, unions en embedded systemen, blaader door mijn complete lijst met artikelen.

Ingebed

  1. VS Leger Verbetert Voorwaardelijke Onderhoud met Innovatieve Sensoren en Predictieve Analyse
  2. Litmus En Oden Lanceren Geïntegreerde IIoT-oplossingen Voor Slimme Productie
  3. Ketenvisibiliteit Ontgrendelen: De Cruciale Rol van Data en Context
  4. Vlootbeheer revolutioneren: AI & IoT integratie voor slimmere operaties
  5. Semaphores in Nucleus RTOS: Utility Services & Datastructuren
  6. CyrusOne Verbetert Gebruikerservaring Met Realtime Applicatiemonitoring
  7. Hoe IIoT & Data Analytics EHS transformeren: Veiligheid, efficiëntie en besparingen verhogen
  8. Verantwoorde en betrouwbare AI bouwen: een gids voor uitlegbaarheid, accountability en ethiek
  9. Fog Computing Uitgelegd: IoT Datastroom Transformerend en Cloudbelasting Reducerend
  10. Industriële AIoT: AI en IoT samensmelten om Industry 4.0-innovatie te drijven
  11. C-unions: Efficiënt geheugenbeheer voor meerdere datatypes