Integrované tipy pro firmware: Jak spustit pole C s tvary …

Tento článek ukazuje, jak inicializovat sekvence v programu C pomocí hodnot z textových souborů.
Tento článek ukazuje, jak inicializovat sekvence v programu C pomocí hodnot z textových souborů. Data se neukládají do zdrojových souborů. Soubory se načtou při kompilaci programu. Jsou diskutována jednorozměrná a vícerozměrná pole. Příklady také ukazují, jak řídit umístění polí v paměti RAM nebo v energeticky nezávislé paměti a jak zvolit datové soubory, které se mají použít pro inicializaci.
Kompilátor použitý v příkladech je GCC pro ARM zaměřený na 32bitový mikrokontrolér. Všechny příklady používají standard C a fungují s tímto překladačem.
Základy inicializace pole
Pole lze inicializovat pomocí „deklarovaných“ hodnot. Zde je typické prohlášení. Hodnoty ve složených závorkách se nazývají „inicializátory“.
Pokud velikost pole není uvedena v závorkách, velikost bude počet inicializátorů. Pokud má pole méně iniciátorů než jeho velikost, jsou další položky nastaveny na 0. Je chybou mít více iniciátorů, než je velikost pole.
Prostor
Iniciátoři musí být odděleni čárkami. Přidání „bílého místa“ je v pořádku. V tomto případě je prostor „prostorem“ nebo prostorem. Znaková sada mezer zahrnuje mezery (nebo mezery), tabulátor, nový řádek, návrat vozíku, vertikální tabulátor a podávání formulářů. Nový řádek a návrat vozíku se používají k označení konce řádku ve zdrojovém kódu C. Znám formulář krmiva, ale svislá karta?
Obecně platí, že příkazu C je jedno, zda obsahuje mezery nebo pokračuje na jiném řádku. Výraz zde odpovídá výše uvedenému. Je běžné vidět příliš mnoho řádků iniciátorů pro velká pole. Možná i stránky. V určitém okamžiku: „Existuje lepší způsob?“ Můžeme říci.

Spusťte sekvenci ze souboru
C zdrojový kód je spuštěn před preprocesorem před kompilací. Běžně používanou funkcí preprocesorů C je „zařazení souboru“. Zde je výňatek ze slavné knihy Kernighana a Ritchieho „Programovací jazyk“.
“Zahrnutí souborů usnadňuje správu sbírek.” # popsat a výrazy (Mimo jiné) “.
Přidal jsem kurzívu pro „mimo jiné“. Ačkoli obvykle zahrnujeme soubory „.c“ a „.h“, preprocesor se nestará o příponu názvu souboru. Jakýkoli textový soubor je v pořádku. Proto níže uvedená syntaxe funguje k inicializaci pole.

Soubor by neměl obsahovat speciální znaky, které jsou někdy skryté pro formátování dokumentu. Snažte se o to. Žádné formátování RTF. Sloupec nemá záhlaví. Pouze čísla, čárky a mezery. Zde je soubor vytvořený pomocí Poznámkového bloku Windows.

Pole v paměti zobrazené ladicím programem. V tomto případě je pole v RAM, jak je indikováno vysokými adresami ve sloupci Poloha.

Uložte sekvenci do energeticky nezávislé paměti a vyberte datový soubor
Ve výše uvedeném příkladu je pole globální proměnná a nic neurčuje, kam pole umístit. Kompilátor a linker předpokládají, že program může upravit pole a vložit jej do paměti RAM. Počáteční hodnoty jsou v energeticky nezávislé paměti („NVM“, obvykle Flash paměť) a sekvence v paměti RAM je inicializována z těchto dat pomocí kódu provedeného před hlavním programem. Program k těmto datům v NVM nepřistupuje. Pokud se pole nemá měnit (jedná se o „pevné“), umístí se jednoduše do NVM a program k němu přistupuje přímo. Tím se šetří RAM, která je často nedostatečná. Říkat kompilátoru a linkeru, aby nezměnili adresář a umístili jej do NVM obvykle “konstantní“Modifikátor. Zde je příklad a pohled na výsledek. Sloupec umístění ji zobrazuje pod mapou paměti, což je Flash paměť pro tento mikrokontrolér.

#definovat a #Ano Příkazy předzpracování lze použít k poskytnutí možností vyhledání pole a výběru datových souborů, které se mají použít pro inicializaci. Níže je uveden příklad, který nabízí řadu možností umístění v paměti RAM nebo NVM.

#Ano build je příkladem „podmíněného zahrnutí“. V tomto případě, “konstantní“Používá se při deklaraci kvalifikačního pole.” Funguje to, protože oznámení může být na více řádcích nebo jinými slovy, prázdné místo je v pořádku.
Níže je uveden příklad použití podmíněného zahrnutí k výběru souboru ke spuštění.

Zkuste velkou matici
Měl jsem velký náhodný datový soubor představující šumový průběh a použil jsem ho k otestování inicializace velké sekvence v NVM. Zde je graf dat a výrazu.


Tady je začátek souboru.

Za hodnotami v původním souboru CSV nebyly žádné čárky. Ty se snadno přidávají pomocí editoru, který může používat výrazy v operacích Najít / Nahradit. V tomto případě jsem použil příkaz oddělovače řádků „R“. Hledání bylo „R“ a Nahradit „, R“. Akce Najít / Nahradit přidala všechny čárky pro 10 000 hodnot.
Všechno fungovalo skvěle a kompilovalo se opravdu rychle! Tady je začátek matice v paměti. Debugger rozdělil obrazovku do skupin po 100 položkách.

Vícedimenzionální pole
Co když jsou data uspořádána do dvou nebo více dimenzí? Podívejme se na dvourozměrné pole deklarované jako Vyzkoušejte Uint16_t[2][3]. V jazyce C je pravý dolní index (3) jednorozměrné pole se sousedícími prvky v paměti. Levý dolní index (2) znamená, že existují dvě z těchto tří sad položek. Toto je rozložení paměti pro šest položek:
[0,0] [0,1] [0,2] [1,0] [1,1] [1,2]Pořadí v paměti je důležité, protože přístup k po sobě jdoucím položkám v paměti zvýšením pravého dolního symbolu je rychlejší než přístup k položkám zvýšením levého dolního symbolu, který vyžaduje „skákání“ do paměti. Pokud matice obsahuje dva vektory s 1 000 prvky, organizace důkaz[2][1000] pro rychlejší přístup
Zde je příklad spuštění dvourozměrného pole. Všimněte si, že iniciátoři jsou seskupeni s dalšími závorkami, které seskupují iniciátory pro jednorozměrná pole správného dolního indexu.

Tento formát vytváří problém pro datový soubor, který může obsahovat pouze čísla, čárky a mezery. Co se stane, když jsou odstraněny další složené závorky?

Kompilátor nejprve vyplní pole přechodem zleva doprava přes inicializátory se správným odsazením dolního indexu. Kompilátor, který používám, mi dává varování: „kolem spouštěče chybí složené závorky“Pokud je počet iniciátorů přesně stejný jako počet položek v poli, není problém.” Není však jasné, jak vyplnit pole, pokud neexistují závorky, které slouží jako vodítka, pokud nejsou stejné.
Pole lze naplnit z více souborů do více souborů. #Zahrnout výrazy. Zde je příklad, kde je inicializace zcela v závorkách. Vynechávám podrobnosti uvedené v příkladech výše.

Inicializace matic v odborech
Spojení je proměnná, která může obsahovat různé typy objektů, které sdílejí stejnou paměť, a kompilátor sleduje objekty, jako by to byly různé věci. Toto uspořádání může být užitečné pro vestavěnou aplikaci s nedostatkem paměti. Zde je příklad vektor[6] s jednou dimenzí a matice[2][3] dvourozměrné jsou dvě matice zaujímající stejná místa v paměti.

Pravidlo pro založení unie je první v unii (vektor[6]) naplněné iniciátory. Kompilátor vydá varování, pokud je pořadí polí obráceno, protože inicializátory nejsou plně uzavřeny v závorkách. Věnujte pozornost klíčům kolem. #Zahrnout iterace Myslím, že vnější sada se připojí k jakémukoli inicializátoru a vnitřní sada pro typ pole.
Tady je soubor. Mám dva řádky, ale to nevadí. Jen více prázdného místa.

Tady je matice v paměti. Poznamenejte si výchozí polohu vektor[ ] a matice[ ][ ] Jsou stejné.

Existují další způsoby, jak inicializovat vícerozměrná pole z jednoho souboru pouze s čísly, čárkami a mezerami? Dejte nám prosím vědět přidáním komentáře.
Bonusový tip: struny
A co ty struny? Zde je příklad inicializace řetězce.

Jeden #Zahrnout nefunguje v uvozovkách. Můj editor, který zná syntaxi C, mi dává spoustu otazníků a vlnitých podtržení. Znaky pro nové řádky a #Zahrnout oni jsou iniciátoři! Chudák redaktor byl zmatený. Tento nepořádek byl sestaven, ale řetězec je vyplněn znaky, které zde vidíme, nikoli ze souboru.

Řešením je dát uvozovky do souboru.

Pak použijte takovou frázi.

Uvozovky kolem názvu souboru, #Zahrnout nezpracovává syntaxi a inicializátory. Zde je výsledek v RAM.

Je důležité si uvědomit, že všechny vzorky by měly fungovat Teoreticky S jakýmkoli překladačem však mohou být některé příklady neobvyklé a způsobit problémy s některými překladači. Pokud narazíte na problém, dejte nám prosím vědět v komentářích.

