Misc

Optimalizácia kódu v mikrokontroléroch

Autor: Laura McKinney
Dátum Stvorenia: 4 Apríl 2021
Dátum Aktualizácie: 16 Smieť 2024
Anonim
Voltlog #232 - My New Prefered T12 Soldering Station KSGER V2.1S
Video: Voltlog #232 - My New Prefered T12 Soldering Station KSGER V2.1S

Obsah

Autor dokončil svoj posledný ročník inžinierskeho projektu pomocou mikrokontrolérov dsPic a získal rozsiahly prehľad o týchto zariadeniach.

Kód mikrokontroléra v jazyku C môže vyžadovať optimalizáciu v určitých pokročilých aplikáciách. Táto optimalizácia kódu sa praktizuje s cieľom znížiť dve zásadné veci:

  1. Veľkosť kódu: Mikrokontroléry môžu ukladať obmedzené údaje a pokyny z dôvodu obmedzenej veľkosti pamäte RAM. Preto je potrebné kód optimalizovať, aby bolo možné čo najefektívnejšie využiť dostupnú inštrukčnú a dátovú pamäť.
  2. Časy vykonania kódu: Mikrokontroléry sú sekvenčné zariadenia, ktoré vykonávajú jednu inštrukciu súčasne. Každá montážna inštrukcia spotrebuje určitý počet hodinových cyklov, aby sa mohla vykonať. Preto musí byť kód optimalizovaný, aby sa zabezpečilo, že vykoná požadovanú úlohu v čo najmenšom počte hodín alebo montážnych pokynov. Čím menej hodinových cyklov kód použije, tým rýchlejšie beží. To znamená, že aplikácie môžu bežať rýchlejšie, pretože časy na spracovanie sú minimalizované.

Tento článok predstavuje tipy a triky, ktoré je možné použiť na zníženie veľkosti a času vykonania kódu mikrokontroléra.


V prípade potreby sa na demonštráciu príkladov použije vývojové prostredie IDE spoločnosti Microchip MplabX.

Ako experimentálne merať čas vykonania kódu

Ak chcete získať predstavu o tom, koľko času v skutočnosti trvá spusteniu vášho kódu v reálnom čase, musíte ho experimentálne zmerať. Logický analyzátor sa dá pohodlne použiť na meranie času vykonania kódu a záujemcovia sa môžu na tento proces informovať odo mňa e-mailom. Okrem toho:

  • Niektorí prekladatelia majú schopnosť počítať hodiny, ktoré kód spotrebuje.
  • Niektoré debuggery, napríklad ICD 3 z mikročipu, môžu priamo merať čas vykonania pomocou stopiek.

1. Poznajte výkon procesora a veľkosť pamäte vášho mikrokontroléra

Nie vždy je to taktovacia frekvencia (Mhz), ktorá poskytuje skutočný obraz o rýchlosti spracovania mikrokontroléra, realistickejšou mierou je MIPS (mega inštrukcie za sekundu) alebo počet inštrukcií, ktoré dokáže MCU vykonať za sekundu.

MCU sa zvyčajne pohybujú od 60 do 70 MIPS v kategórii špičkových zariadení do 20 MIPS 8-bitových AVR. Mikrokontrolér s vysokou úrovňou MIPS bude pravdepodobne nákladnejší ako zariadenie nižšej triedy, takže tu máte kompromis medzi cenou a rýchlosťou spracovania.


Mikrokontroléry majú samostatnú pamäť na ukladanie údajov a programových kódov. Veľkosť oboch je uvedená v údajovom liste. Ak je váš kód podstatne väčší, možno budete potrebovať procesor MCU s väčšou veľkosťou pamäte.

2. Výber premenných pre optimalizáciu vo veľkosti kódu

Mikrokontroléry majú obmedzenú dátovú pamäť, obvykle v rozmedzí od 1 do 4 kB. V takom prípade je rozumné zvoliť najvhodnejší typ premennej podľa očakávaného rozsahu uloženého dátumu. V nasledujúcej tabuľke sú zhrnuté tieto premenné:

Súhrn premenných použitých v jazyku C.

Typ premennejVeľkosť v bajtochRozsah

bool

1

Iba 0 alebo 1

char

1


-128 až 127

int

2

-32 768 až 32 767

nepodpísané int

2

0 až 65 535

dlho

4

-2 147 483 648 až 2 147 483 647

plavák

4

Presné až na 6 desatinných miest

dvojitý

8

Presné až na 15 desatinných miest

dlhý dvojitý

10

Presné až na 19 desatinných miest

Príklad:

  • Ak sa majú pridať dve premenné X a Y a výsledok sa má uložiť v Z, ale očakáva sa, že hodnota Z bude po pridaní vyššia ako 65 535, potom sa Z môže vyhlásiť za dlhý a X a Y sa môžu vyhlásiť za nepodpísané. int sa tiež neočakáva, že hodnoty X a Y budú záporné. To ušetrí 04 bajtov v dátovej pamäti, ktoré by sa inak minuli, ak by sa všetky premenné deklarovali tak dlho.
  • Dve premenné X a Y, ktorých hodnoty sa očakávajú v celých číslach, sa majú rozdeliť, ale výsledok delenia môže poskytnúť desatinné miesto, potom X a Y možno vyhlásiť za int a výsledok možno vyhlásiť za float alebo dvojnásobok v závislosti na požadovaná presnosť.

Výber dátového typu môže byť zásadný pri deklarovaní polí obsahujúcich veľké množstvo prvkov.

3. Voľba premenných pre optimalizáciu v čase vykonania kódu

  • Je ustálenou skutočnosťou, že výpočty s pohyblivou rádovou čiarkou trvajú dlhšie ako výpočty s pevnou desatinnou čiarkou. Nepoužívajte premennú s pohyblivou rádovou čiarkou, kde sa nevyžaduje desatinná hodnota. Pracujte s nepodpísanými celými číslami všade, kde je to možné.
  • Lokálne premenné sú uprednostňované pred globálnymi premennými. Ak sa premenná používa iba vo funkcii, musí sa v nej deklarovať, pretože prístup k globálnym premenným je pomalší ako lokálne.
  • 8-bitový MCU nájde rýchlejšiu prístup k jednej premennej veľkosti bajtu a 16-bitový MCU nájde ľahšie prístupnú dvojbajtovú premennú kvôli dĺžke generovanej adresy.

4. Optimalizácia aritmetických operácií

Aritmetické operácie je možné optimalizovať nasledujúcimi spôsobmi.

  1. Namiesto vyhodnocovania sínusových alebo iných trigonometrických funkcií alebo iných operácií, ktorých výsledok je vopred známy v kóde, použite vyhľadávacie tabuľky vopred vypočítaných hodnôt.
  2. V prípade, že je sínusová vyhľadávacia tabuľka už uložená v pamäti, je možné kosínus vyhodnotiť posunutím ukazovateľa poľa o ekvivalent 90 stupňov.
  3. Spomedzi štyroch aritmetických operácií trvá delenie a násobenie najviac času na spracovanie, v praxi to môže byť v prípade hodnôt s pohyblivou rádovou čiarkou asi stovky mikrosekúnd.
  4. Namiesto delenia a násobenia používajte pokyny na posun bitov. Inštrukcia 3 na posun doprava slúži na delenie dvoma3 kde ako inštrukcia ľavého posunu 1 bude slúžiť na vynásobenie 21.

5. Pre intenzívne výpočty používajte mikrokontrolér schopný DSP

Niektoré mikrokontroléry majú vo svojej architektúre zabudovanú procesorovú jednotku DSP inú ako je bežná ALU. Tento procesor DSP je zameraný na vykonávanie aritmetických výpočtov veľmi rýchlo pri najmenšom počte cyklov hodín (vo väčšine prípadov jeden), mnohokrát rýchlejších ako ALU.

Pokyny, ktoré procesor DSP môže vykonať rýchlejšie ako ALU, sú:

  • Pokyny na posunutie a otáčanie bitov.
  • Násobenie, delenie a iné aritmetické operácie.
  • Vyhodnocovanie Sines a ďalších trigonometrických funkcií.
  • Všetky operácie DSP ako FFT, DFT, konvolúcie a FIR filtrovanie.

Používanie DSP motora mikrokontroléra vyžaduje, aby:

  • Do projektu sú začlenené samostatné knižnice DSP.
  • Názvy funkcií sa líšia od štandardnej matematickej knižnice jazyka C. Dokumentácia týchto knižníc a funkcií je k dispozícii na webových stránkach príslušných výrobcov.
  • DSP motor využíva iný premenný typ „zlomkový“. Naučte sa, ako používať premenné zlomkového typu, skôr ako začnete s funkciami knižnice dsp.

Všimnite si, že štandardné matematické knižničné funkcie nebudú vyvolávať DSP engine, pretože sa prevedú do montážnych pokynov ALU.

6. Práca s prerušeniami

Prerušenia používajte na vykonávanie špecifických funkcií, ako napríklad:

  • Čítanie hodnôt ADC.
  • Odosielanie a prijímanie z UART.
  • Aktualizácia registrov pracovného cyklu PWM.
  • Komunikácia CAN alebo I2C.

Prerušenia budú obsluhovať tieto funkcie rýchlo v porovnaní s ich vykonávaním v hlavnom tele prostredníctvom volania funkcie alebo vloženého kódu.

Prerušenia sa tiež spustia iba v prípade potreby, zatiaľ čo pri kódovaní v hlavnom tele sa kód vykoná pri každej iterácii slučky while (1).

7. Používajte najlepšie dostupné kompilátory

Kompilátory môžu automaticky implementovať niektoré z vyššie popísaných optimalizácií pri preklade kódu z jazyka C do jazyka zhromaždenia, ak sú správne nakonfigurované. Vo svojom kompilátore vyhľadajte možnosti optimalizácie a podľa možnosti inovujte na profesionálne verzie prekladačov, pretože ide o výkonnejšie optimalizátory kódu.

8. Používajte podmienené vyhlásenia inteligentne

  • Pri použití série príkazov if-else ponechajte najpravdepodobnejšiu podmienku ako prvú. Týmto spôsobom nebude MCU po nájdení skutočného stavu musieť prehľadávať všetky podmienky.
  • Príkaz typu switch-case je zvyčajne rýchlejší ako if-else.
  • Namiesto série príkazov použite vnorené príkazy if-else. Blok if-else, ktorý má veľa príkazov, možno rozdeliť na menšie čiastkové vetvy, aby sa optimalizoval najhorší (posledný) stav.

9. Používajte vložené funkcie

Funkcie, ktoré sa majú v kóde použiť iba raz, sa môžu vyhlásiť za statické. Toto umožní kompilátoru optimalizovať túto funkciu na vloženú funkciu, a preto sa pre volanie funkcie nepreloží žiadny kód zostavy.

  • Funkciu možno deklarovať ako vloženú pomocou kľúčového slova „statický“.

10. Použite zmenšené slučky

Decrementovaná slučka vygeneruje menej montážneho kódu v porovnaní s inkrementovanou slučkou.

Je to preto, že v prírastkovej slučke je potrebná inštrukcia na porovnanie na porovnanie indexu slučky s maximálnou hodnotou v každej slučke, aby sa skontrolovalo, či index slučky dosahuje maximálnu hodnotu. Naopak v dekrementovanej slučke toto porovnanie už nie je potrebné, pretože znížený výsledok indexu slučky nastaví nulový príznak v SREG, ak dosiahne nulu.

Vzhľadom na to, že slučka musí opakovane iterovať, znížením jednej inštrukcie zo slučky sa zabráni tomu, aby bola vykonaná stokrát, takže bude pravdepodobne významnejší dopad, keď bude musieť slučka opakovane iterovať.

Balenie

Tieto tipy môžu byť užitočné, ale ich skutočná aplikácia a účinnosť závisí od schopností programátora a príkazu, ktorý má vo svojom kóde. Pamätajte, že veľkosť programu nie vždy určuje časy vykonania, niektoré pokyny môžu spotrebovať viac hodinových cyklov ako tie druhé, takže opäť musia hrať svoju úlohu zručnosti programu.

Tento článok je presný a pravdivý podľa najlepšieho vedomia autora. Obsah slúži iba na informačné alebo zábavné účely a nenahrádza osobné rady ani odborné rady v obchodných, finančných, právnych alebo technických záležitostiach.

Viac Informácií

Populárne Dnes

Klady a zápory rohových antén
Priemyselný

Klady a zápory rohových antén

Tamara Wilhite je technická pi ovateľka, priemy elná inžinierka, matka dvoch detí a publikovala autor ci-fi a hororov.Hornove antény všeobecne používajú rozšíren...
Skvelé príklady udržateľného dizajnu
Misc

Skvelé príklady udržateľného dizajnu

Rád píšem o potravinách, udržateľno ti a me t kom poľnoho podár tve.Čo i my líte, keď počujete frázu „udržateľný dizajn“? Možno i pred tavujete hybridné automob...