Misc

Kodoptimering i mikrokontroller

Författare: Laura McKinney
Skapelsedatum: 4 April 2021
Uppdatera Datum: 16 Maj 2024
Anonim
Kodoptimering i mikrokontroller - Misc
Kodoptimering i mikrokontroller - Misc

Innehåll

Författaren slutförde sitt sista års ingenjörsprojekt med dsPic-mikrokontroller och fick omfattande insikt i dessa enheter.

En mikrokontrollers C-språkkod kan kräva optimering i vissa avancerade applikationer. Denna kodoptimering praktiseras för att minska två viktiga saker:

  1. Kodstorlek: Microcontrollers kan lagra begränsad data och instruktioner på grund av den begränsade storleken på deras RAM. Därför måste koden optimeras så att den tillgängliga instruktionen och dataminnet kan utnyttjas på det mest effektiva sättet.
  2. Kodkörningstider: Mikrokontroller är sekventiella enheter som kör en instruktion i taget. Varje monteringsinstruktion förbrukar ett visst antal klockcykler för att utföra sig själv. Därför måste koden optimeras för att säkerställa att den utför den uppgift som krävs i minst antal klockcykler eller monteringsinstruktioner. Ju mindre klockcykler en kod använder, desto snabbare går den. Det betyder att applikationer kan köras snabbare eftersom bearbetningstiderna minimeras.

Den här artikeln presenterar tips och tricks som kan användas för att minska storleken och körtiden för en mikrokontrollkod.


Microchips MplabX-utvecklings-IDE kommer att användas för att demonstrera exempel där så är lämpligt.

Hur man mäter kodens exekveringstid experimentellt

För att få en uppfattning om hur mycket tid din kod faktiskt tar att köra i realtid måste du mäta den experimentellt. En logisk analysator kan enkelt användas för att mäta kodens exekveringstid och de intresserade kan fråga mig om processen för detta via e-post. Vid sidan av detta:

  • Vissa kompilatorer har möjlighet att räkna klockcykler som en kod kommer att konsumera.
  • Vissa avlusare, till exempel ICD 3 från mikrochip, kan direkt mäta exekveringstiden genom ett stoppur.

1. Känn processorn och minnesstorleken för din mikrokontroller

Det är inte alltid klockfrekvensen (MHz) som ger den sanna bilden av en mikrokontrollers behandlingshastighet, en mer realistisk åtgärd är MIPS (megainstruktioner per sekund) eller antalet instruktioner som MCU kan utföra på en sekund.

MCU: er varierar vanligtvis från 60–70 MIPS i avancerad kategori till 20 MIPS 8-bitars AVR. En hög MIPS-mikrokontroller kommer sannolikt att bli dyrare än en låg-enhet, så här har du en avvägning mellan kostnad och bearbetningshastighet.


Mikrokontroller har separat minne för lagring av data och programkod. Storleken på dem båda finns i databladet. Du kan behöva en MCU med större minnesstorlek om din kod är väsentlig stor.

2. Val av variabler för optimering i kodstorlek

Mikrokontroller har begränsat dataminne, vanligtvis från 1 till 4 kbyte. I det här fallet är det klokt att välja den mest lämpliga variabeltypen enligt det förväntade intervallet för det datum som lagras. Tabellen nedan sammanfattar dessa variabler:

Sammanfattning av variabler som används på C-språk.

Variabel typStorlek i byteRäckvidd

bool

1

Endast 0 eller 1

röding

1


-128 till 127

int

2

-32 768 till 32 767

osignerad int

2

0 till 65 535

lång

4

-2,147,483,648 till 2,147,483,647

flyta

4

Exakt upp till 6 decimaler

dubbel

8

Exakt upp till 15 decimaler

lång dubbel

10

Exakt upp till 19 decimaler

Exempel:

  • Om två variabler X och Y ska läggas till och resultatet ska lagras i Z men värdet på Z förväntas vara högre än 65 535 efter tillsats kan Z deklareras som en lång och X och Y kan deklareras som osignerad int förväntas inte heller värdena X och Y bli negativa. Detta sparar 04 byte i dataminnet som annars skulle ha använts om alla variabler skulle deklareras så långa.
  • Två variabler X och Y, vars värden förväntas vara i heltal ska delas, men resultatet av delning kan ge ett decimal, då kan X och Y deklareras int och resultatet kan förklaras flytande eller dubbelt beroende på den precision som krävs.

Val av datatyp kan vara avgörande när deklarera matriser som innehåller ett stort antal element.

3. Val av variabler för optimering i kodutförande tid

  • Det är ett fastställt faktum att flytpunktsberäkningar tar längre tid än fastpunktsberäkningar. Använd inte en variabel med flytande punkt där ett decimalvärde inte krävs. Arbeta med osignerade heltal när det är möjligt.
  • Lokala variabler föredras framför globala variabler. Om en variabel endast används i en funktion måste den deklareras i den funktionen eftersom åtkomst till globala variabler är långsammare än lokala variabler.
  • En 8-bitars MCU kommer att hitta en enda byte-storlek variabel snabbare att komma åt och en 16-bitars MCU kommer att hitta en 2-byte variabel som är lättare att komma åt på grund av den genererade adresslängden.

4. Optimera aritmetiska operationer

Aritmetiska operationer kan optimeras på följande sätt.

  1. Använd uppslagstabeller med förberäknade värden istället för att utvärdera en sinus eller någon annan trigonometrisk funktion eller någon annan operation vars resultat kan vara känt i förväg i koden.
  2. Om en sinus-uppslagstabell redan är lagrad i minnet kan en cosinus utvärderas genom att mata fram matrispekaren motsvarande 90 grader.
  3. Bland de fyra aritmetiska operationerna tar delning och multiplikation den mesta bearbetningstiden, i praktiken kan den ligga inom hundratals mikrosekunder eller så i fall av flytpunktsvärden.
  4. Använd bit shift instruktioner istället för division och multiplikation. En rätt skiftinstruktion 3 tjänar till att dividera med 23 där som vänsterskift instruktion 1 kommer att tjäna att multiplicera med 21.

5. Använd en DSP-kapabel mikrokontroller för intensiva beräkningar

Vissa mikrokontroller har en DSP-behandlingsenhet, annan än den konventionella ALU inbyggd i deras arkitektur. Denna DSP-motor är inriktad på att utföra aritmetiska beräkningar mycket snabbt i det minsta antalet klockcykler (en i de flesta fall) många gånger snabbare än ALU.

Instruktioner som en DSP-processor kan utföra snabbare än en ALU är:

  • Instruktioner för bitförskjutning och rotering.
  • Multiplikationer, uppdelningar och andra aritmetiska operationer.
  • Utvärdera Sines och andra trigonometriska funktioner.
  • Alla DSP-operationer som FFT, DFT, faltning och FIR-filtrering.

Att använda DSP-motorn i en mikrokontroller kräver att:

  • Separata DSP-bibliotek ingår i projektet.
  • Funktionsnamnen skiljer sig från det vanliga mattebiblioteket för C-språk. Dokumentation av dessa bibliotek och funktioner kan utnyttjas från respektive tillverkares webbplats.
  • DSP-motor använder en annan variabel typ 'fraktionerad'. Lär dig hur du använder variabeltypsvariabler innan du fortsätter med dsp-biblioteksfunktioner.

Observera att vanliga matematiska biblioteksfunktioner inte kommer att åberopa DSP-motorn eftersom de översätts till ALU-monteringsanvisningar.

6. Arbeta med avbrott

Använd avbrott för att utföra specifika funktioner som:

  • Läser ADC-värden.
  • Skicka och ta emot från UART.
  • Uppdatering av PWM-arbetscykelregister.
  • CAN- eller I2C-kommunikation.

Avbrott kommer att betjäna dessa funktioner snabbt jämfört med att utföra dem i huvuddelen genom ett funktionssamtal eller inline-kod.

Avbrott kommer också att utlösas endast när det behövs, medan om det kodas i huvuddelen kommer koden att köras i varje iteration av while-slingan.

7. Använd de bästa tillgängliga kompilatorerna

Kompilatorer kan automatiskt implementera några av de optimeringar som diskuterats ovan medan de översätter koden från C-språk till monteringsspråk om de är korrekt konfigurerade. Leta efter optimeringsalternativ i din kompilator och om möjligt uppgradera till professionella versioner av kompilatorer eftersom de är mer kraftfulla kodoptimiserare.

8. Använd villkorliga uttalanden på ett intelligent sätt

  • När du använder en serie if-else-påståenden, håll det mest troliga tillståndet först. På så sätt behöver MCU inte skanna igenom alla förhållanden efter att den har hittat det verkliga tillståndet.
  • En switch-case uttalande är vanligtvis snabbare en if-else.
  • Använd kapslade if-else-uttalanden i stället för en serie uttalanden. Ett if-else-block med många påståenden kan delas in i mindre undergrenar för att optimera för värsta fall (sista) tillstånd.

9. Använd Inline-funktioner

Funktioner som endast ska användas en gång i koden kan deklareras som statiska. Detta gör att kompilatorn optimerar den funktionen till en inline-funktion och därför kommer ingen sammansättningskod att översättas för funktionsanropet.

  • En funktion kan deklareras inline genom att använda nyckelordet "statisk" med den.

10. Använd dekrementerade öglor

En minskad slinga genererar mindre sammansättningskod jämfört med en inkrementerad slinga.

Det beror på att i en inkrementslinga behövs en jämförelseinstruktion för att jämföra loopindex med det maximala värdet i varje loop för att kontrollera om loopindex når det maximala värdet. Tvärtom i en minskningsslinga behövs inte denna jämförelse längre eftersom det minskade resultatet av loopindexet kommer att sätta nollflaggan i SREG om den når noll.

Med tanke på att slingan måste iterera hundra gånger kommer en instruktion från slingan att minskas så att den inte utförs hundra gånger så att effekten sannolikt blir mer signifikant när slingan måste iterera många gånger.

Avslutar

Dessa tips kan vara till hjälp men deras verkliga tillämpning och styrka beror på programmerarens skicklighet och kommandot på sin kod. Kom ihåg att programmets storlek inte alltid bestämmer exekveringstiderna, vissa instruktioner kan konsumera fler klockcykler än de andra, så återigen måste programmets färdigheter spela sin roll.

Den här artikeln är korrekt och sant så vitt författaren vet. Innehållet är endast av informations- eller underhållningssyfte och ersätter inte personlig rådgivning eller professionell rådgivning i affärsmässiga, ekonomiska, juridiska eller tekniska frågor.

Se

Rekommenderas Av Oss

150+ Citat om mat och bildtexter
Internet

150+ Citat om mat och bildtexter

Cheeky Kid är en cybernaut om penderar mycket tid på att urfa på nätet, ta oändlig information och njuta av underhållning och kul.Männi kor äl kar numera att ta...
Hur man skriver brev med brevfusion och ett Excel-kalkylblad
Datorer

Hur man skriver brev med brevfusion och ett Excel-kalkylblad

e till att ditt kalkylark är organi erat med tydliga titlar om be kriver informationen nedan. kriv ditt brev i Micro oft Word och lämna utrymmen där du vill placera individen informati...