ATMEL: Microcontrolere AVR RISC

22 MARTIE 2001

de Alf-EgilBogen Vegard Wollen
ATMEL Development Center, Trondheim, Norvegia

Limbajele la nivel înalt devin rapid metoda de programare standard pentru microcontrolere, chiar şi pentru dispozitivele mici de 8 biţi. Limbajul “C” este probabil cel mai utilizat limbaj de nivel înalt, dar în multe aplicaţii poate rezulta un cod de dimensiune mare în comparaţie cu metoda programării directe în limbaj de asamblare. ATMEL a sesizat necesitatea unei arhitecturi speciale, adaptată la limbajul “C”, cu scopul de a reduce această diferenţă. Rezultatul îl constituie microcontrolerele AVR, care permit scrierea de cod cu dimensiune redusă, dispun de o arhitectură RISC cu 32 de acumulatoare de uz general; execută 1 instrucţiune / tact şi sunt de cca. 4 ÷ 12 ori mai rapide decât microcontrolerele obişnuite

.
1. Introducere
Paleta de microcontrolere AVR este compusă din numeroase tipuri, împărţite în trei subfamilii: ATtiny – AVR în 8 pini, AT90 Sxxxx – AVR de uz general şi ATmega – AVR de înaltă performanţă. Toate microcontrolerele AVR sunt dotate cu memorie program şi de date reprogramabile electric. Toate au consum redus de putere, executând totuşi 1 MIPS (Mega Instructions Per Second). Frecvenţele maxime de ceas acceptate sunt de 1 ÷ 4MHz la circuitele ce se alimentează la 2,7V (LV) şi 8 ÷ 12 MHz la celelalte.

2. Arhitectură RISC superioară
Pentru a executa un anumit task, arhitecturile RISC existente necesită o lungime de cod mai mare decât dacă aceeaşi funcţie s-ar implementa într-o arhitectură CISC (Complex Instruction Set Computer). În ciuda acestui fapt, arhitecturile RISC sunt frecvent alese acolo unde este necesară o viteză mare.
Arhitectura AVR este concepută ca o arhitectură RISC, totuşi cu un număr mare de instrucţiuni pentru a reduce dimensiunea de cod păstrând viteza mare de execuţie. Instrucţiunile de tip CISC sunt introduse fără a altera performanţa RISC şi consumul de putere. Această îmbunătăţire majoră a fost realizată după îndelungi analize ale diferitelor arhitecturi şi aplicaţii de cod.
A doua îmbunătăţire este realizată printr-o optimizare a limbajului de asamblare şi a arhitecturii pentru limbajul “C”. Aceasta s-a realizat prin aplicaţii în care codul a fost pseudo-compilat pentru diferite alternative de arhitectură.
Multe arhitecturi de microcontrolere au un număr scăzut de registre generale sau de registre de lucru (acumulatoare) – în general 1 ÷ 8 registre. Acest fapt este un mare dezavantaj pentru compilarea cu “C”, unde este necesară multă mişcare de date. AVR-ul are 32 de registre de uz general, pe care compilatorul “C” le foloseşte la maximum pentru a atinge o densitate mare a codului generat.

3. Instrucţiuni într-un singur ciclu
Majoritatea instrucţiunilor se execută într-un singur ciclu. La acestea ceasul intern este identic cu ceasul oscilator. Nu există divizor intern care să producă faze de ceas multiple.

Figura 1

Multe microcontrolere de 8 ÷ 16 biţi divizează ceasul cu raţia de 1:4 până la 1:12, fapt care împiedică posibilităţile tehnologice de creştere a vitezei. Pentru o aplicaţie dată, AVR-ul va lucra de 4 ÷ 12 ori mai rapid sau consumul de putere va fi redus de 4 ÷ 12 ori la aceeaşi frecvenţă de ceas. Aceasta deoarece în tehnologia CMOS consumul de putere este proporţional cu frecvenţa. Figura 1 arată sugestiv raportul dintre puterea de calcul, exprimată în MIPS şi puterea consumată la AVR şi la microcontrolere ce divizează ceasul cu 1:4 şi 1:12.

4. Proiectat pentru limbajul “C”
Limbajul “C” este cel mai folosit HLL (High Level Language) pentru microcontrolere. Deoarece majoritatea arhitecturilor de microcontrolere sunt proiectate pentru a fi programate în limbaj de asamblare, susţinerea pentru instrucţiunile de “C” este deficitară. ATMEL a dorit dezvoltarea unei arhitecturi care să fie eficientă atât pentru limbajul “C”, cât şi pentru asamblare. Cooptarea în echipă a mai multor experţi de “C” a făcut posibilă realizarea unui cod foarte eficient pentru microcontrolerele de 8 biţi cu suport de 16 biţi.

În programarea în “C”, o regulă importantă este aceea de a folosi variabile definite într-o rutină (local), în locul folosirii variabilelor globale declarate pentru întregul program. Variabilele locale vor aloca memorie RAM doar atunci când se execută o rutină specifică în timp ce variabilele globale ocupă memoria RAM în permanenţă. Pentru a utiliza variabilele locale rapid şi eficient sunt necesare o mulţime de registre de uz general. AVR-ul are 32 registre de uz general, toate legate la ALU (Aritmetic Logic Unit), permiţând instrucţiuni într-un singur ciclu. Figura 2 arată cât de eficiente pot fi mai multe registre în comparaţie cu arhitecturile tradiţionale CISC cu un singur acumulator.

Figura 2

Trei perechi ale celor 32 de registre pot fi folosite ca pointere pe 16 biţi permiţând salturi şi apelări indirecte asemănător cu multe moduri de adresare a memoriei de date în “C”. În plus, stiva pentru adresa de “return” este disponibilă prin instrucţiune. Cele mai multe arhitecturi de microcontrolere deţin doar 1 ÷ 2 acumulatoare şi 1 ÷ 2 pointere.
Din moment ce pointerele sunt foarte frecvent folosite în “C”, operaţiunile cu pointere sunt foarte importante din punct de vedere al vitezei şi dimensiunii de cod. AVR-ul are moduri de adresare care pre-incrementează şi post-decrementează în mod direct pointere când se accesează memoria de date.

Figura 3

În plus, operaţiunile tabelare şi de acces stivă pot fi realizate eficient folosind deplasamente (raportate la valoarea curentă a pointerului) după cum se arată în figura 3. Deplasamentele variază între 0 ÷ 64 octeţi; analize detaliate arată că variaţia este suficientă pentru majoritatea operaţiilor în structuri şi tabele. Şi în plus aceste instrucţiuni au un singur cuvânt şi se execută într-un singur tact!
Pentru a schimba pointerele altfel decât prin pre-decrementare şi post-incrementare sunt implementate operaţiuni de adunare şi scădere între un pointer de 16 biţi şi o constantă. Acestea au un singur cuvânt şi se execută într-un singur tact. Cele trei pointere pot fi de asemenea utilizate ca 8 registre de uz general pe 8 biţi sau ca trei registre de uz general pe 16 biţi.
În general, este important să se folosească numere de 8 biţi într-un MCU de 8 biţi din moment ce toate memoriile de date sunt pe 8 biţi. Totuşi, când se utilizează limbajul “C”, numere mari din tipurile “integer” (16 biţi), “long” (32 biţi), “float” (32 biţi) sunt frecvent folosite. De regulă procesarea cu asemenea numere generează dimensiuni de cod foarte mari, dar din moment ce AVR-ul este proiectat pentru a-i face faţă, codul AVR generat este foarte eficient.

exemple 1

Exemplul 1 arată o aplicaţie în care o mică parte a unei rutine scrisă în “C”, este compilată pentru a vedea cum este tradusă în codul de asamblare.
n1 şi n2 sunt numere de 32 biţi ce necesită câte 4 octeţi. n3 este un “integer” care necesită 2 octeţi. Toate cele trei variabile sunt definite ca variabile locale într-o rutină.
Acest exemplu de program generează un cod de asamblare AVR extrem de compact. n1 = R3:R0, n2 = R7:R4, şi n3 = R17:R16
În majoritatea microcontrolerelor comparaţia din exemplul 1 necesită mai multe instrucţiuni pentru că nu există propagare de “Zero Flag” la “Compare with Carry” (CPC).

Propagarea “Zero Flag”-ului are o funcţiune similară cu cea a propagării “Carry Flag”-ului, anume aceea de a ajusta octeţii mai semnificativi dintr-un număr. Propagarea “Zero Flag”-ului este implementată pentru a permite comparări şi scăderi. O instrucţiune “Compare” este în general o scădere fără stocare de rezultat. Instrucţiunea CPC este adăugată pentru a susţine comparaţii de numere mai lungi de 8 biţi.
Exemplul 1 arată de asemenea cum o instrucţiune “Subtract Immediate” (SUBI) şi o instrucţiune “Subtract Immediate with Carry” (SBCI) pot fi folosite în locul adunării (ADDI şi ADCI) pentru a procesa n3 + 5, scăzând complementul lui 5. Din moment ce ADDI şi SUBI sunt instrucţiuni coplementare, doar o singură pereche este implementată pentru a nu ocupa inutil spaţiul de instrucţiuni.
Toate aplicaţiile discutate sunt rezultatul unei analize de cod realizată de experţii în compilatoare “C”. Rezultatul este un microcontroler foarte rapid cu performanţă RISC şi densitate de cod CISC.
Traducere: Cristian Alexe
ALEXE ELECTRONICE AE S.R.L.
e-mail: calexe@canad.ro
Informaţii suplimentare: www.atmel.com
Distribuţie: www.codico.com, calexe@canad.ro

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *

  • Folosim datele dumneavoastră cu caracter personal NUMAI pentru a răspunde comentariilor/solicitărilor dumneavoastră.
  • Pentru a primi raspunsuri adecvate solicitărilor dumneavoastră, este posibil să transferăm adresa de email și numele dumneavoastră către autorul articolului.
  • Pentru mai multe informații privind politica noastră de confidențialitate și de prelucrare a datelor cu caracter personal, accesați link-ul Politica de prelucrare a datelor (GDPR) si Cookie-uri.
  • Dacă aveți întrebări sau nelămuriri cu privire la modul în care noi prelucrăm datele dumneavoastră cu caracter personal, puteți contacta responsabilul nostru cu protecția datelor la adresa de email: gdpr@esp2000.ro
  • Abonați-vă la newsletter-ul revistei noastre