Sari la conținut

Au AVR-urile pe 8 biti avantaje reale fata de uC-urile 8051 high speed


beamrider

Postări Recomandate

Au oare AVR-urile pe 8 biti avantaje reale fata de uC-urile 8051 ultrarapide care executa instructiunile in 1 - 2 tacti spre deosebire de 12 - 48 cit avea nevoie un 8051 clasic?

 

Citind despre uC-ul AT89LP de la Atmel:

http://atmel.com/dyn/resources/prod_documents/doc4088.pdf

si variante echivalente facute de Silicon Labs:

http://www.silabs.com/products/mcu/Pages/8051-microcontroller.aspx

am inceput sa-mi pun intrebarea daca intr-adevar AVR-urile pe 8 biti mai renteaza sa fie invatate de catre cineva care are experienta cu procesoarele 8051 clasice(microprogramate, lente).

 

Atita vreme cit 8051 high speed si AVR-ul isi efectueaza instructiunile in limbaj de asamblare tot in 1 - 2 tacti inseamna ca merg la fel de repede pentru aceeasi frecventa a ceasului.

 

La nivelul anului 1997, 8051 era doar microprogramat si in esenta inferior ca viteza de executie unui AVR deoarece fiecare cod in limbaj de asamblare 8051 pornea o subrutina microprogramata care se executa in 12 - 48 tacti, spre deosebire de AVR la care instructiunile nu declansau subprograme.

Pretul platit de AVR era si este in continuare ca programele scrise pentru acesta sunt cu 30 - 40% mai lungi, ocupa cu 30 - 40% mai multa memorie, decit cele pentru 8051 fie el clasic sau high speed. Cu alte cuvinte, instructiunile lui 8051 sunt mai puternice, mai simple, decit cele ale procesorului RISC AVR.

 

Totusi, chiar daca un program in asamblare pentru AVR ocupa 45 Kocteti in timp ce echivalentul sau pentru 8051 are nevoie doar de 32 Kocteti (lucru care poate fi foarte important avind in vedere resursele limitate de memorie ale uC-urilor) AVR-ul iese net cistigator la viteza deoarece instructiunile sale necesita 1 - 2 tacti de ceas in timp ce 8051 clasic are nevoie de 12 - 48 cicli masina.

 

Una este sa executi un cod de 1000 instructiuni, scris pentru 8051 clasic, in 12000 tacti si total altceva sa rulezi un program AVR echivalent, care are 1400 instructiuni dar se executa in 1400 tacti. AVR-ul cistiga clar la capitolul viteza fiind de 8.5 ori mai rapid ca un 8051 standard.

 

Totusi, in cazul noilor 8051 high speed, AVR-ul ar parea ca pierde vizibil, desi nu cu mult, atit la memoria necesara, avind nevoie de 1400 instructiuni fata de doar 1000 pentru un 8051 high speed, cit si la timpul de executie deoarece AVR-ul necesita 1400 tacti iar 8051 high speed doar 1000!

 

Cineva avind experienta directa cu AVR-uri cit si cu 8051 high speed ar putea face o comparatie obiectiva. Ar fi interesant de ascultat o asemenea opinie izvorita din experienta personala. Prin 1997 AVR era mai rapid ca 8051 de atunci. Acum in 2011 lucrurile ar parea sa se fi inversat.

 

Nota: Subiect preluat cu unele modificari de pe un alt site.

Link spre comentariu
Distribuie pe alte site-uri

La nivelul anului 1997, 8051 era doar microprogramat si in esenta inferior ca viteza de executie unui AVR deoarece fiecare cod in limbaj de asamblare 8051 pornea o subrutina microprogramata care se executa in 12 - 48 tacti,

 

 

 

 

nu asta era motivul, 8051/52 aveau un divizor cu 12 imediat dupa oscilator, deci la un quartz de 12 MHz, core-ul functiona cu 1 Mhz si era o limitare a semiconductorilor din zilele respective. Cele de azi tinute in viata numai din cauza tonelor de cod scris (legacy code) nu mai au divizorul deci ruleza la viteza oscilatorului, bineinteles cu toate implicatiile, PWM-ul timerele toate delay-urile s-au dat peste cap, deci codul oricum trebuie schimbat pe ici pe colo.

 

 

Totusi, in cazul noilor 8051 high speed, AVR-ul ar parea ca pierde vizibil, desi nu cu mult, atit la memoria necesara, avind nevoie de 1400 instructiuni fata de doar 1000 pentru un 8051 high speed, cit si la timpul de executie deoarece AVR-ul necesita 1400 tacti iar 8051 high speed doar 1000!

 

eh, nu-i chiar asa, are nevoie de memorie mai multa pentru ca are 16 biti pe instructiune, dar executa aduce instructiunea aia pe un singur tact pentru ca are flash-ul pe 16 biti (practic o adresa in PC counter pointeaza la un word de 16 biti in memoria de program) la 8051 memoria de program (si busul de la memorie la unitatea de executie) e de 8 biti deci va avea nevoie de 2 tacturi, evident cu pipeline nu prea conteaza, dar conteaza la branch-uri (la salturi conditionale) ca trebuie sa faca flush la pipe line.

Eu zic sa compilam un program simplu si sa comparam cate instructiuni foloseste AVR si cate 8051. Alege tu un program si eu il complilez pentru AVR, dar ceva simplu care-l putem urmarii fara sa ne pierdem prin el. de exemplu hai sa inmultim doua numere floating point pe care le aducem din memoria RAM, eu zic ca 8051 va pierde la o lungime de vapor.

 

 

 

In 1998 am scris un cross-compilator pentru 8052 care recompila cod scris in limbaj masina pentru PLC-urile romanesti si-l recompila pentru 8051/52 (cu mici limitari) deci am lucrat cu ele. Din 2000 incoace am inceput sa folosesc AVR-uri si procesoare scrise in VHDL (RISC8 si RISC32 pe FPGA) asta fiind de fapt meseria mea.

 

Diferentele intre AVR si 8051/52 sunt mari si multe, o comparatie la nivel de semnal de clock e inselatoare in cazul asta.

 

1. AVR aduce instructiuni din memorie intr-un singur access 16 biti (memoria de program flash e organizata pe 16 biti intern) deja aici -la batut rau de tot, poate accesa registrii de 16 biti intr-un clock

2. Are 32 registrii interni de 8 biti care pot fi accesati si ca 16 registrii de 32 biti, poti realiza functii complexe fara a fi necesar sa impingi date/pointeri pe stack.

3. Are Ram intern suficient ca poti tine un stack/heap decent fara sa apelezi la memorie externa unde platesti penalitate la access. (4-5 tacturi la access)

4. Arhitectura RISC, putine intructiuni 120 (dar mai lungi, 16 biti) care se executa pe un tact majoritatea.

5. Are multiplicator hardware, aici il bate rau de tot pe 8051 care saracu trebuie sa genereze compliatorul o succesiune de instructiuni (sau sa scrii de mana in asm) si nu scapi fara minim 40 tact-uri la fiecare multiplicare.

6. AVR are un sistem de intreruperi mult mai sofisticat, 7 surse de intrupere in cel mai simplist caz si latenta mica la intrerupere.

7. poate face operatii aritmetice direct pe registrii interni R0-R31 nu e nevoie sa aduci datele in Acumulator.

 

practic pe 1 MHz AVR face mult mai multe decat un 8051. (1 MHz direct la core) lucru dovedit si din testele MIPS.

gaselnita cu frecventele de 80-100Mhz la MCU e sa faci o copie a continutului flash intr-un ram (shadow) si sa executi de acolo, flash-ul fiind partea cea mai lenta la MCU-uri.

Am reusit sa rulam procesoare RISC simple cu 250MHz in FPGA-uri fara probleme (cu memoria de program RAM, preincarcata la configurarea FPGA.) - evident procesoare soft scrise in VHDL

RR

 

PS - pentru 99% din utilizatori diferenta de viteza nu are nici o relevanta pentru ca ei citesc butoane si aprind led-uri.

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

Se pare ca la 8051 asta nou i-au adugat multiplicator hardware si un MAC cu fifo pentru dsp. - incepe sa nu mai semene cu 8051, se cam chinuie sa-l modernizeze dupa parerea mea.

 

thereby providing 6-12 times or higher throughput than the classic 8051. Seventy percent of the instructions execute in the same number of clock cycles as the number of bytes to be fetched, allowing up to 1 MIPS per MHz of system frequency

 

asta e marketing 100%, atenti la "up to" care e "pana la" numai in unele cazuri, 70% din instructiuni iau acelasi numar de tacturi cu numarul de octeti al instructiunii, dar nu zic nimic de restul de 30%...si banuiesc ca astea nu sunt cele mai rapide, ca evident le mentionau.

 

problema e ca are instructiuni lungi si bus intern de memorie mic (8 biti). Ca sa aduca o instructiune are nevoie de un numar de tacturi egal cu numarul de octeti al instructiunii, si din cauza numarului variabil de octeti pe instructiune nu prea e eficient pipeline-ul, la un branch conditional, va trebui sa invalideze ce a adus deja din memorie si sa aduca altele, de exemplu la AVR nu sufera de asta, doar schimba PC-ul si aduce intructiunea noua (pe un tact) - e pretul platit de necesitatea de a fi in continuare compatibil cu setul de instrunctiuni de la vechiul 51/52.

 

Raman la parerea mea, ca un test (sau mai multe) vor arata cat de ineficient e in realitate fata de AVR

RR

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

nu asta era motivul, 8051/52 aveau un divizor cu 12 imediat dupa oscilator, deci la un quartz de 12 MHz, core-ul functiona cu 1 Mhz si era o limitare a semiconductorilor din zilele respective. Cele de azi tinute in viata numai din cauza tonelor de cod scris (legacy code) nu mai au divizorul deci ruleza la viteza oscilatorului, bineinteles cu toate implicatiile, PWM-ul timerele toate delay-urile s-au dat peste cap, deci codul oricum trebuie schimbat pe ici pe colo.

Vechile 8051 necesitau cel putin 12 operatii elementare facute secvential in 12 tacti consecutivi pentru executia unei instructiuni in limbaj de asamblare.

 

Noile 8051, de mare viteza, au nevoie de doar 1 - 2 tacti pentru executia aceleiasi instructiuni in asamblor.

Viteza lor nu vine din cresterea frecventei de tact care le comanda unitatea centrala ci din schimbarea arhitecturii hard pentru a necesita mai putini cicli pe instructiune.

 

NOTA: Atita vreme cit nu dai un citat si o schema pentru a vedea clar la ce se refera acea divizare a frecventei cu 12, de care pomenesti, nu vreau sa speculez acum despre care ar fi neintelegerea pe care o ai.

Editat de beamrider
Link spre comentariu
Distribuie pe alte site-uri

Vechile 8051 necesitau cel putin 12 operatii elementare facute secvential in 12 tacti consecutivi pentru executia unei instructiuni in limbaj de asamblare.

 

cred ca nici facute initial de intel nu aveau microcod, cele fabricate in anii '90 (de atmel, de ex 89C52) aveau un ROM care decodifica instructiunile (care mergea pe un tact) si aveau un divizor crud cu 2 si un state machine cu 6 stari,

 

 

PS -in zilele noastre sa faci un look up table (ROM) de 256 de locatii sa decodifici instructiuni de 8 biti sunt cateva linii de cod vhdl si merge pe un tact.(daca faceam eu asta in RO in anul 1999 sunt sigur ca stiau si aia de atmel s-o faca prin 1995 ca nu eram eu asa destept) - procesoarele cu microcod se mai predau in facultati ca sa priceapa studentii cum se faceau initial.Tin minte pe vremuri lumea genera ISA in asa fel incat sa devina decodorul mai simplu (minimizare) in ziua de azi nu mai e nici un avantaj, poti sa alegi un ISA arbitrar ca oricum tool-urile de proiectare o sa aleaga un ROM 256 sau multiplii de el, cand sintetizeaza cipul.

 

PS2 - daca ai un datasheet care sa spuna ca MCS-51 (sau stramosul lui MCS-48) aveau microcod da-mi si mie link-ul ca sunt curios, eu stiu ca au LUT pentru decodificarea instructiunilor, dar poate gresesc eu.

 

PS3 - am gasit datasheet-ul original Intel - care zice : un ciclu masina e facut din 6 stari a cate 2 perioade de clock, cam juma din setul de instructiuni se exectuta pe 1 ciclu masina iar restul pe 2 cicluri (nu vorbim de access la memoria externa sau DIV/MUL care iau 4 cicluri masina) - deci cam la 12clk sau 24clk se executa ceva.

datasheetul il gasesti aici http://www.8051proje...ser-manual.html

RR

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

uitat-te in datasheet-ul original de la AT89C52 si vei vedea ca timer0/1/2 folosesc Fosc/12 http://www.atmel.com...nts/doc0313.pdf PAG 7 fig 1, acelasi CLK/12 e reutilizat si pentru CPU (sau crezi ca e o coincidenta ca au ales sa ruleze timerele cu Fosc/12, care e si o limitare nasoala la 8051 ala vechi)

La pagina 9 fig 4 apare frecventa de oscilatie divizata cu 2 nu cu 12.

Timerele sunt niste periferice ale uC-ului. Viteza lor de numarare nu implica in nici un fel ca unitatea centrala de procesare ar efectua instructiuni elementare cu aceeasi viteza.

 

Am impresia ca subiectul topicului este deja puternic deturnat de o serie de speculatii despre cum sunt organizate intern vechile si noile 8051 cit si AVR-urile. Indeosebi la 8051 high speed, nu stim ce arhitectura interioara au si drept consecinta nu putem aprecia performantele lor decit prin benchmark-uri facute de unii care au lucrat cu ele.

Link spre comentariu
Distribuie pe alte site-uri

corect nu are rost sa speculam!

 

alege niste cod (preferabil de nivel inalt, dar nu neaparat) si hai sa numaram ciclurile de clock. (le zice simulatorul)

ceva sa contina cateva cicluri for, branch-uri si operatii logice eventual aritmetice cu variabile care sa depaseasca 8 biti.

ce zici?

 

pentru ca nu avem access la fast 8052 folosim unul normal si inmultim cu rezultatele cu 12, ti se pare fair? (ca ei zic in datasheet ca merge de la "6x up to 12x")

RR

 

PS - am aruncat si o intrebare la un FAE de la Atmel sa vedem ce zice (asta de lene)

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

1) Si eu am lansat ideea unor comparatii, pe forumul AvrFreaks, intre AVR 8 biti si 8051 high speed.

vezi subiectul reinviat dupa zece ani de aici: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=4836&sid=c932cecb4d5b0063c624990d001c8ea7

Reactia moderatorilor a fost urita dar unii useri au venit cu niste comparatii interesante desi inca incomplete.

 

2) Exista un benchmark (vezi tabelul) cu numarul de cicli masina in care un AVR calculeaza valoarea anumitor functii de argument dat. Principala deosebire intre AVR2 si AVR4 este un multiplicator hard.

 

Function --------Avr2--Avr4

 

acos (0.54321) -- 4411 -- 2455 (tacti)

cos (1.2345) -- 3387 -- 1671

exp (1.2345) -- 4708 -- 2765

log (1.2345) -- 4142 -- 2134

log10 (1.2345) -- 4498 -- 2260

round (1.2345) -- 150 -- 150

sin (1.2345) -- 3353 -- 1653

sinh (1.2345) -- 4946 -- 3003

sqrt (1.2345) -- 494 -- 492

tan (1.2345) -- 4381 -- 2426

trunc (1.2345) -- 178 -- 178

 

Sursa: http://www.gnu.org/savannah-checkouts/non-gnu/avr-libc/user-manual/benchmarks.html

 

Daca ai posibilitatea calculeaza in citi tacti efectueaza un 8051 clasic functiile de mai sus.

Editat de beamrider
Link spre comentariu
Distribuie pe alte site-uri

interesant thread, wek are un point acolo. (iar moderatorul e de toata jena, adica lumea vrea sa discute si el tot o tine cu votatul)

ai idee ce tip de float a fost declarat 1.2345 ?

sa fiu sincer eu speram sa faci tu alea pentru 8051 ca eu nu mai am tool-uri pentru el demult. (am un amic care cred ca mai are un Keil full cu licenta)

RR

 

PS- incerc sa arunc un ochi diseara, acum am niste placi cu solder paste pe ele care nu pot sa le tin ca altfel o iau de la capat.

revin mai pe seara

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

uite un test pentru sinus

compilatorul SDCC (din cate stiu e toto bazat GNU deci ar trebui sa nu fie foarte diferit de GCC ca performanta)

codul C:

#include <math.h>

 

float main(void){

 

return(sinf(1.2345));

}

 

footprint la codul generat

 

Name Start End Size Max

---------------- -------- -------- -------- --------

PAGED EXT. RAM 0 256

EXTERNAL RAM 0 65536

ROM/EPROM/FLASH 0x0000 0x08e0 2273 65536

 

deci aici pierde 8051 pierde in fata lui AVR4 (cu mul) dar nu e neparat concludent testul asta (nu stiu cu ce optimizari a fost compilat codul de AVR, eu nu am pus nici un fel de optimizari la SDCC) Am sa incerc sa compilez acelasi cod si in AVR cu optimizari identice.

RR

 

PS mai multe rezultate

 

acos(0.54321) 3510 bytes

cos(1.2345) 2275 bytes

exp(1.2345) 1495 bytes

log(1.23456) 867 bytes

log10(1.2345) 1080 bytes

 

sin(1.2345) 2273 bytes

sinh(1.2345) 2615 bytes

Editat de roadrunner
Link spre comentariu
Distribuie pe alte site-uri

roadrunner,

Comparam tacti cu bytes?!

 

8051 -> sin(1.2345) --- 2273 bytes

AVR 4 -> sin (1.2345) --- 1653 tacti

 

In exemplul cu AVR 2 si AVR 4 era vorba de viteza de calcul, exprimata in tacti (perioade de ceas), in care se calcula un sinus de argument dat, cit si alte functii. Se pare ca tu ai evaluat pentru 8051, in citi bytes se compileaza un program minimal in C care calculeaza acelasi sinus, apoi ai refacut experimentul pentru alte functii.

 

Daca un program in cod masina pentru 8051 are 2273 bytes si fiecare octet este o instructiune care se executa intr-un tact iar programul nu are bucle sau salturi, curgind liniar de la un capat la celalalt atunci da, 2273 bytes inseamna 2273 tacti, ca timp de executie, insa nu avem de unde sa stim ce algoritm s-a folosit pentru calculatrea sinusului si este putin probabil sa se fi utilizat un cod liniar. Pe de alta parte chiar si pentru 8051 high speed instructiunile nu tin toate un tact.

 

Mai mult, in codul

#include <math.h>

float main(void){

return(sinf(1.2345));

}

care se transforma in bytes nu avem de unde cunoaste cit la suta din cei 2273 octeti reprezinta rutina de calcul a sinusului si cit % din ea este efectiv folosita la evaluarea lui sin(1.2345). Ca in orice subrutina exista salturi care ignora grupuri de instructiuni daca sunt sau nu sunt satisfacute anumite conditii.

Editat de beamrider
Link spre comentariu
Distribuie pe alte site-uri

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock