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

Embedded C Unions Uitgelegd: Efficiënt Geheugendelen & Messaging

Unions in Embedded C Begrijpen

In embedded systemen is een union een krachtige datastructuur waarmee je verschillende datatypen op dezelfde geheugenlocatie kunt opslaan. Dit artikel wandelt door de fundamenten van unions, toont praktische voorbeelden en legt uit waarom ze een go-to tool zijn voor geheugenbeperkte en bandbreedte-gevoelige applicaties.

Het Verschil Tussen Structuur en Union in Embedded C

Eerder behandelden we structuren: een manier om heterogene variabelen in een enkele entiteit te groeperen. In C zijn unions een complementaire constructie die ook verschillende typen groepeert, maar met een cruciale onderscheid – elk lid deelt hetzelfde geheugenadres.

Inleidend Voorbeeld

Een union declareren is bijna identiek aan een structuur declareren; je vervangt struct door union:

union test { uint8_t c; uint32_t i; };

De template definieert twee leden: c beslaat één byte, en i beslaat vier bytes. Om een variabele van dit type te maken:

union test u1;

Leden benaderen gebruikt de dot-operator:

u1.i = 10; m = u1.c; // m moet uint8_t zijn

Omdat de opslaggrootte van een union gelijk is aan de grootte van het grootste lid, beslaat u1 vier bytes. Schrijven naar i overschrijft hetzelfde geheugen dat c zou gebruiken, dus de twee leden zijn wederzijds exclusief.

Hebben We Gedeeld Geheugen Nodig?

Stel je twee embedded apparaten voor, Apparaat A en Apparaat B, die status-, snelheids- en positiedata uitwisselen (zie Figuur 1). De data-items en hun groottes zijn:

Embedded C Unions Uitgelegd: Efficiënt Geheugendelen & Messaging

Figuur 1
Variabele Grootte (bytes) Betekenis
power 1 Batterijlading
op_mode 1 Bedrijfsmodus
temp 1 Omgevingstemperatuur
x_pos 2 X-coördinaat
y_pos 2 Y-coördinaat
vel 2 Snelheid

Als Apparaat B elk stuk informatie vereist, zou een simpele structuur negen bytes nodig hebben, en elke communicatieronde zou een 9-byte frame overdragen (zie Figuur 2). In veel real-world scenario's zijn de drie berichttypen echter wederzijds exclusief: soms alleen status, soms alleen positie, soms alleen snelheid. In dat geval is de grootste payload vier bytes (het positiebericht). Een union die een vier-byte buffer deelt, kan elk van de drie berichten bevatten, wat de framegrootte van negen naar vier bytes reduceert (zie Figuur 3).

Embedded C Unions Uitgelegd: Efficiënt Geheugendelen & Messaging

Figuur 2

Embedded C Unions Uitgelegd: Efficiënt Geheugendelen & Messaging

Figuur 3

Unions Gebruiken voor Berichtpakketten

Hieronder maken we twee structuren – één voor status en één voor positie – en sluiten ze in een union samen met het snelheidsveld:

struct status_s { uint8_t power; uint8_t op_mode; uint8_t temp; }; struct position_s { uint16_t x_pos; uint16_t y_pos; }; union msg_union { struct status_s status; struct position_s position; uint16_t vel; };

De grootte van de union is vier bytes (de grootte van position_s), gedeeld onder alle drie berichttypen.

Hoe Je Bijhoudt Welk Union-lid Actief Is

Wanneer een ontvanger een union leest, moet hij weten welk lid geldig is. Het gangbare patroon is een getagde union: een apart veld dat het actieve lid registreert. We kunnen een een-byte msg_type voor de union plaatsen:

struct message_s { uint8_t msg_type; // 's' = status, 'p' = positie, 'v' = snelheid union { struct status_s status; struct position_s position; uint16_t vel; } msg; };

Door de msg_type byte samen met de union te transmitteren, kan de ontvanger de payload correct interpreteren zonder vooraf kennis van de vorm.

De Alternatieve Oplossing: Dynamische Geheugenallocatie

Een andere aanpak is geheugen dynamisch te alloceren voor elk berichttype. De zender zou msg_type instellen en net voldoende bytes alloceren voor die payload. De ontvanger zou de binnenkomende data interpreteren op basis van msg_type en het geheugen vrijgeven wanneer klaar. Hoewel dit iets meer geheugenefficiënt kan zijn, introduceert dynamische allocatie runtime overhead en de noodzaak voor expliciete deallocatie, weshalb veel embedded ontwikkelaars de statische union-strategie prefereren.

Volgende: Toepassingen van Unions

Unions worden ook vaak gebruikt om kleinere datastukken uit een groter woord te halen – een techniek die bijzonder waardevol is bij het parsen van communicatieprotocollen of hardwareregisters. Blijf op de hoogte voor het volgende artikel in deze serie, waar we dieper op die use cases ingaan.

Om meer artikelen over embedded C te verkennen, bezoek de artikelindex.

Ingebed

  1. De kracht van de cloud voor IoT: naadloze connectiviteit en datainzichten ontgrendelen
  2. Robotprogrammering begrijpen: Methodes uitgelegd
  3. Microprocessor programmeringsfundamenten
  4. De 9 programmeertalen die je in 2021 moet leren ontdekken
  5. Compressor-eenheden meesteren: Duidelijke gids voor algemene meettermijnen
  6. Embedded Systeem Programmeren: Talen, Architectuur en Toepassingen
  7. De Ideale Programmeertaal Kiezen voor Industriële IoT-Oplossingen
  8. Data benutten in het Internet of Reliability: Strategieën voor effectief beheer
  9. Internet of Things democratiseren: Next-gen Satelliet IoT brengt universele, betaalbare connectiviteit
  10. De Toekomst Van Datacenters: Trends, Tech En Duurzaamheid
  11. C-unions: Efficiënt geheugenbeheer voor meerdere datatypes