Indhold
- Sådan måles eksperimentel kodeudførelsestid
- 1. Kend din Microcontroller's processorkraft og hukommelsesstørrelse
- 2. Valg af variabler til optimering i kodestørrelse
- 3. Valg af variabler til optimering i kodeudførelsestid
- 4. Optimering af aritmetiske operationer
- 5. Brug en DSP-kompatibel mikrokontroller til intensive beregninger
- Instruktioner, som en DSP-processor kan udføre hurtigere, så er en ALU:
- Brug af DSP-motoren fra en mikrocontroller kræver, at:
- 6. Arbejd med afbrydelser
- 7. Brug de bedste tilgængelige kompilatorer
- 8. Brug betingede udsagn intelligent
- 9. Brug indbyggede funktioner
- 10. Brug dekrementerede sløjfer
- Afslutter
Forfatteren afsluttede sit sidste års ingeniørprojekt med dsPic mikro-controllere og fik omfattende indsigt i disse enheder.
En mikrocontroller C-sprogkode kan kræve optimering i visse avancerede applikationer. Denne kodeoptimering praktiseres for at reducere to vigtige ting:
- Kode størrelse: Mikrocontrollere kan gemme begrænsede data og instruktioner på grund af den begrænsede størrelse på deres RAM. Derfor skal koden optimeres, så den tilgængelige instruktion og datahukommelse kan bruges på den mest effektive måde.
- Kodeudførelsestider: Mikrocontrollere er sekventielle enheder, der udfører en instruktion ad gangen. Hver monteringsinstruktion bruger et bestemt antal urcyklusser til at udføre sig selv. Derfor skal koden optimeres for at sikre, at den udfører den krævede opgave i mindst antallet af urcyklusser eller monteringsinstruktioner. Jo færre urcyklusser en kode bruger, jo hurtigere kører den. Dette betyder, at applikationer kan køre hurtigere, fordi behandlingstider minimeres.
Denne artikel præsenterer tip og tricks, som kan bruges til at reducere størrelsen og udførelsestiden for en mikrokontrolerkode.
Microchips MplabX-udviklings-IDE vil blive brugt til at demonstrere eksempler, hvor det er relevant.
Sådan måles eksperimentel kodeudførelsestid
For at få en idé om, hvor meget tid din kode rent faktisk tager at udføre i realtid, skal du måle den eksperimentelt. En logisk analysator kan bekvemt bruges til at måle kodeudførelsestid, og de interesserede kan forhøre mig om processen til dette via e-mail. Ved siden af dette:
- Nogle kompilatorer har evnen til at tælle urcyklusser, som en kode vil forbruge.
- Nogle debuggere, for eksempel ICD 3 fra mikrochip, kan direkte måle udførelsestid gennem et stopur.
1. Kend din Microcontroller's processorkraft og hukommelsesstørrelse
Det er ikke altid urfrekvensen (Mhz), der giver det sande billede af en mikrocontrollers behandlingshastighed, et mere realistisk mål er MIPS (mega-instruktioner pr. Sekund) eller antallet af instruktioner, som MCU kan udføre på et sekund.
MCU'er varierer normalt fra 60-70 MIPS i high-end kategorien til 20 MIPS 8-bit AVR'er. En høj MIPS mikrokontroller vil sandsynligvis være dyrere end en low-end enhed, så her har du en afvejning mellem omkostninger og behandlingshastighed.
Mikrocontrollere har separat hukommelse til lagring af data og programkode. Størrelsen af dem begge kan findes i databladet. Du har muligvis brug for en MCU med større hukommelsesstørrelse, hvis din kode er meget stor.
2. Valg af variabler til optimering i kodestørrelse
Mikrocontrollere har begrænset datahukommelse, normalt fra 1 til 4 Kbytes. I dette tilfælde er det klogt at vælge den mest passende variabeltype i henhold til det forventede interval for den dato, der lagres. Tabellen nedenfor opsummerer disse variabler:
Variabel type | Størrelse i Bytes | Rækkevidde |
---|---|---|
bool | 1 | Kun 0 eller 1 |
char | 1 | -128 til 127 |
int | 2 | -32,768 til 32,767 |
usigneret int | 2 | 0 til 65.535 |
lang | 4 | -2,147,483,648 til 2,147,483,647 |
flyde | 4 | Præcis op til 6 decimaler |
dobbelt | 8 | Præcis op til 15 decimaler |
lang dobbelt | 10 | Præcis op til 19 decimaler |
Eksempel:
- Hvis der skal tilføjes to variabler X og Y, og resultatet skal lagres i Z, men værdien af Z forventes at være højere end 65.535 efter tilsætning, kan Z erklæres som en lang og X og Y kan erklæres som usigneret int forventes heller ikke værdierne X og Y at blive negative. Dette gemmer 04 byte i datahukommelsen, som ellers ville være brugt op, hvis alle variabler skulle erklæres så lange.
- To variabler X og Y, hvis værdier forventes at være i hele tal, skal opdeles, men resultatet af division kan give en decimal, så kan X og Y erklæres int, og resultatet kan erklæres flyde eller dobbelt afhængigt af den krævede præcision.
Valg af datatype kan være afgørende, når der erklæres arrays, der indeholder et stort antal elementer.
3. Valg af variabler til optimering i kodeudførelsestid
- Det er et fastslået faktum, at beregninger med flydende punkt tager længere tid end beregninger med fast punkt. Brug ikke en variabel med flydende punkt, hvor der ikke kræves en decimalværdi. Arbejd med usignerede heltal, hvor det er muligt.
- Lokale variabler foretrækkes frem for globale variabler. Hvis en variabel kun bruges i en funktion, skal den erklæres i den funktion, fordi adgang til globale variabler er langsommere end lokale variabler.
- En 8-bit MCU finder en enkelt byte-størrelse variabel hurtigere at få adgang til og en 16-bit MCU finder en 2-byte variabel lettere at få adgang på grund af den genererede adresselængde.
4. Optimering af aritmetiske operationer
Aritmetiske operationer kan optimeres på følgende måder.
- Brug opslagstabeller med forudberegnede værdier i stedet for at evaluere en sinus eller en hvilken som helst anden trigonometrisk funktion eller enhver anden operation, hvis resultat kan være kendt på forhånd i koden.
- I tilfælde af at en sinus-opslagstabel allerede er gemt i hukommelsen, kan en cosinus evalueres ved at fremme matrixmarkøren svarende til 90 grader.
- Blandt de fire aritmetiske operationer tager division og multiplikation den mest behandlingstid, i praksis kan det være i området hundreder af mikrosekunder eller deromkring i tilfælde af flydende punktværdier.
- Brug bit shift instruktioner i stedet for division og multiplikation. En højre skiftinstruktion 3 tjener til at dividere med 23 hvor som en venstre skiftinstruktion tjener 1 til at gange med 21.
5. Brug en DSP-kompatibel mikrokontroller til intensive beregninger
Nogle mikrokontroller har en DSP-behandlingsenhed, der er anden end den konventionelle ALU indbygget i deres arkitektur. Denne DSP-motor er gearet til at udføre aritmetiske beregninger meget hurtigt i det mindste antal urcyklusser (en i de fleste tilfælde) mange gange hurtigere end ALU.
Instruktioner, som en DSP-processor kan udføre hurtigere, så er en ALU:
- Instruktioner til bitskift og rotering.
- Multiplikationer, opdelinger og andre aritmetiske operationer.
- Evaluering af Sines og andre trigonometriske funktioner.
- Alle DSP-operationer såsom FFT, DFT, foldning og FIR-filtrering.
Brug af DSP-motoren fra en mikrocontroller kræver, at:
- Separate DSP-biblioteker er indarbejdet i projektet.
- Funktionsnavne adskiller sig fra standard matematikbibliotek på C-sprog. Dokumentation af disse biblioteker og funktioner kan benyttes fra den respektive producents hjemmeside.
- DSP-motor bruger en anden variabel type 'brøk'. Lær hvordan du bruger variabeltypevariabler, inden du fortsætter med dsp-biblioteksfunktioner.
Bemærk, at standard matematiske biblioteksfunktioner ikke påberåber DSP-motoren, fordi de oversættes til ALU-monteringsvejledning.
6. Arbejd med afbrydelser
Brug afbrydelser til at udføre specifikke funktioner såsom:
- Læsning af ADC-værdier.
- Afsendelse og modtagelse fra UART.
- Opdatering af PWM-arbejdscyklusregistre.
- CAN- eller I2C-kommunikation.
Interrupts betjener disse funktioner hurtigt sammenlignet med at udføre dem i hoveddelen ved hjælp af et funktionsopkald eller inline-kode.
Afbrydelser udløses også kun, når det kræves, hvorimod hvis kodet i hoveddelen udføres koden i hver iteration af while (1) -sløjfen.
7. Brug de bedste tilgængelige kompilatorer
Kompilatorer kan automatisk implementere nogle af de optimeringer, der er diskuteret ovenfor, mens de oversætter koden fra C-sprog til monteringssprog, hvis de er korrekt konfigureret. Se efter optimeringsmuligheder i din kompilator, og opgrader om muligt til professionelle versioner af compilers, fordi de er mere kraftfulde kodeoptimerer.
8. Brug betingede udsagn intelligent
- Når du bruger en række if-else-udsagn, skal du holde den mest sandsynlige tilstand først. På denne måde behøver MCU'en ikke at scanne gennem alle betingelserne, efter at den har fundet den sande tilstand.
- En switch-case-erklæring er normalt hurtigere, hvis en hvis-ellers.
- Brug indlejrede if-else-udsagn i stedet for en række udsagn. En if-else-blok med mange udsagn kan opdeles i mindre undergrene for at optimere til værste tilfælde (sidste) tilstand.
9. Brug indbyggede funktioner
Funktioner, der kun skal bruges en gang i koden, kan erklæres som statiske. Dette får kompilatoren til at optimere denne funktion til en inline-funktion, og derfor oversættes ingen samlingskode til funktionsopkaldet.
- En funktion kan erklæres integreret ved hjælp af nøgleordet 'statisk' sammen med den.
10. Brug dekrementerede sløjfer
En dekrementeret sløjfe genererer mindre samlingskode sammenlignet med en inkrementeret sløjfe.
Det skyldes, at der i en stigningssløjfe er behov for en sammenligningsinstruktion for at sammenligne løkkeindekset med den maksimale værdi i hver løkke for at kontrollere, om løkkeindekset når den maksimale værdi. Tværtimod i en dekrementsløjfe er denne sammenligning ikke længere nødvendig, fordi det faldende resultat af løkkeindekset vil sætte nulflagget i SREG, hvis det når nul.
I betragtning af at sløjfen skal gentage hundrede gange, vil en reduktion af en instruktion fra sløjfen undgå, at den udføres hundrede gange, så virkningen sandsynligvis bliver mere signifikant, når sløjfen skal gentages mange gange.
Afslutter
Disse tip kan være nyttige, men deres sande anvendelse og styrke afhænger af programmørens dygtighed og kommandoen, han har på sin kode. Husk, programmets størrelse bestemmer ikke altid udførelsestider, nogle instruktioner kan forbruge flere urcyklusser, så den anden, så endnu en gang skal programmets færdigheder spille deres rolle.
Denne artikel er nøjagtig og sand efter bedste forfatterens viden. Indholdet er kun til informations- eller underholdningsformål og erstatter ikke personlig rådgivning eller professionel rådgivning i forretningsmæssige, økonomiske, juridiske eller tekniske forhold.