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 Structuren: Praktische Gids voor Definitie, Gebruik en Geheugenoptimalisatie

Structuren zijn een hoeksteen van efficiënte embedded C-programmering. In dit artikel verkennen we hun praktische toepassingen, de syntaxis voor declaratie, en de impact van data-uitlijning op geheugengebruik. Door strategisch structuurleden te ordenen, kun je vaak de voetafdruk van je data-objecten verkleinen, een kritieke overweging in resource-beperkte omgevingen.

Dit artikel biedt een beknopt maar uitgebreid overzicht van structuren in embedded C. We behandelen hun real-world toepassingen, hoe je ze correct declareert, en de subtiele regels van data-uitlijning die de grootte van je structuren beïnvloeden.

Structuren

Wanneer verschillende variabelen van hetzelfde type een logische relatie delen, is een array een handige groepering. Bijvoorbeeld, om de laatste 50 samples van een ADC die steminput digitaliseert te houden, kun je gebruiken:

uint16_t voice[50];

Hier is uint16_t een unsigned 16-bit integer gedefinieerd in stdint.h, wat consistente grootte over platforms garandeert.

Maar wat als je variabelen van verschillende typen moet groeperen – zeg, een array van samples en de samplefrequentie van de ADC? Ze apart declareren als onafhankelijke variabelen creëert onnodige overhead. In plaats daarvan kun je ze inkapselen in een structuur:

struct record { uint16_t voice[50]; float sample_rate; };

De record structuur bevat nu zowel een array van uint16_t als een float in een enkel, logisch verbonden data-object.

Waarom Zijn Structuren Belangrijk?

Structuren stellen je in staat om heterogene variabelen te associëren in een cohesieve eenheid, wat manipulatie vereenvoudigt en leesbaarheid verbetert. Ze vormen de basis van complexere datastructuren, zoals gelinkte lijsten en berichtbuffers, die alomtegenwoordig zijn in embedded communicatie en sensordata-afhandeling.

Bijvoorbeeld, memory-mapped peripherals op microcontrollers worden vaak voorgesteld als structuren die de hardware-registerlayout spiegelen, wat directe registertoegang via lid-syntax toestaat.

Embedded C Structuren: Praktische Gids voor Definitie, Gebruik en Geheugenoptimalisatie

Figuur 1. Structuren kunnen gebruikt worden om een gelinkte lijst te implementeren.

Embedded C Structuren: Praktische Gids voor Definitie, Gebruik en Geheugenoptimalisatie

Figuur 2. Geheugencartografie van een STM32 MCU. Image courtesy of Embedded Systems with ARM.

Een Structuur Declareren

Eerst definieer je een structuur-template. Overweeg dit voorbeeld:

struct record { uint16_t voice[4]; float sample_rate; };

De template zelf verbruikt geen geheugen; allocatie vindt alleen plaats wanneer je een variabele van dat type declareert:

struct record mic1;

Nu beslaat mic1 voldoende ruimte voor vier uint16_t elementen en één float. Benader leden via de dot-operator:

mic1.voice[0] = 100; float fs = mic1.sample_rate;

Andere Manieren om een Structuur te Declareren

Hoewel het meest voorkomende patroon de structuur eerst definieert en daarna variabelen declareert, biedt C alternatieve syntaxis:

Syntaxis 1: Tag en variabele samen

struct record { uint16_t voice[4]; float sample_rate; } mic1;

Opvolgende variabelen kunnen apart gedeclareerd worden:

struct record mic2;

Syntaxis 2: Anonieme template

struct { uint16_t voice[4]; float sample_rate; } mic1;

Hier kun je de template niet elders hergebruiken omdat hij geen naam heeft.

Syntaxis 3: Anonieme geneste structuur

struct test { struct { float f; char a; }; } test_var;

Benader de innerlijke leden direct:

test_var.f = 1.2f;

Anonieme structuren verminderen verbositeit maar moeten terecht gebruikt worden voor duidelijkheid.

Geheugenlayout voor een Structuur

De C-standaard garandeert dat leden in het geheugen sequentieel worden uitgelegd, in de volgorde van declaratie. Bijvoorbeeld:

struct Test2 { uint8_t c; uint32_t d; uint8_t e; uint16_t f; } MyStruct;

Op een 32-bit machine is sizeof(MyStruct) 12 bytes vanwege padding die uint32_t uitlijnt op een 4-byte grens. Het herordenen van leden kan padding elimineren:

struct Test2 { uint32_t d; uint16_t f; uint8_t c; uint8_t e; } MyStruct;

Nu daalt sizeof(MyStruct) naar 8 bytes – waardevolle besparing in geheugenbeperkte firmware.

Embedded C Structuren: Praktische Gids voor Definitie, Gebruik en Geheugenoptimalisatie

Figuur 3. Data-uitlijning kan padding toevoegen aan het geheugenlayout van een structuur.

Samenvatting

  • Structuren laten je heterogene variabelen bundelen in een enkele, beheersbare eenheid, wat codehelderheid en efficiëntie verbetert.
  • Aangepaste datastructuren ondersteunen taken zoals inter-apparaat messaging en sensordata-opslag.
  • Ze zijn essentieel voor het mappen van hardware-registers in memory-mapped peripherals.
  • Leden herordenen om uitlijning te respecteren kan de structuurgrootte aanzienlijk reduceren.

Verkennen meer van onze embedded C tutorials hier.

Ingebed

  1. Industrial Internet of Things (IIoT): definitie, scope en industriële impact
  2. Onderhoudsdata Uitgelegd: De Sleutel Tot Betrouwbaar Assetbeheer
  3. Moderne Houtbewerking Beheersen: Trends, Technologie en Technieken
  4. Wat zijn dubbelvouwscharnieren? Kenmerken, voordelen en toepassingen
  5. Terrassenschroeven Uitgelegd: Typen, Voordelen en Vergelijking Met Houtschroeven
  6. Veer-geënergiseerde Afdichtingen: Ontwerp, Functie en Industriële Voordelen
  7. Houtschroeven Uitgelegd: Typen, Kenmerken En Selectietips
  8. Staallegeringen uitgelegd: typen, samenstelling en toepassingen
  9. Data benutten in het Internet of Reliability: Strategieën voor effectief beheer
  10. Wat zijn refractaire metalen? Een expertoverzicht van hun eigenschappen en toepassingen
  11. Java Data Structures: Kernklassen & Collections Framework Verkend