Įvairūs

Kodo optimizavimas mikrovaldikliuose

Autorius: Laura McKinney
Kūrybos Data: 4 Balandis 2021
Atnaujinimo Data: 13 Gegužė 2024
Anonim
Optimizing Arduino Code: no setup(), no loop() ⛔
Video.: Optimizing Arduino Code: no setup(), no loop() ⛔

Turinys

Autorius baigė savo paskutinių metų inžinerijos projektą su „dsPic“ mikrokontroleriais, įgijo daug žinių apie šiuos įrenginius.

Mikrokontrolerio C kalbos kodą gali tekti optimizuoti tam tikrose pažangiose programose. Šis kodas optimizuojamas siekiant sumažinti du svarbiausius dalykus:

  1. Kodo dydis: Mikrovaldikliai gali saugoti ribotus duomenis ir instrukcijas, nes jų RAM dydis yra ribotas. Todėl kodą reikia optimizuoti, kad būtų galima kuo efektyviau panaudoti turimas instrukcijas ir duomenų atmintį.
  2. Kodo vykdymo laikas: Mikrovaldikliai yra nuoseklūs įrenginiai, kurie vienu metu vykdo vieną instrukciją. Kiekviena surinkimo instrukcija sunaudoja tam tikrą skaičių laikrodžio ciklų, kad galėtų save vykdyti. Todėl kodas turi būti optimizuotas, kad būtų užtikrinta, jog jis įvykdo reikiamą užduotį mažiausiai laikrodžio ciklų ar surinkimo instrukcijų. Kuo mažiau laikrodžio ciklų naudoja kodas, tuo greičiau jis veikia. Tai reiškia, kad programos gali veikti greičiau, nes apdorojimo laikas yra sutrumpintas.

Šiame straipsnyje pateikiami patarimai ir gudrybės, kurie gali būti naudojami siekiant sumažinti mikrovaldiklio kodo dydį ir vykdymo laiką.


Jei reikia, pavyzdžiams parodyti bus naudojama mikroschemos „MplabX“ kūrimo IDE.

Kaip eksperimentiškai išmatuoti kodo vykdymo laiką

Norėdami suprasti, kiek laiko jūsų kodas iš tikrųjų užtrunka realiuoju laiku, turite jį išmatuoti eksperimentiškai. Loginio analizatoriaus pagalba galima patogiai išmatuoti kodo vykdymo laiką, o besidomintieji apie tai gali teirautis el. Paštu. Šalia šito:

  • Kai kurie kompiliatoriai turi galimybę suskaičiuoti laikrodžio ciklus, kuriuos sunaudos kodas.
  • Kai kurie derintojai, pavyzdžiui, ICD 3 iš mikroschemos, gali tiesiogiai matuoti vykdymo laiką per chronometrą.

1. Žinokite savo mikrovaldiklio apdorojimo galią ir atminties dydį

Ne visada laikrodžio dažnis (Mhz) duoda tikrąjį vaizdą apie mikrovaldiklio apdorojimo greitį, realesnis matas yra MIPS (mega nurodymai per sekundę) arba nurodymų, kuriuos MCU gali įvykdyti per sekundę, skaičius.

MCU paprastai svyruoja nuo 60–70 MIPS aukščiausios klasės kategorijoje iki 20 MIPS 8 bitų AVR. Didelis MIPS mikrokontroleris greičiausiai bus brangesnis už žemos klasės įrenginį, taigi čia jūs turite kompromisą tarp sąnaudų ir apdorojimo greičio.


Mikrovaldikliai turi atskirą atmintį duomenims ir programos kodams laikyti. Jų dydį galima rasti duomenų lape. Jums gali prireikti didesnio atminties MCU, jei jūsų kodas yra iš esmės didelis.

2. Kodo dydžių pasirinkimas optimizavimui

Mikrokontrolerių duomenų atmintis yra ribota, paprastai ji svyruoja nuo 1 iki 4 Kbaitų. Tokiu atveju protinga pasirinkti tinkamiausią kintamojo tipą pagal numatomą saugomos datos intervalą. Toliau pateiktoje lentelėje apibendrinti šie kintamieji:

C kalba naudojamų kintamųjų santrauka.

Kintamasis tipasDydis baitaisdiapazonas

bool

1

Tik 0 arba 1

char

1


-128 iki 127

tarpt

2

Nuo -32 768 iki 32 767

nepasirašytas tarpt

2

Nuo 0 iki 65 535

ilgas

4

Nuo 2 147 483 648 iki 2 147 483 647

plūdė

4

Tikslus iki 6 skaitmenų po kablelio

dvigubai

8

Tikslus iki 15 skaitmenų po kablelio

ilgas dvigubas

10

Tikslus iki 19 skaitmenų po kablelio

Pavyzdys:

  • Jei reikia pridėti du kintamuosius X ir Y ir rezultatas turi būti saugomas Z, bet tikimasi, kad Z vertė bus didesnė nei 65,535 po pridėjimo, tada Z gali būti paskelbtas ilguoju, o X ir Y gali būti paskelbti nepasirašytais int, taip pat nesitikima, kad X ir Y reikšmės bus neigiamos. Tai sutaupys 04 baitus duomenų atmintyje, kurie priešingu atveju būtų sunaudoti, jei visi kintamieji būtų deklaruojami kaip ilgi.
  • Du kintamieji X ir Y, kurių tikėtina vertė bus sveika, turi būti padalyti, tačiau dalijimo rezultatas gali būti dešimtainis, tada X ir Y gali būti paskelbti int, o rezultatas gali būti paskelbtas kintamuoju arba dvigubu, priklausomai nuo to, ar reikalingas tikslumas.

Deklaruojant masyvus, kuriuose yra daug elementų, gali būti labai svarbu pasirinkti duomenų tipą.

3. Optimizavimo kintamųjų pasirinkimas per kodo vykdymo laiką

  • Nustatytas faktas, kad slankiojo kablelio skaičiavimai trunka ilgiau nei fiksuoto taško skaičiavimai. Nenaudokite kintamojo kintamojo, kai dešimtainė reikšmė nereikalinga. Dirbkite su nepasirašytais sveikaisiais skaičiais, kur tik įmanoma.
  • Pirmenybė teikiama vietiniams kintamiesiems, o ne pasauliniams. Jei kintamasis naudojamas tik funkcijoje, jis turi būti deklaruojamas toje funkcijoje, nes prieiga prie visuotinių kintamųjų yra lėtesnė nei vietinių kintamųjų.
  • 8 bitų MCU greičiau suras vieno baito dydžio kintamąjį, o 16 bitų MCU dėl sukurto adreso ilgio bus lengviau pasiekti 2 baitų kintamąjį.

4. Aritmetinių operacijų optimizavimas

Aritmetines operacijas galima optimizuoti šiais būdais.

  1. Naudokite iš anksto apskaičiuotų verčių paieškos lenteles, užuot vertinę „Sine“ ar bet kurią kitą trigonometrinę funkciją ar bet kurią kitą operaciją, kurios rezultatą iš anksto galima žinoti kode.
  2. Jei sinusinė paieškos lentelė jau yra atmintyje, kosinusą galima įvertinti paslinkus masyvo rodyklę, atitinkančią 90 laipsnių.
  3. Tarp keturių aritmetinių operacijų dalijimasis ir dauginimas užima daugiausiai apdorojimo laiko, praktiškai jis gali būti maždaug šimtų mikro sekundžių diapazone, jei yra slankiojo kablelio vertės.
  4. Vietoj dalijimo ir daugybos naudokite bitų poslinkio instrukcijas. Dešiniojo poslinkio instrukcija 3 skirta padalyti iš 23 kur kaip kairiojo poslinkio instrukcija 1 padaugins iš 21.

5. Intensyviems skaičiavimams naudokite DSP palaikantį mikrovaldiklį

Kai kurie mikrokontroleriai turi savo architektūroje DSP apdorojimo įrenginį, o tada įprastą ALU. Šis DSP variklis pritaikytas atlikti aritmetinius skaičiavimus labai greitai, mažiausiai laikrodžio ciklų skaičiaus (daugeliu atveju vienas) daug kartų greičiau nei ALU.

Nurodymai, kaip DSP procesorius gali veikti greičiau nei ALU, yra šie:

  • Bitų perkėlimo ir pasukimo instrukcijos.
  • Daugybos, dalybos ir kitos aritmetinės operacijos.
  • Sinusų ir kitų trigonometrinių funkcijų įvertinimas.
  • Visos DSP operacijos, tokios kaip FFT, DFT, konvoliucija ir FIR filtravimas.

Norint naudoti mikrovaldiklio DSP variklį, reikia:

  • Į projektą įtrauktos atskiros DSP bibliotekos.
  • Funkcijų pavadinimai skiriasi nuo standartinės C kalbos matematikos bibliotekos. Šių bibliotekų ir funkcijų dokumentaciją galima rasti atitinkamoje gamintojo svetainėje.
  • DSP variklis naudoja skirtingą kintamo tipo „dalinį“. Sužinokite, kaip naudoti dalinio tipo kintamuosius prieš tęsdami dsp bibliotekos funkcijas.

Atminkite, kad standartinės matematikos bibliotekos funkcijos DSP variklio nekvies, nes jos bus išverstos į ALU surinkimo instrukcijas.

6. Darbas su pertraukėliais

Naudokite pertraukimus, kad atliktumėte konkrečias funkcijas, pvz .:

  • ADC reikšmių nuskaitymas.
  • Siunčia ir gauna iš UART.
  • PWM darbo ciklo registrų atnaujinimas.
  • CAN arba I2C ryšys.

Pertraukimai šias funkcijas atliks greitai, palyginti su funkcijų iškvietimu ar tiesioginiu kodu atliekant pagrindinį korpusą.

Pertraukimai taip pat bus suaktyvinami tik tada, kai to reikės, tuo tarpu jei kodas užkoduotas pagrindiniame turinyje, jis bus vykdomas kiekvienoje ciklo „while“ (1) kartotėje.

7. Naudokite geriausius turimus kompiliatorius

Kompiliatoriai gali automatiškai įgyvendinti kai kurias aukščiau aptartas optimizacijas, o tinkamai sukonfigūruodami kodą iš C kalbos į surinkimo kalbą. Kompiliatoriuje ieškokite optimizavimo parinkčių ir, jei įmanoma, atnaujinkite į profesionalias kompiliatorių versijas, nes jos yra galingesnės kodo optimizavimo priemonės.

8. Protingai naudokite sąlyginius teiginius

  • Naudojant teiginių „if-else“ seriją pirmiausia išlaikykite labiausiai tikėtiną sąlygą. Tokiu būdu radus tikrąją būklę, MCU nereikės nuskaityti visų sąlygų.
  • „Case-case“ pareiškimas paprastai yra greitesnis, jei „be kita“.
  • Vietoje sakinių serijos naudokite įdėtinius teiginius „if-else“. Bloką „if-else“, kuriame yra daug teiginių, galima suskirstyti į mažesnius poskyrius, kad būtų galima optimizuoti blogiausio atvejo (paskutinės) sąlygos atveju.

9. Naudokite „Inline“ funkcijas

Funkcijos, kurios kode turi būti naudojamos tik vieną kartą, gali būti paskelbtos statinėmis. Tai leis kompiliatoriui optimizuoti šią funkciją į tiesioginę funkciją, todėl funkcijos iškvietimui nebus išverstas joks surinkimo kodas.

  • Funkcija gali būti paskelbta tiesiogine, kartu su ja naudojant raktinį žodį „statinis“.

10. Naudokite sumažintas kilpas

Sumažėjusi kilpa sugeneruos mažiau surinkimo kodo, palyginti su padidinta kilpa.

Taip yra todėl, kad prieaugio cikle reikalinga palyginimo instrukcija, kad būtų galima palyginti kilpos indeksą su maksimalia kiekvienos kilpos verte ir patikrinti, ar ciklo indeksas pasiekia didžiausią vertę. Priešingai, mažėjančioje kilpoje šis palyginimas nebereikalingas, nes sumažėjęs kilpos indekso rezultatas nustatys nulinę vėliavą SREG, jei ji pasieks nulį.

Atsižvelgiant į tai, kad kilpa turi kartotis šimtą kartų, sumažinus vieną instrukciją iš ciklo, bus išvengta jos šimtą kartų vykdymo, todėl poveikis greičiausiai bus reikšmingesnis, kai kilpa turi kartotis daug kartų.

Apvyniojimas

Šie patarimai gali būti naudingi, tačiau jų tikrasis pritaikymas ir stiprumas priklauso nuo programuotojo įgūdžių ir komandos, kurią jis turi savo kode. Atminkite, kad programos dydis ne visada lemia vykdymo laiką, kai kurioms instrukcijoms gali prireikti daugiau laikrodžio ciklų, nei kitoms, todėl vėl turi būti svarbūs programos įgūdžiai.

Šis straipsnis yra tikslus ir tikras, kiek autorius žino. Turinys skirtas tik informaciniams ar pramoginiams tikslams ir nepakeičia asmeninių ar profesionalių patarimų verslo, finansų, teisiniais ar techniniais klausimais.

Įdomu Šiandien

Daugiau Informacijos

Kaip pataisyti 192.168.1.1 ir prisijungti prie savo maršrutizatoriaus
Kompiuteriai

Kaip pataisyti 192.168.1.1 ir prisijungti prie savo maršrutizatoriaus

Aš užaugau naudodama „Commodore 64“. Iš avo kambario paleidau „Dialup BB “. Ši ank tyva interneto forma įkvėpė manę šiandien ap ė ti kompiuteriai .Ne varbu, ar bandote pirmą kartą pa iekti belaidžio m...
Daugiau nei 150 sarkastiškų citatų ir antraščių „Instagram“
Internetas

Daugiau nei 150 sarkastiškų citatų ir antraščių „Instagram“

„Cheeky Kid“ yra kibernetini žmogu , daug laiko praleidžianti naršant internete, uvokianti begalinę informaciją ir be idominti pramogomi ir link mybėmi .Kol egzi tuoja kvailuma , arkazma yra tam, kad ...