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 Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Leer hoe je C-arrays initialiseert met behulp van externe tekstbestanden.

Deze handleiding legt uit hoe je arrays in een C-programma vult met data opgeslagen in aparte tekstbestanden. De waarden zijn niet in de broncode ingesloten; in plaats daarvan worden ze op compiletijd geladen. We behandelen eendimensionale en multidimensionale arrays, tonen hoe je kunt bepalen of de array in RAM of niet-vlatiel geheugen blijft, en illustreren hoe je kiest tussen meerdere databestanden voor initialisatie.

De voorbeelden richten zich op een 32-bit ARM microcontroller en worden gecompileerd met GCC. Alle codefragmenten gebruiken standaard C en werken met deze compiler.

Basisprincipes van Array-initialisatie

Wanneer je een array in C declareert, kun je een lijst met waarden – bekend als initializers – tussen accolades opgeven. Bijvoorbeeld:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Als je de grootte tussen haakjes weglaat, levert de compiler deze af uit het aantal initializers. Als de array groter gedeclareerd is dan de initialisatielijst, krijgen de overige elementen standaard de waarde nul. Meer initializers opgeven dan de gedeclareerde grootte leidt tot een compilatiefout.

Witruimte

Initializers worden gescheiden door komma's, en je kunt vrij witruimte toevoegen – spaties, tabs, nieuwe regels, carriage returns, verticale tabs of form feeds – ertussen. In C mogen statements over meerdere regels lopen; dit is bijzonder nuttig voor grote arrays die verschillende pagina's broncode kunnen vullen.


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Array Initialiseren vanuit een Bestand

De C-preprocessor kan willekeurige tekstbestanden includeren met de #include directive. Deze functie is niet beperkt tot header- of bronbestanden; elk platte tekstbestand is acceptabel. Een eenvoudig bestand met getallen, komma's en witruimte kan gebruikt worden om een array te initialiseren:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Het includebestand moet platte tekst zijn – geen rich-text opmaak, headers of andere artefacten. Een snel voorbeeld aangemaakt met Windows Kladblok ziet er zo uit:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Na compilatie verschijnt de array in het geheugen zoals getoond in de debuggerscreenshot. In dit geval blijft de array in RAM, aangegeven door de hoge adressen in de kolom "Location".


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Array Opslaan in Niet-vlatiel Geheugen en Databestand Selecteren

In het bovenstaande voorbeeld is de array een globale variabele zonder expliciete plaatsing. De compiler veronderstelt dat deze tijdens runtime gewijzigd kan worden, dus plaatst hij de variabele in RAM. De initiële waarden liggen in niet-vlatiel geheugen (meestal Flash) en een opstartroutine kopieert ze naar RAM. Als de array echt constant is, vertelt const de compiler hem alleen in Flash te houden, wat kostbaar RAM bespaart. De volgende screenshot toont het effect: de "Location" van de array wijst naar lage Flash-adressen.


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Je kunt #define en #if directives gebruiken om te schakelen tussen RAM- en Flash-opslag, of om verschillende databestanden voor initialisatie te kiezen. Bijvoorbeeld, de volgende code laat je de opslaglocatie op compiletijd kiezen:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Het #if construct is een klassiek voorbeeld van conditionele inclusie. Het bepaalt of de const qualifier wordt toegepast op basis van een compiletijd-vlag.

Op dezelfde manier kun je conditioneel selecteren welk bestand de initiële data levert:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Testen met een Grote Array

Om de techniek te valideren, heb ik een 10.000-sample ruisgolfvorm gebruikt opgeslagen in een CSV-bestand. De onderstaande plot toont de golfvorm, terwijl de declaratie demonstreert hoe de data in het programma geïncorporeerd wordt:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven
 

Het originele CSV-bestand had geen komma's na elke waarde. Met een reguliere-expressie zoeken/vervangen (zoeken naar \R en vervangen door ,\R) werden komma's aan alle 10.000 items in één operatie toegevoegd.

De resulterende array is zichtbaar in de debugger, netjes gegroepeerd in rijen van 100 elementen.


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Multidimensionale Arrays

Bij het werken met twee- of driedimensionale data, onthoud dat C arrays in row-major volgorde opslaat. Bijvoorbeeld, een uint16_t test[2][3] array ligt in het geheugen als:

[0,0] [0,1] [0,2] [1,0] [1,1] [1,2]

Het benaderen van opeenvolgende elementen langs de rechtermoste index is sneller omdat de data contigu is. Als je twee vectoren van 1.000 samples nodig hebt, declareer test[2][1000] voor optimale cache-vriendelijkheid.

De initialisator voor een tweedimensionale array wordt normaal gegroepeerd met geneste accolades:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Je kunt de outer accolades echter weglaten; de compiler vult de array dan links-naar-rechts. Het geeft een waarschuwing: missing braces around initializer. Mits het totale aantal waarden overeenkomt met de arraygrootte, compileert de code.


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Om de data over meerdere bestanden te spreiden, includ je elk bestand in volgorde, met de gehele lijst omhuld door een paar accolades:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Arrays Initialiseren in Unions

Een union stelt verschillende typen in staat om hetzelfde geheugen te delen. Bijvoorbeeld, een union met een eendimensionale vector en een tweedimensionale matrix bezet hetzelfde adresbereik:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Bij initialisatie vult de compiler het eerste lid eerst. Als de volgorde omgekeerd is, kun je een waarschuwing zien omdat de initialisatielijst niet volledig geaccoladeerd is. Dubbele accolades rond de #include zorgen voor de juiste groepering:

Het databestand voor de union ziet er zo uit:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

In het geheugen beginnen zowel vector als matrix op dezelfde locatie, zoals getoond in de debugger:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

Ken je nog een andere methode om een multidimensionale array te initialiseren vanuit een enkel numeriek bestand? Deel je ideeën in de reacties.

Bonustip: Strings

Een string initialiseren vanuit een extern bestand vereist dat de aanhalingstekens in het bestand zelf staan. Een direct #include binnen de string-literal breekt de compiler. Plaats in plaats daarvan de quotes in het bestand en include het als volgt:


Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven

De resulterende string blijft in RAM, zoals geïllustreerd in de screenshot.

 

Embedded Firmware: Best Practices voor Initialiseren van C-Arrays met Externe Bestandsdata en Signaalgolven


Deze voorbeelden zijn theoretisch en zouden met elke standaard C-compiler moeten werken. Als je compiler-specifieke kwabbelaties tegenkomt, laat het ons weten in de reacties.

Bron geleverd.

Ingebed

  1. Nexus Integra Vergeleken met Toonaangevende IoT & Big Data Platforms
  2. STMicroelectronics lanceert STM32Cube.AI – edge‑apparaten versterkt met embedded neural networks
  3. DATA MODUL lanceert ultra-helle 21,5" & 31,5" open-frame monitors met EasyTouch voor outdoor & indoor gebruik
  4. Microchip introduceert 24-bit & 16-bit Delta-Sigma ADCs met 153,6 kSPS data-rates
  5. Contrinex 2020: cloud-klaar sensoren & Bluetooth lichtgordijnen voor veiligheid
  6. De Cloud Revolutie: Hoe Cloud Computing IT, Beveiliging en Carrières Transformeert
  7. IoT Tot Leven Brengen Met IBM & Tech Data – Deel 2
  8. IoT Naar Realiteit Omzetten: Tech Data & IBM Inzichten – Deel 1
  9. C++ Arrays Ontmaskerd: Declaratie, Initialisatie en Pointer‑Technieken
  10. C++ Dynamische Array‑Allocatie: Praktische Handleiding met Code‑Voorbeelden
  11. Bestanden Lezen in Java met BufferedReader – Een Praktische Gids met Voorbeelden