Blog

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.

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

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998787 806 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998788 869 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998788 27 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998788 900 Integrovane tipy pro firmware Jak spustit pole C s tvary

#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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998788 629 Integrovane tipy pro firmware Jak spustit pole C s tvary

#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í.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998788 528 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998789 525 Integrovane tipy pro firmware Jak spustit pole C s tvary

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998789 972 Integrovane tipy pro firmware Jak spustit pole C s tvary

Tady je začátek souboru.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998789 370 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998789 263 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998789 777 Integrovane tipy pro firmware Jak spustit pole C s tvary

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?

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998790 863 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998790 726 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998790 893 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998790 117 Integrovane tipy pro firmware Jak spustit pole C s tvary

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

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998790 381 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998790 913 Integrovane tipy pro firmware Jak spustit pole C s tvary

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.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998791 119 Integrovane tipy pro firmware Jak spustit pole C s tvary

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

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998791 461 Integrovane tipy pro firmware Jak spustit pole C s tvary

Pak použijte takovou frázi.

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998791 349 Integrovane tipy pro firmware Jak spustit pole C s tvary

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

Integrované tipy pro firmware: Jak spustit pole C s tvary ... 1602998792 363 Integrovane tipy pro firmware Jak spustit pole C s tvary


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.

Botón volver arriba
Cerrar

Bloqueador de anuncios detectado

¡Considere apoyarnos desactivando su bloqueador de anuncios!