Misc

Kodu optimizēšana mikrokontrolleros

Autors: Laura McKinney
Radīšanas Datums: 4 Aprīlis 2021
Atjaunināšanas Datums: 16 Maijs 2024
Anonim
Optimizing C for Microcontrollers
Video: Optimizing C for Microcontrollers

Saturs

Autors pabeidza savu pēdējā gada inženierijas projektu ar dsPic mikrokontrolleriem, gūstot plašu ieskatu par šīm ierīcēm.

Mikrokontrollera C valodas kodam var būt nepieciešama optimizācija dažās uzlabotās lietojumprogrammās. Šī koda optimizācija tiek izmantota, lai samazinātu divas svarīgas lietas:

  1. Koda lielums: Mikrokontrolleri var uzglabāt ierobežotus datus un instrukcijas, jo to RAM ir ierobežots. Tāpēc kods ir jāoptimizē, lai pieejamo instrukciju un datu atmiņu varētu izmantot visefektīvākajā veidā.
  2. Kodu izpildes laiki: Mikrokontrolleri ir secīgas ierīces, kas vienlaikus izpilda vienu instrukciju. Katra montāžas instrukcija patērē noteiktu pulksteņa ciklu skaitu, lai to izpildītu. Tāpēc kods ir jāoptimizē, lai nodrošinātu, ka tas veic nepieciešamo uzdevumu vismazākajā pulksteņa ciklu vai montāžas instrukciju skaitā. Jo mazāk pulksteņa ciklu kods izmanto, jo ātrāk tas darbojas. Tas nozīmē, ka lietojumprogrammas var darboties ātrāk, jo apstrādes laiks tiek samazināts līdz minimumam.

Šajā rakstā ir sniegti padomi un ieteikumi, kurus var izmantot, lai samazinātu mikrokontrollera koda lielumu un izpildes laiku.


Vajadzības gadījumā piemēru demonstrēšanai tiks izmantota mikroshēmas MplabX izstrādes IDE.

Kā eksperimentāli izmērīt koda izpildes laiku

Lai iegūtu priekšstatu par to, cik daudz laika jūsu kods faktiski izpilda reāllaikā, jums tas jāmēra eksperimentāli. Loģisko analizatoru var ērti izmantot koda izpildes laika mērīšanai, un interesenti par to var uzzināt no manis pa e-pastu. Blakus tam:

  • Dažiem kompilatoriem ir iespēja saskaitīt pulksteņa ciklus, kurus kods patērēs.
  • Daži atkļūdotāji, piemēram, ICD 3 no mikroshēmas, var tieši izmērīt izpildes laiku, izmantojot hronometru.

1. Ziniet sava mikrokontrollera apstrādes jaudu un atmiņas lielumu

Ne vienmēr pulksteņa frekvence (Mhz) dod patiesu priekšstatu par mikrokontroliera apstrādes ātrumu, reālāks pasākums ir MIPS (mega instrukcijas sekundē) vai instrukciju skaits, ko MCU var izpildīt sekundē.

MCU parasti svārstās no 60–70 MIPS augstākās klases kategorijā līdz 20 MIPS 8 bitu AVR. Augsts MIPS mikrokontrolieris, visticamāk, būs dārgāks nekā zemas klases ierīce, tāpēc šeit jums ir kompromiss starp izmaksām un apstrādes ātrumu.


Mikrokontrolleriem ir atsevišķa atmiņa datu un programmas koda glabāšanai. Abu lielumu var atrast datu lapā. Jums var būt nepieciešams MCU ar lielāku atmiņas apjomu, ja jūsu kods ir ievērojami liels.

2. Mainīgo izvēle koda lieluma optimizēšanai

Mikrokontrolieriem ir ierobežota datu atmiņa, parasti tā ir robežās no 1 līdz 4 Kbaitiem. Šajā gadījumā ir saprātīgi izvēlēties vispiemērotāko mainīgā veidu atbilstoši gaidāmajam uzglabājamā datuma diapazonam. Turpmākajā tabulā ir apkopoti šie mainīgie:

C-valodā izmantoto mainīgo kopsavilkums.

Mainīgā tipsIzmērs baitosDiapazons

bool

1

Tikai 0 vai 1

char

1


-128 līdz 127

int

2

-32 768 līdz 32 767

neparakstīts int

2

0 līdz 65 535

ilgi

4

No 2 147 483 648 līdz 2 147 483 647

peldēt

4

Precīzi līdz 6 zīmēm aiz komata

dubultā

8

Precīzi līdz 15 zīmēm aiz komata

garš dubultnieks

10

Precīzi līdz 19 zīmēm aiz komata

Piemērs:

  • Ja jāpievieno divi mainīgie X un Y un rezultāts jāuzglabā Z, bet paredzams, ka Z vērtība pēc pievienošanas būs lielāka nekā 65 535, tad Z var deklarēt kā garu, bet X un Y - kā neparakstītus int, nav paredzams, ka X un Y vērtības būs negatīvas. Tas datu atmiņā ietaupīs 04 baitus, kas citādi būtu izlietoti, ja visi mainīgie tiktu deklarēti tik ilgi.
  • Divi mainīgie X un Y, kuru vērtības ir sagaidāmas veselos skaitļos, ir jāsadala, bet dalīšanas rezultāts var dot decimāldaļu, tad X un Y var paziņot par int un rezultātu var pasludināt par pludiņu vai dubultu atkarībā no nepieciešamā precizitāte.

Datu veida izvēle var būt izšķiroša, deklarējot masīvus, kas satur lielu elementu skaitu.

3. Optimizētāju mainīgo izvēle koda izpildes laikā

  • Ir noteikts fakts, ka peldošā komata aprēķiniem nepieciešams ilgāks laiks nekā fiksēto punktu aprēķiniem. Nelietojiet mainīgā lieluma mainīgos, ja decimālvērtība nav nepieciešama. Strādājiet ar neparakstītiem veseliem skaitļiem, kur vien iespējams.
  • Lokālajiem mainīgajiem tiek dota priekšroka nekā globālajiem. Ja mainīgais tiek izmantots tikai funkcijā, tas ir jādeklarē šajā funkcijā, jo piekļuve globālajiem mainīgajiem ir lēnāka nekā lokālie mainīgie.
  • 8 bitu MCU atradīs viena baita lieluma mainīgo ātrāk pieejamu, un 16 bitu MCU atradīs 2 baitu mainīgo vieglāk piekļūt, pateicoties ģenerētās adreses garumam.

4. Aritmētisko darbību optimizēšana

Aritmētiskās darbības var optimizēt šādos veidos.

  1. Izmantojiet iepriekš aprēķinātu vērtību uzmeklēšanas tabulas, nevis novērtējiet sinusu vai jebkuru citu trigonometrisko funkciju vai jebkuru citu darbību, kuras rezultātu var iepriekš zināt kodā.
  2. Gadījumā, ja sinusārā uzmeklēšanas tabula jau ir saglabāta atmiņā, kosinusu var novērtēt, virzot masīva rādītāju līdzvērtīgu 90 grādiem.
  3. Starp četrām aritmētiskajām darbībām dalīšanas un reizināšanas process aizņem visvairāk apstrādes laika, praksē peldošā komata vērtību gadījumā tas var būt simtiem mikrosekunžu diapazonā.
  4. Dalīšanas un reizināšanas vietā izmantojiet bitu nobīdes instrukcijas. Labās maiņas instrukcija 3 kalpo, lai dalītu ar 23 kur kā kreisās maiņas instrukcija 1 kalpos, lai reizinātu ar 21.

5. Intensīviem aprēķiniem izmantojiet DSP spējīgu mikrokontrolleru

Dažiem mikrokontrolieriem ir cita DSP apstrādes vienība, nekā to arhitektūrā ir iebūvēts parastais ALU. Šis DSP motors ir pielāgots aritmētisko aprēķinu veikšanai ļoti ātri vismazākajā pulksteņa ciklu skaitā (viens vairumā gadījumu) daudz reižu ātrāk nekā ALU.

Norādījumi, ko DSP procesors var veikt ātrāk nekā ALU, ir:

  • Bitu nobīdes un pagriešanas instrukcijas.
  • Reizināšanas, dalīšanas un citas aritmētiskās darbības.
  • Sinusu un citu trigonometrisko funkciju novērtēšana.
  • Visas DSP darbības, piemēram, FFT, DFT, konvekcijas un FIR filtrēšana.

Lai izmantotu mikrokontrollera DSP dzinēju, ir nepieciešams:

  • Projektā ir iekļautas atsevišķas DSP bibliotēkas.
  • Funkciju nosaukumi atšķiras no standarta C valodas matemātikas bibliotēkas. Šo bibliotēku un funkciju dokumentāciju var izmantot attiecīgā ražotāja vietnē.
  • DSP dzinējs izmanto dažādu mainīgo tipu “frakcionēts”. Uzziniet, kā izmantot dalītā tipa mainīgos, pirms turpināt dsp bibliotēkas funkcijas.

Ņemiet vērā, ka standarta matemātikas bibliotēkas funkcijas neizsauks DSP dzinēju, jo tās tiek pārtulkotas ALU montāžas instrukcijās.

6. Darbs ar pārtraucējiem

Izmantojiet pārtraukumus, lai veiktu noteiktas funkcijas, piemēram:

  • ADC vērtību nolasīšana.
  • Sūtīšana un saņemšana no UART.
  • PWM darba cikla reģistru atjaunināšana.
  • CAN vai I2C komunikācija.

Pārtraukumi šīs funkcijas ātri apkalpos, salīdzinot ar to izpildi galvenajā daļā, izmantojot funkciju izsaukumu vai iekšējo kodu.

Pārtraukumi tiks aktivizēti arī tikai pēc nepieciešamības, turpretī, ja tas tiek kodēts galvenajā pamattekstā, kods tiks izpildīts katrā cilnes while (1) atkārtojumā.

7. Izmantojiet labākos pieejamos kompilatorus

Kompilatori var automātiski ieviest dažas iepriekš apspriestās optimizācijas, vienlaikus pareizi konfigurējot kodu no C valodas uz montāžas valodu. Optimizēšanas opcijas meklējiet kompilatorā un, ja iespējams, jauniniet uz kompilatoru profesionālajām versijām, jo ​​tās ir jaudīgākas kodu optimizētāji.

8. Izmantojiet nosacījumu paziņojumus saprātīgi

  • Izmantojot virkni if-else paziņojumu, vispirms saglabājiet visticamāko nosacījumu. Tādā veidā MCU pēc patiesā stāvokļa atrašanas nebūs jāpārmeklē visi nosacījumi.
  • Pārslēgšanas gadījuma paziņojums parasti ir ātrāks nekā ja-cits.
  • Pārskatu sērijas vietā izmantojiet ligzdotus if-else apgalvojumus. Ja-cits bloku, kurā ir daudz paziņojumu, var sadalīt mazākās apakšnozarēs, lai optimizētu sliktākajam gadījumam (pēdējam).

9. Izmantojiet iekšējās funkcijas

Funkcijas, kuras kodā jāizmanto tikai vienu reizi, var pasludināt par statiskām. Tas liks kompilatoram optimizēt šo funkciju līdz iekšējai funkcijai, un tāpēc funkcijas izsaukumam netiks tulkots neviens montāžas kods.

  • Funkciju var pasludināt par iekļautu, lietojot kopā ar to atslēgvārdu “static”.

10. Izmantojiet samazinātas cilpas

Samazināta cilpa radīs mazāk montāžas koda, salīdzinot ar palielinātu cilpu.

Tas ir tāpēc, ka pieauguma cilpā ir nepieciešama salīdzināšanas instrukcija, lai salīdzinātu cilpas indeksu ar maksimālo vērtību katrā cilpā, lai pārbaudītu, vai cilpas indekss sasniedz maksimālo vērtību. Gluži pretēji, samazināšanas ciklā šis salīdzinājums vairs nav vajadzīgs, jo cilpas indeksa samazinātais rezultāts iestatīs nulles karodziņu SREG, ja tas sasniegs nulli.

Ņemot vērā to, ka cilpai ir jāatkārto simt reižu, samazinot vienu instrukciju no cilpas, tiks novērsta simtkārtēja izpilde, tāpēc ietekme, visticamāk, būs daudz nozīmīgāka, ja cilpai būs atkārtojama daudzas reizes.

Iesaiņošana

Šie padomi var būt noderīgi, taču to patiesais pielietojums un iedarbīgums ir atkarīgs no programmētāja iemaņām un komandas, kas viņam ir uz viņa koda. Atcerieties, ka programmas lielums ne vienmēr nosaka izpildes laiku, daži norādījumi var patērēt vairāk pulksteņa ciklu nekā citi, tāpēc atkal ir jāpilda programmas prasmēm.

Šis raksts ir precīzs un atbilst patiesam autora zināšanām. Saturs ir paredzēts tikai informatīviem vai izklaides nolūkiem, un tas neaizstāj personiskus vai profesionālus padomus uzņēmējdarbības, finanšu, juridiskos vai tehniskos jautājumos.

Mēs Iesakām

Svaigas Publikācijas

Aukey USB-C centrmezglu pārskats: nekavējoties pievienojiet ostas savam Mac datoram
Datori

Aukey USB-C centrmezglu pārskats: nekavējoties pievienojiet ostas savam Mac datoram

Kšištof ir nākotne tehnoloģiju junkie, ka pēta jaunāko tā tu no tādiem uzņēmumiem kā Apple, am ung, Google un Amazon.Aukey centrmezgla adapteri var paplašināt jū u MacBook Pro ie pēja ar a toņiem jaun...
Apbrīnojami alumīnija fakti: bezgalīgi pārstrādājami un bagātīgi
Rūpniecības

Apbrīnojami alumīnija fakti: bezgalīgi pārstrādājami un bagātīgi

Džon lielāko mūža daļu ir pār trādāji metālu un viņu aizrauj atkritumi, kuriem ir vērtība. Pār trāde lika viņam apzinātie tā nepieciešamību - un tā vērt .Daudzu gadu e mu pār trādāji metālu , un tajā ...