Miscel·Lanis

Optimització de codi en microcontroladors

Autora: Laura McKinney
Data De La Creació: 4 Abril 2021
Data D’Actualització: 16 Ser Possible 2024
Anonim
Optimització de codi en microcontroladors - Miscel·Lanis
Optimització de codi en microcontroladors - Miscel·Lanis

Content

L'autor va completar el seu projecte d'enginyeria de darrer any amb els microcontroladors dsPic, obtenint una àmplia informació sobre aquests dispositius.

És possible que el codi en idioma C d’un microcontrolador requereixi optimització en determinades aplicacions avançades. Aquesta optimització de codi es practica per reduir dues coses crucials:

  1. Mida del codi: Els microcontroladors poden emmagatzemar dades i instruccions limitades a causa de la mida limitada de la seva memòria RAM. Per tant, cal optimitzar el codi, de manera que les instruccions disponibles i la memòria de dades es puguin utilitzar de la manera més eficient.
  2. Temps d'execució del codi: Els microcontroladors són dispositius seqüencials que executen una instrucció a la vegada. Cada instrucció de muntatge consumeix un cert nombre de cicles de rellotge per executar-se. Per tant, cal optimitzar el codi per assegurar-se que realitza la tasca requerida en un nombre mínim de cicles de rellotge o instruccions de muntatge. Com menys cicles de rellotge fa servir un codi, més ràpid s’executa. Això significa que les aplicacions poden executar-se més ràpidament perquè es minimitzen els temps de processament.

Aquest article presenta consells i trucs que es poden utilitzar per reduir la mida i el temps d'execució d'un codi de microcontrolador.


L’IDE de desenvolupament MplabX de Microchip s’utilitzarà per demostrar exemples si escau.

Com es mesura el temps d'execució del codi de manera experimental

Per fer-vos una idea del temps que el vostre codi realment triga a executar-se en temps real, heu de mesurar-lo de manera experimental. Un analitzador lògic es pot utilitzar convenientment per mesurar el temps d'execució de codi i els interessats poden consultar-me el procés per correu electrònic. A més d'això:

  • Alguns compiladors tenen la possibilitat de comptar els cicles de rellotge que consumirà un codi.
  • Alguns depuradors, per exemple l'ICD 3 del microxip, poden mesurar directament el temps d'execució mitjançant un cronòmetre.

1. Conegueu la potència de processament i la mida de la memòria del microcontrolador

No sempre la freqüència de rellotge (Mhz) dóna la imatge real de la velocitat de processament d’un microcontrolador, una mesura més realista és MIPS (mega instruccions per segon) o el nombre d’instruccions que la MCU pot executar en un segon.

Les MCU solen oscil·lar entre 60 i 70 MIPS en la categoria de gamma alta fins a 20 MIPS de 8 bits AVR. És probable que un microcontrolador MIPS alt sigui més car que un dispositiu de gamma baixa, de manera que aquí teniu una compensació entre el cost i la velocitat de processament.


Els microcontroladors tenen memòria independent per emmagatzemar dades i codi de programa. La mida de tots dos es pot trobar al full de dades. És possible que necessiteu una MCU amb una mida de memòria més gran si el vostre codi és substancialment gran.

2. Elecció de variables per a l'optimització de la mida del codi

Els microcontroladors tenen una memòria de dades limitada, generalment d’1 a 4 Kbytes. En aquest cas, és aconsellable triar el tipus de variable més adequat segons l'interval esperat de la data emmagatzemada. La taula següent resumeix aquestes variables:

Resum de variables utilitzades en llenguatge C.

Tipus de variableMida en bytesRang

bool

1

0 o 1 només

char

1


-128 a 127

int

2

-32.768 a 32.767

int signat

2

De 0 a 65.535

llarg

4

-2.147.483.648 a 2.147.483.647

flotar

4

Preciseu fins a 6 xifres decimals

doble

8

Preciseu fins a 15 decimals

doble llarg

10

Preciseu fins a 19 decimals

Exemple:

  • Si s’han d’afegir dues variables X i Y i el resultat s’ha d’emmagatzemar a Z, però s’espera que el valor de Z sigui superior a 65.535 després de l’addició, es pot declarar Z com a llarg i X i Y es poden declarar sense signar int, tampoc no s’espera que els valors de X i Y siguin negatius. D’aquesta manera s’estalviaran 04 bytes a la memòria de dades que d’una altra manera s’haurien esgotat si totes les variables es declaressin tan llargues.
  • Es divideixen dues variables X i Y, els valors dels quals s’espera que siguin en nombres enters, però el resultat de la divisió pot donar un decimal, llavors X i Y es poden declarar int i el resultat es pot declarar flotant o doble segons la precisió requerida.

L'elecció del tipus de dades pot ser crucial a l'hora de declarar matrius que continguin un gran nombre d'elements.

3. Elecció de variables per a l'optimització en el temps d'execució del codi

  • És cert que els càlculs de punt flotant triguen més que els de punt fix. No utilitzeu una variable de coma flotant en què no sigui necessari un valor decimal. Treballar amb nombres enters sense signar sempre que sigui possible.
  • Les variables locals són preferibles a les variables globals. Si només s’utilitza una variable en una funció, s’ha de declarar en aquesta funció perquè l’accés a variables globals és més lent que les variables locals.
  • Una MCU de 8 bits trobarà una variable de mida d’un byte més ràpida d’accés i una MCU de 16 bits trobarà una variable de 2 bytes més fàcil d’accedir a causa de la longitud de l’adreça generada.

4. Optimització de les operacions aritmètiques

Les operacions aritmètiques es poden optimitzar de les maneres següents.

  1. Utilitzeu taules de cerca de valors pre-calculats en lloc d’avaluar un seno o qualsevol altra funció trigonomètrica o qualsevol altra operació el resultat del qual es pugui conèixer prèviament al codi.
  2. En cas que una taula de cerca de sinus ja estigui emmagatzemada a la memòria, es pot avaluar un cosinus avançant el punter de la matriu equivalent a 90 graus.
  3. Entre les quatre operacions aritmètiques, la divisió i la multiplicació requereixen més temps de processament, a la pràctica pot estar en el rang de centenars de microsegons aproximadament en cas de valors de coma flotant.
  4. Utilitzeu instruccions de desplaçament de bits en lloc de divisió i multiplicació. Una instrucció de desplaçament a la dreta 3 serveix per dividir per 23 on com a instrucció de desplaçament a l'esquerra 1 servirà per multiplicar per 21.

5. Utilitzeu un microcontrolador DSP capaç de fer càlculs intensius

Alguns microcontroladors tenen una unitat de processament DSP diferent de l'ALU convencional integrada a la seva arquitectura. Aquest motor DSP està dissenyat per realitzar càlculs aritmètics molt ràpidament en el menor nombre de cicles de rellotge (un en la majoria dels casos) moltes vegades més ràpid que l'ALU.

Les instruccions que un processador DSP pot dur a terme més ràpidament que les ALU són:

  • Instruccions per canviar i girar bits.
  • Multiplicacions, divisions i altres operacions aritmètiques.
  • Avaluació de sinus i altres funcions trigonomètriques.
  • Totes les operacions DSP com FFT, DFT, convolució i filtratge FIR.

L’ús del motor DSP d’un microcontrolador requereix:

  • Al projecte s’incorporen biblioteques DSP separades.
  • Els noms de funcions són diferents de la biblioteca matemàtica estàndard del llenguatge C. Podeu consultar la documentació d'aquestes biblioteques i funcions des del lloc web dels fabricants respectius.
  • El motor DSP utilitza un tipus de variable diferent "fraccional". Apreneu a utilitzar variables de tipus fraccionari abans de continuar amb les funcions de la biblioteca dsp.

Tingueu en compte que les funcions de biblioteca matemàtiques estàndard no invocaran el motor DSP perquè es tradueixen en instruccions de muntatge ALU.

6. Treballar amb interrupcions

Utilitzeu interrupcions per realitzar funcions específiques com:

  • Lectura de valors ADC.
  • Enviament i recepció d'UART.
  • Actualització de registres de cicle de treball PWM.
  • Comunicació CAN o I2C.

Les interrupcions donaran servei a aquestes funcions ràpidament en comparació amb realitzar-les al cos principal mitjançant una trucada de funció o un codi en línia.

Les interrupcions també s'activaran només quan sigui necessari, mentre que si es codifica al cos principal, el codi s'executarà en cada iteració del bucle while (1).

7. Utilitzeu els millors compiladors disponibles

Els compiladors poden implementar automàticament algunes de les optimitzacions comentades anteriorment mentre tradueixen el codi del llenguatge C al llenguatge ensamblador si es configuren correctament. Cerqueu opcions d’optimització al compilador i, si és possible, actualitzeu-les a versions professionals dels compiladors perquè són optimitzadors de codi més potents.

8. Utilitzeu les afirmacions condicionals de manera intel·ligent

  • Quan utilitzeu una sèrie d’instruccions if-else, mantingueu primer la condició més probable. D'aquesta manera, l'MCU no haurà d'explorar totes les condicions després de trobar la veritable condició.
  • Una sentència switch-case sol ser més ràpida que un if-else.
  • Utilitzeu instruccions imbricades if-else en lloc d'una sèrie d'afirmacions. Un bloc if-else amb moltes sentències es pot dividir en sub-branques més petites per optimitzar-lo en el pitjor dels casos (últim).

9. Utilitzeu funcions en línia

Les funcions que s'han d'utilitzar només una vegada al codi es poden declarar com a estàtiques. Això farà que el compilador optimitzi aquesta funció a una funció en línia i, per tant, no es traduirà cap codi de muntatge per a la trucada de funció.

  • Es pot declarar una funció en línia mitjançant la paraula clau "estàtica".

10. Utilitzeu bucles disminuïts

Un bucle decrementat generarà menys codi de muntatge en comparació amb un bucle incrementat.

Això es deu al fet que en un bucle d'increment, cal una instrucció de comparació per comparar l'índex de bucle amb el valor màxim de cada bucle per comprovar si l'índex de bucle arriba al valor màxim. Al contrari, en un bucle de decrement, aquesta comparació ja no és necessària perquè el resultat disminuït de l'índex de bucle establirà la bandera zero a SREG si arriba a zero.

Tenint en compte que el bucle ha d'iterar-se cent vegades, reduir una instrucció del bucle evitarà que s'executi cent vegades, de manera que és probable que l'impacte sigui més significatiu quan el bucle ha d'iterar-se moltes vegades.

Finalitzant

Aquests consells poden ser útils, però la seva veritable aplicació i potència depèn de l'habilitat del programador i de l'ordre que tingui al seu codi. Recordeu que la mida del programa no sempre determina els temps d’execució, algunes instruccions poden consumir més cicles de rellotge que l’altra, de manera que una vegada més les habilitats del programa han de jugar el seu paper.

Aquest article és precís i fidel al millor coneixement de l'autor. El contingut només té finalitats informatives o d’entreteniment i no substitueix l’assessorament personal ni l’assessorament professional en qüestions empresarials, financeres, legals o tècniques.

La Nostra Elecció

Us Recomanem

Revisió del rellotge intel·ligent Wear24
Ordinadors

Revisió del rellotge intel·ligent Wear24

Walter hillington e criu obre producte que coneix de primera mà. El eu article e centren en la alut, l'electrònica, el rellotge i el article per a la llar.Vaig e tar al mercat per obteni...
Com configurar un servidor Radius a pfSense mitjançant el paquet FreeRadius2
Internet

Com configurar un servidor Radius a pfSense mitjançant el paquet FreeRadius2

am treballa com a anali ta de xarxa per a una empre a comercial algorítmica. Va obtenir el títol de batxiller en tecnologia de la informació per la UMKC.En aque t article, vaig a revi ...