Misc

Kodeoptimering i mikrokontrollere

Forfatter: Laura McKinney
Oprettelsesdato: 4 April 2021
Opdateringsdato: 16 Kan 2024
Anonim
Understanding the differences between 8bit, 16bit, 32bit, and 64bit -- Arrow Tech Trivia
Video.: Understanding the differences between 8bit, 16bit, 32bit, and 64bit -- Arrow Tech Trivia

Indhold

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:

  1. 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.
  2. 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:

Oversigt over variabler, der anvendes på C-sprog.

Variabel typeStørrelse i BytesRæ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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Vi Råder Dig Til At Se

Friske Indlæg

100+ dovne citater og billedtekstideer til Instagram
Internet

100+ dovne citater og billedtekstideer til Instagram

Cheeky Kid er en cybernaut, der bruger meget tid på at urfe på nettet, fatte uendelige oply ninger og nyde underholdning og jov....
Hvad er computerhardware? Definition Plus 20 eksempler
Computere

Hvad er computerhardware? Definition Plus 20 eksempler

Paul liden kab for teknologi og digitale medier går tilbage i 30 år. Han er født i torbritannien og bor nu i U A.Hardware (undertiden forkortet til HW) kan definere om de fy i ke kompon...