Curs Sist Embedded Inteligente - Hardware

35
1 1. Introducere Un sistem de tip embedded sau încastrat este un sistem comandat de un microprocesor, microcontroler sau de un DSP (Digital Signal Processor – procesor dedicat procesării digitale a semnalelor). Această parte electronică, ce are drept nucleu un procesor (microprocesor, microcontroler sau DSP), este inclusă, încastrată (embedded) ca subsistem a unui dispozitiv mult mai complex, dispozitiv care poate să includă şi alte componente hardware sau părţi mecanice. Un astfel de sistem este proiectat să execute un număr finit de funcţii, de multe ori având diferite constrângeri în executarea acestor funcţii; constrângeri legate de resursele disponibile sau de tip temporal (rezolvarea unor sarcini într-un interval de timp bine stabilit). În concluzie, spunem că un sistem embedded este un dispozitiv ce are cel puţin un procesor în structura sa. Diferenţele existente între un calculator de uz general şi un dispozitiv de tip embedded sunt prezentate în tabelul de mai jos. Tabel 1. Diferenţele existente între un calculator de uz general şi un sistem embedded Calculatoare de uz general 1 Dispozitive embedded Pot efectua sarcini diverse (divertisment, calcule matematice, comunicaţii etc.) atâta timp cât există o aplicaţie (program – software) şi resursele necesare efectării ei. Efectuează o sarcină sau un număr de sarcini predefinite. Nu implică constrângeri de procesare sau prelucrare a datelor de timp real. Constrângerile existente țin doar de fluența comunicării, prezentării informațiilor către un utilizator (de confortul acestuia). O bună parte din aceste sisteme necesită performanțe de timp real pentru asigurarea siguranței și funcțiilor echipamentelor în care sunt incluse. Toate calculatoarele personale au o arhitectură ce respectă un anumit standard. Dispozitivele embedded nu respectă nici un standard (fiind de altfel de o diversitate rar întâlnită). Arhitectura acestora este specifică: sarcinii pe care trebuie să o îndeplinească şi mediului de lucru. În cea mai mare parte a lor sunt sisteme independente. În cea mai mare parte a lor sunt părți componente a unui sistem mult mai complex. Dezvoltarea programelor se poate realiza pe acelaşi sistem pe care vor rula. Dezvoltarea aplicaţiei software ce va rula pe aceste dispozitive este realizată pe alte calculatoare. 1 de exemplu un calculator personal

description

Curs Sisteme Embedded Inteligente

Transcript of Curs Sist Embedded Inteligente - Hardware

Page 1: Curs Sist Embedded Inteligente - Hardware

1

1. Introducere

Un sistem de tip embedded sau încastrat este un sistem comandat de un microprocesor, microcontroler sau de un DSP (Digital Signal Processor – procesor dedicat procesării digitale a semnalelor). Această parte electronică, ce are drept nucleu un procesor (microprocesor, microcontroler sau DSP), este inclusă, încastrată (embedded) ca subsistem a unui dispozitiv mult mai complex, dispozitiv care poate să includă şi alte componente hardware sau părţi mecanice. Un astfel de sistem este proiectat să execute un număr finit de funcţii, de multe ori având diferite constrângeri în executarea acestor funcţii; constrângeri legate de resursele disponibile sau de tip temporal (rezolvarea unor sarcini într-un interval de timp bine stabilit).

În concluzie, spunem că un sistem embedded este un dispozitiv ce are cel puţin un procesor în structura sa.

Diferenţele existente între un calculator de uz general şi un dispozitiv de tip embedded sunt prezentate în tabelul de mai jos.

Tabel 1. Diferenţele existente între un calculator de uz general şi un sistem embedded

Calculatoare de uz general1 Dispozitive embedded

Pot efectua sarcini diverse (divertisment, calcule matematice, comunicaţii etc.) atâta timp cât există o aplicaţie (program – software) şi resursele necesare efectării ei.

Efectuează o sarcină sau un număr de sarcini predefinite.

Nu implică constrângeri de procesare sau prelucrare a datelor de timp real. Constrângerile existente țin doar de fluența comunicării, prezentării informațiilor către un utilizator (de confortul acestuia).

O bună parte din aceste sisteme necesită performanțe de timp real pentru asigurarea siguranței și funcțiilor echipamentelor în care sunt incluse.

Toate calculatoarele personale au o arhitectură ce respectă un anumit standard.

Dispozitivele embedded nu respectă nici un standard (fiind de altfel de o diversitate rar întâlnită). Arhitectura acestora este specifică: sarcinii pe care trebuie să o îndeplinească şi mediului de lucru.

În cea mai mare parte a lor sunt sisteme independente.

În cea mai mare parte a lor sunt părți componente a unui sistem mult mai complex.

Dezvoltarea programelor se poate realiza pe acelaşi sistem pe care vor rula.

Dezvoltarea aplicaţiei software ce va rula pe aceste dispozitive este realizată pe alte calculatoare.

1 de exemplu un calculator personal

Page 2: Curs Sist Embedded Inteligente - Hardware

2

Dispozitive mecanice de tipul hardisk (HDD) stochează programele software şi sistemul de operare. HDD oferă deasemenea capacităţi suplimentare de stocare pentru diversele necesităţi ale utilizatorului.

Stocarea se realizează pe medii SSSD (solid state storage devices) gen memorii flash. Aceste dispositive nu au părți mecanice în mişcare iar capacitatea lor medie de stocare este net inferioară HDD.

Constrângerile de consum a acestor sisteme nu sunt foarte limitative, din acest motiv consumul este mult mai mare ca al sistemelor embedded.

Funcție de aplicația specifica în care aceste sisteme sunt utilizate constrângerile de consum pot fi extrem de dure, existând familii întregi care sunt optimizate doar pentru un consum redus. În genere consumul dispozitivelor embedded este mult mai mic decât al calculatoarelor de uz general.

2. Considerentehardwareasuprasistemelorembedded

2.1. Arhitecturi

Unul dintre conceptele fundamentale ce definesc un procesor este acela al arhitecturii acestuia. În cadrul procesului de dezvoltare conceptuală şi ulterior de implementare fizică a unui sistem embedded primul pas constă, de altfel, în alegerea arhitecturii procesorului, ulterior această alegere ne va influenţa întregul lanţ decizional. În continuare ceea ce este cu adevărat interesant este să definim noţiunea de arhitectură şi să observăm influenţele pe care aceasta le are asupra performanţelor diferitelor procesoare.

Arhitectura unui microprocesor precizează conceptele fundamentale ce stau la baza construcţiei interne a acestuia, definind structura care susţine şi care se află în spatele modului de manipulare şi calcul a datelor – de exemplu, încărcarea/stocarea din/în memorie, adunare, scădere, înmulţire şi împărţirea diferitelor valori.

La ora actuală există un număr foarte mare de arhitecturi. Câteva dintre acestea sunt următoarele:

1. IA-32 (Intel Architecture 32-bit) cunoscută publicului larg sub denumirea x86, x86-32 sau i386 este arhitectura utilizată şi impusă de către compania Intel. IA-32 este o arhitectură pe 32 de biţi de tipul von Neuman, implementată pentru prima dată pe microprocesorul 80386. Această arhitectură a fost extinsă şi pentru structuri pe 64 de biţi, IA-64, păstrându-se însă compatibilitatea cu IA-32. IA-64 a fost implementată pentru prima dată în cadrul familiei de microporcesoare Itanium. O prezentare în detaliu a procesoarelor ce au la bază această arhitectură va fi realizată în subcapitolul „2.2. Unitatea centrală de procesare”. În principal aceste procesoare sunt dedicate pieții calculatoarelor personale având prea puține legături cu piața sistemelor embedded.

Începând cu familia de procesoare Atom, compania Intel își face simțită prezența și pe piața sistemelor embedded. Această famile de procesoare are la

Page 3: Curs Sist Embedded Inteligente - Hardware

3

bază arhitecturile IA-322 și/sau IA-643 fiind capabile să ruleze la tensiuni de operare foarte mici – de aici rezultând și consumul redus de energie, una din cerințele fundamentale ce caracterizează o clasă largă de dispozitive embedded. În principal, familia de procesoare Atom a fost lansată pentru a contrabalansa oferta existentă a concurenților pe piața sistemelor optimizate pentru curenți și costuri scăzute (de exemplu: familia Geode produsă de AMD sau ARM).

2. ARM (Advanced RISC Machines) este o arhitectură RISC pe 32 de biţi şi a fost dezvoltată de Compania ARM Holdings plc din Cambridge, Marea Britanie. Dacă procesoarele bazate pe arhitectura x86 domină piaţa calculatoarelor personale, procesoarele bazate pe arhitectura de tip ARM domină în totalitate piaţa bunurilor la larg consum fiind înglobate în telefoanele mobile, media playere, PDA-uri, console de jocuri, rutere şi în nenumărate periferice ale calculatoarelor personale precum plăci video, hardisk-uri etc.

Arhitectura ARM este cea mai utilizată din punct de vedere a numărului de procesoare produse, ce o au la bază, şi utilizate în diferite aplicaţii. Astfel în anul 2006 s-a estimat că în jur de 98% din telefoanele mobile au în componenţă cel puţin un procesor bazat pe o arhitectură de tip ARM [Krazit, 2006]. În timp ce în anul 2009 aproximativ 90% din piaţa procesoarelor embedded erau bazate pe o arhitectură de tip ARM [Wikipedia, 2011].

Un alt avantaj fundamental al procesoarelor bazate pe arhitectura ARM este dat de consumul redus al acestor procesoare. Acest consum redus este generat în principal de simplitatea arhitecturii. Arhitectura ARM a cunoscut în timp un număr mare de versiuni. Versiunea 2 a arhitecturii (depăşită la ora actuală), ARMv2, a stat la baza microprocesorul ARM2 – produs în 1986. Acest microprocesor a fost considerat cel mai simplu microprocesor pe 32 de biţi, având în componenţă în jur de 30.000 de tranzistoare. Pentru comparaţie procesorul produs de Intel 80386 în anul 1986 îngloba 275.000 de tranzistoare. Simplitatea arhitecturii ARM a generat un consum foarte scăzut; performanţele acestui microprocesor au fost superioare microprocesorului 80286 produs de compania Intel. Continuând-uşi evoluţia această arhitectură şi-a păstrat simplitatea4, simplitate generatoare a acestor consumuri reduse. Această simplicitate a arhitecturii a fost generată de ne utilizarea microcodului în rularea instrucţiunilor limbajului de asamblare.

Dintre versiunile cele mai de succes ale arhitecturii ARM putem aminti:

ARMv5TE ce stă la baza procesoarelor de tipul PXA27x, procesoare ce fac din gama cunoscute sub numele comercial Xscale. Această clasă de microprocesoare include o serie de familii distincte: IXP (dedicate lucrului în reţea), IXC (dedicate sistemelor de control aviatice), IOP (procesoare de tipul I/0), PXA (procesoare de aplicaţii generale) şi CE (Consumer Electronics – procesoare pentru bunurile de larg consum).

ARMv6 ce stă la baza CPU de tipul ARM1136J(F)-S ce este folosit drept

2 Cele din seriile: Atom Z5xx, Atom Z6xx și Atom N2xx. 3 Cele din seriile: Atom 2xx, 3xx, N4xx, D4xx și D5xx. 4 De exemplu, microprocesorul ARM6, bazat pe următoarea versiune a acetei arhitecturi (ARMv3), era

realizat cu ajutorul a doar 35.000 de tranzistoare.

Page 4: Curs Sist Embedded Inteligente - Hardware

4

nucleu pentru microprocesoarele: Qualcomm MSM7200A (folosit, de exemplu, în telefonul HTC

Touch Diamond2); Freescale MXC300-30 (Nokia E63, Nokia E71, Nokia 5800, Nokia

E51, Nokia E75, Nokia N97, Nokia N81); Qualcomm MSM7201A (HTC Dream, HTC Magic, Motorola Z6,

HTC Hero); OMAP24x (folosit în telefoanele Nokia E90, Nokia N93, Nokia

N95, Nokia N82); etc.

ARMv6KZ ce stă la baza procesorului ARM1176JZ(F)-S cu ajutorul căruia s-au construit dispozitive precum: Apple iPhone, Apple iPod touch, Motorola RIZR Z10, NVIDIA GoForce 6100 etc.

ARMv7-A ce stă la baza CPU de tipul Cortex-A8. Cu ajutorul acestui microprocesor au fost realizate o serie largă de dispozitive de succes precum: Apple iPod touch (dispozitivele aparţinând celei de a treia generaţie), Apple iPhone 3GS, Palm Pre, Samsung i8910, Sony Ericsson Satio, Nokia N900. Acest CPU este utilizat drept nucleu pentru procesoarele:

din seria OMAP3xxx produsă de compania Texas Instruments. De exemplu pe baza SoC-ului OMAP3430 construindu-se primul telefon scos pe piață, Motorola MILESTONE, ce a rulat sistemul de operare Android 2.0; tot acest procesor a fost utilizat și în telefoanele Motorola Droid și Palm Pre.

FreeScale i.MX51-SoC; Apple A4, acest procesor a fost utilizat pentru prima dată în tableta

iPad produsă de compania Apple. Ulterior a fost inclus în cea de a patra generație de iPhone și iPod Touch precum și în cea de a doua generație de Apple TV;

Chiar și Qualcomm Snapdragon are multe similarități cu procesoarele din familia Cortex-A8 (de exemplu acelașii set de instrucțini comun cu arhitectura ARMv7-A) dar a fost reproiectat aproape total de firma Qualcomm rezultând performanțe superioare în cadrul instrucțiunilor multimedia de tip SIMD.

De asemenea aceeași arhitectură ARMv7-A stă și la baza CPU de tipul Cortex-A9, procesor dezvoltat specific pentru a conlucra cu mai multe nuclee similare de același tip. O arhitectură care include până la 4 astfel de procesoare este denumită Cortex-A9 MPCore™. Aceste procesoare se găsesc în SoC precum:

OMAP44305/4440 produse de TI sau În procesoarele din clasa Orion care au și ele 2 nuclee Cortex-A9 la

1.0GHz.

5 Două nuclee de tipul Cortex-A9 la 1 GHz

Page 5: Curs Sist Embedded Inteligente - Hardware

5

3. MIPS (Microprocessor without Interlocked Pipeline Stages) este o arhitectură de tip RISC ce a stat la baza dezvoltării unei întregi familii de microprocesoare pe 32 sau pe 64 biţi. Această arhitectură a fost dezvoltată de compania Americană MIPS Technologies. La ora actuală există o serie largă de versiuni ale arhitecturii MIPS (MIPS I, MIPS II, MIPS III, MIPS IV, MIPS V, MIPS32, and MIPS64).

Iniţial microprocesoarele bazate pe arhitectura MIPS au fost destinate pieţii calculatoarelor personale intrând în directă competiţie cu arhitectura de tip IA-32, reuşind la un moment dat să o depăşească în performanţe. Dar lansarea de către Intel a unor noi versiuni de procesoare Pentium cu performanţe superioare şi pierderea suportului oferit de către compania Microsoft pentru procesoarele bazate pe această arhitectură (ultimul sistem de operare care a mai fost compatibil cu arhitectura MIPS a fost sistemul de operare Windows NT versiunea 4.0) a determinat retragerea companiei şi implicit a arhitecturii de pe piaţa calculatoarelor personale de uz general şi îndreptarea atenţie companiei producătoare către piaţa sistemelor şi a aplicaţiilor de tip embedded.

4. SH sau SuperH a fost la origine o arhitectură de tip RISC pe 32 de biţi dezvoltată de compania Hitachi care ulterior prin versiunea arhitecturală SH5 a migrat către 64 de biţi. In acest moment sunt produse o serie largă de microprocesoare pe baza arhitecturii SH de către compania japoneză Renesas Technology (companie deţinută de firmele Hitachi şi Mitsubishi). Versiunile SH2, SH2A, SH3, SH4 şi SH4A ale arhitecturii SuperH sunt în continuare active şi implementate în diferite tipuri de procesoare.

5. PowerPC (Power Performance Computing sau Performance Optimization With Enhanced RISC Performance Chip) a fost dezvoltată în anul 1991 de un consorţiu format din trei companii Apple, IBM şi Motorola. Această arhitectură a fost dezvoltată iniţial pentru piaţa calculatoarelor personale, iar ulterior s-a impus în pe segmentul de piaţă al sistemelor embedded şi a sistemelor de foarte înaltă performanţă6. De asemenea, aceste procesoare sunt utilizate la consolele de jocuri Nintendo GameCube şi Wii precum şi la Xbox 360 produsă de Microsoft.

PowerPC este o arhitectură de tip RISC pe 32 sau pe 64 de biți ce are la bază arhitectura Power dezvoltată de compania IBM. Aceste microprocesoare pot opera cu numere cu virgula mobilă în simplă sau dublă precizie.

Diferitele sisteme de operare sunt proiectate să lucreze cu diferite familii de microprocesoare caracterizate de diferite arhitecturi şi de diferite versiuni ale acestora. De exemplu, sistemul de operare Windows CE suportă următoarele arhitecturi x86, ARM (doar versiunea ARMv4I), SuperH (doar versiunea SH4 până la Windows CE 6.0 R2) şi MIPS (versiunile MIPSII şi MIPSIV) în timp ce ultimul sistem de operare de la Microsoft, Windows 7, suportă doar arhitecturile IA-32 şi IA-64.

Făcând o analiză comparată a produselor existente, se observă că la ora actuală arhitectura ARM domină piaţa telefoanelor mobile în timp ce compania Intel prin arhitecturile IA-32 şi IA-64 domină piaţa calculatoarelor personale (PC). Lupta între cele

6 Firma BAE SYSTEMS Platform Solutions a implementat pentru avionul de vânătoare F-35 Lightning II

(avion din generaţia a cincea multirol de tip stealth) produs de Lockheed Martin sistemul electronic de comandă şi control ce are drept nucleu un procesor dual core dezvoltat pe baza unei arhitecturi de tip PowerPC. Acest procesor a fost construit de firma Freescale.

Page 6: Curs Sist Embedded Inteligente - Hardware

6

două arhitecturi se duce acum pe segmentul de piaţă rămas între zona calculatoarelor personale şi cea a telefoanelor mobile, zonă ocupată de smartbook-uri (bazate în principal pe arhitecturi de tip ARM) şi netbook-uri (ce utilizează procesoarele produse de Intel).

Tabel 2. Comparaţie între cele două tipuri de sisteme susţinute de cele două arhitecturi dominante pe piaţa procesoarelor [Clarke, 2009]

Netbook – bazate pe procesoare ce utilizează o

arhitectură de tipul x86

Smartbook - bazate pe procesoare ce utilizează arhitecturi de tip ARM

Preţ Mai mult de 200 USD Mai puţin de 200 USD

Sisteme de operare Windows compatibile Linux sau Chrome

Autonomie acumulatori 3.5 ore Cel puţin 8 ore

Conform afirmaţiilor făcute de compania Intel în anul 2009 94% din piaţa sistemelor netbook/smartbook avea la bază procesoare bazate pe arhitectura x86. Dar conform unor analize realizate în anul 2009 evoluţia sistemelor ce utilizează procesoare cu arhitecturi ARM se va schimba, ajungându-se ca în anul 2012 procesoarele cu arhitectura de tip ARM să domine 55% din piaţa sistemelor netbook şi smartbook, vezi Tabelul 3.

Tabel 3. Analiză predicitivă a evoluţiei pieţii sistemelor netbook/smartbook [Clarke,

2009]

Netbook – bazate pe procesoare ce utilizează o arhitectură de tipul x86

Smartbook - bazate pe procesoare ce utilizează arhitecturi

de tip ARM

2009 22.1 milioane unităţi 1.4 milioane unităţi

2010 31.1 milioane unităţi 7.8 milioane unităţi

2012 43.2 milioane unităţi 52.9 milioane unităţi

Arhitectura unui procesor nu este un lucru fizic, ea este o descriere a conceptelor

fundamentale ce stau la baza funcţionării unui CPU. După cum am văzut anterior fiecare arhitectură are diferite versiuni, de exemplu arhitectura ARM are 7 versiuni (ARMv1, ARMv2, ..., ARMv6, ARMv7). Iar de cele mai multe ori este posibil ca o anumită versiune a unei arhitecturi să aibă alte subversiuni. Astfel, versiunea 7 a arhitecturii ARM are următoarele subversiuni:

1. A (cunoscută sub numele de ARMv7-A) a fost realizată pentru sisteme de operare sofisticate bazate pe utilizarea tehnicilor de tip memorie virtuală. Pe baza acestei versiuni (ARMv7-A) au fost realizate următoarele procesoare sau CPU (Central Processing Unit):

Page 7: Curs Sist Embedded Inteligente - Hardware

7

a. Cortex-A8 este un procesor pe 32 de biţi proiectat special pentru a obţine cele mai bune performanţe având consumul cel mai redus7.

b. ARM Cortex-A9 Single Core Processor c. ARM Cortex-A9 MPCore

2. R (ARMv7-R) a fost proiectată dedicat pentru procesoarele de tip embedded de timp real (real-time systems). Utilizându-se această versiune a arhitecturii ARM au fost construite următoarele procesoare:

a. Cortex-R4 şi b. Cortex-R4F.

Aceste procesoare sunt dedicate de asemenea aplicaţiilor de tip embedded comerciale ce vor fi produse în volume mari (hard disk-uri, imprimante, modemuri wireless etc.).

Figura 2.1. Schema bloc a microprocesorului OMAP3530 produs de Texas Instruments

3. M (ARMv7-M) - arhitectură optimizată pentru diferitele tipuri de

7 Consumul acestui procesor este mai mic de 300 mW lucrând la frecvenţe ce încep de la 600MHz

ajungând şi depăşind 1GHz.

Page 8: Curs Sist Embedded Inteligente - Hardware

8

microcontrolere. Această versiune este dedicată în special aplicaţiilor ce urmăresc minimizarea costurilor (low-cost applications). Această familie include următoarele procesoare:

a. Cortex-M0 – procesor de mici dimensiuni şi consum redus (este considerat procesorul cu consumul cel mai redus construit utilizându-se o arhitectură ARM);

b. Cortex-M1 este proiectat special spre a fi inclus în FPGA-uri; c. Cortex-M3 este proiectat special pentru a obţine maximum de

performanţă cu costuri minime.

În concluzie, implementarea unei anumite versiuni a unei anumite arhiteturi este chiar procesorul sau CPU. Din punct de vedere a proiectantului după alegerea arhitecturii alegerea CPU este cel de al doile pas. Funcţie de cerinţele impuse sistemului (de exemplu: consum, cost redus, necesitatea existenţei unui sistem de operare sau/şi rularea unor aplicaţii de tip real-time) se va alege procesorul sau CPU (de exemplu pentru arhitectura ARM putem alege Cortex-M0 sau Cortex-A8 sau Cortex-R4F).

Figura 2.2. Legăturile existente între arhitecturi, CPU, SoC şi plăcile electronice

Producătorii de circuite şi microprocesoare înglobează ulterior procesorul (CPU) într-

un SoC (System on a Chip). SoC8 înglobează pe lângă CPU și o serie de circuite logice 8 De multe ori termenul SoC este utilizat greșit în legătură cu dispozitivele embedded de tip

microcontroler, deoarece și acestea înglobează un CPU împreună cu un număr larg de periferice care asigură autonomia acestor dispozitive (numărul de componente externe suport este foarte mic). Microcontrolerele sunt, în mod firesc, asimilate în familia sistemelor de tip SCS (single chip systems) chiar dacă uneori această realitate nu este în totalitate valabilă.

Termenul SoC este folosit în directă legătură cu CPU puternice capabile să susţină sisteme pe operare ce necesită existența unei memorii externe foarte mare – memorii ce nu por fi înglobate într-un sistem de tip SoC în principal datorită: costurilor prohibitive şi a dificultăţilor tehnologice. Cu toate acestea, sistemele SoC necesită existența unui număr considerabil de dispozitive periferice externe, mult mai multe și mai complexe decât în cazul microcontrolerelor.

Teoretic vorbind utilizarea termenului SoC în legătură cu microcontrolerele nu este corectă dar este utilizată.

Placă electronică

OMAP35x Evaluation Module

BeagleBoard

CPU Arhitecturi

IA-32

MIPS

SH

ARM

PowerPC

Cortex A8

SoC

Qualcomm 7x00

Texas Instruments

OMAP2430 ARM1136J(F)-S

Freescale i.MX515

Texas Instruments OMAP3530

Samsung S5PC100

Page 9: Curs Sist Embedded Inteligente - Hardware

9

proiectate să susţină funcţionarea CPU împreună cu o serie de dispozitive periferice (porturi de comunicație paralele sau seriale, convertoare ADC sau DAC, circuite suport și drivere pentru elemente de afișare LCD etc.). Toate acestea sunt înglobate într-un SoC, deci într-un singur circuit electronic – toate acestea sunt realizate pentru reducerea costurilor dar şi pentru optimizarea la maximum a performanţelor sistemului global.

Figura 2.3. Schema bloc a microprocesorului i.MX515 produs de Freescale

De exemplu, CPU-ul Cortex-A8 este înglobat într-o serie largă de microprocesoare de tip SoC precum: OMAP3530 produs compania Texas Instruments, i.MX515 produs de compania Freescale, S5PC100 produs de compania Samsung etc. Pentru o analiză comparativă a acestor microprocesoare de tip SoC, a arhitecturii lor interne vezi Figura 2.1, Figura 2.3 şi Figura 2.4.

Ulterior aceste microprocesoare de tip SoC sunt înglobate pe diferite plăci electronice devenind astfel un sistem de sine stătător. Aceste plăci electronice (board) sunt cunoscute sub numele de plăci de dezvoltare sau, de exemplu, plăci de bază (mainboard) în „lumea” calculatoarelor personale.

2.2. Unitatea centrală de procesare

Unitatea centrală de procesare (CPU - Central Processing Unit) sau procesorul este acea parte a unui sistem de calcul responsabilă cu execuţia instrucţiunilor unui anumit program sau a mai multor programe ce accesează concurențial resursele CPU. După cum s-a prezentat anterior, CPU-ul este, de asemenea, implementarea unei versiuni specifice a unei anumite arhitecturi. Programele ce sunt rulate pe un CPU sunt scrise de un programator şi au un anumit scop bine definit. Unitatea centrală de procesare controlează

Page 10: Curs Sist Embedded Inteligente - Hardware

10

de asemenea toate acţiunile efectuate de celelalte componente ale calculatorului, controlând deci întregul sistem. Începând cu primul calculator de uz general ENIAC9 şi urmărind evoluţia calculatoarelor şi a tehnicii de calcul, unitatea centrală de procesare, CPU, a cunoscut şi suferit o serie largă de transformări şi modificări.

Figura 2.4. Schema bloc a microprocesorului S5PC100 produs de compania Samsung Anterior, CPU-urile erau realizate utilizându-se diferite circuite integrate şi

componente discrete fiind, uneori, o sumă de mai multe circuite imprimate realizate cu aceste componente. La ora actuală microprocesoarele, ce sunt unităţi centrale de procesare, înglobează într-un singur circuit toate aceste componente.

În acest moment, structura de bază a unităţilor centrale de procesare moderne, a microprocesoarelor, este formată din:

Unitatea de control – determină funcţia şi rolul fiecărei instrucţiuni, citind şi decodificând codul acestora coordonând funcţionarea CPU. Unitatea de control este la rândul ei formată din mai multe blocuri individuale. În continuare le prezentăm pe cele mai importante:

Unitatea de predicţie a salturilor (branch predictor) – încearcă să determine ce informaţie urmează a fi utilizată de unitatea/unităţile de execuţie în vederea aducerii acesteia în memoria internă a CPU anterior utilizării acesteia de către unitatea de execuţie. Este considerată de multe ori bloc distinct, vezi Figura 2.6, sau parte integrantă a unităţii de control - vezi Figura 2.5.

9 ENIAC (Electronic Numerical Integrator And Computer) - calculator ce conţinea 17.468 tuburi

electronice, 7.200 diode, 1.500 relee, 70.000 rezistoare, 10.000 condensatoare, având în jur de 5 milioane de lipituri realizate manual. ENIAC cântărea în jur de 27 de tone.

Page 11: Curs Sist Embedded Inteligente - Hardware

11

Microcodul este un program al CPU ce este rulat în momentul execuției fiecărei instrucțiuni mașină (o instrucțiune a codului scrisă în limbajul de asamblare). Pentru execuția acestui cod este necesară existența unei memorii ROM foarte rapide, vezi Figura 2.5 și Figura 2.6, și a unui bloc de translatare, traducere a instrucțiunilor mașină în secvențe operative de comenzi pe care circuitele hardware ale CPU să le înțeleagă și să le proceseze. Acest microcod este utilizat deasemenea în implementarea unor instrucțiuni complexe, compuse din mai mulți pași de execuție, fără însă a crește în mod inutil complexitatea hardware a CPU-ului.

Blocul de distribuţie (dispatcher) al datelor este utilizat în cazul CPU ce conțin mai multe unități de execuție. Are rolul de a distribui datele către unitățile de procesare corecte.

Unitatea de procesare – partea principală a CPU dedicată execuţiei instrucţiunilor efectuează toate operațiile şi calculele necesare. Ea este partea cea mai rapidă a CPU-ului. Această unitate poate fi formată din mai multe unităţi de execuţie individuale:

Figura 2.5. O schemă bloc simplificată a unei unităţi centrale de procesare

Unitatea de calcul în virgulă mobilă (FPU – Floating Point Unit) realizează toate operaţiile matematice în reprezentări reale, deci în virgulă mobilă (floating point).

Mem

orie

cac

he L

1 In

stru

cțiu

nuni

Mem

orie

cac

he L

1 da

te

Unitate de control

ALU

FPU

Regiştri

Memorie cache L2

Unitatea de intrare/ieșire

Page 12: Curs Sist Embedded Inteligente - Hardware

12

Unitatea logică și aritmetică (ALU - Arithmetic and Logic Unit) realizează toate calculele aritmetice (adunare, scădere, înmulțire și împărțire10), funcțiile logice (și, sau, sau exclusiv etc.) și operații de rotire a datelor. ALU operează doar în reprezentări ale tipurilor de date de tip întregi (integer).

Memoria cache primară – numită şi memoria L1 este situată cât mai aproape de unitatea de execuţie (fiind integrată în CPU). Această memorie este o memorie SRAM de viteză (cu timpi de acces11 foarte mici) mult mai rapidă decât memoria externă a calculatorului. Ea este împărțită în două regiuni diferite12 (vezi Figura 2.5): memoria de date și memoria de instrucțiuni. Necesitatea utilizării acestei memorii a fost generată în principal de viteza de lucru foarte mare a procesorului comparativ cu ratele mici și foarte mici de transfer a datelor cu mediile externe de stocare (memorie RAM sau hard disk).

Conceptul fundamental care stă la baza memoriei de tip cache este de a determina CPU-ul să preia și să prelucreze date doar din memoriile cache interne (memorii rapide) și nu din memoria RAM externă (mult mai lentă). Circuitele suport ale memoriilor cache copie din memoria RAM externă datele și programul necesar și caută să „ghicească” ce va fi necesar în viitorul imediat, aducând aceste informații în memoriile corespondente (L1D sau L1P).

Memoria cache secundară sau de nivel 2 (denumită L2 Cache sau Level 2 Cache) este de asemenea o memorie SRAM, localizată pe acelaşi cip cu CPU. L2 este o memorie tampon între procesor şi memoria externă RAM. Ea este o memorie mai rapidă decât memoria RAM externă dar este mai lentă decât memoria cache L1 – comparativ cu aceasta timpii de latență nu mai sunt foarte apropiați de zero.

Bus-ul de date conectează întregul sistem la memoria externă şi la toate celelalte componente ale calculatorului.

Am precizat anterior că necesitatea introducerii memoriilor cache interne a fost generată de discrepanța existentă între vitezele de prelucrare/preluare a CPU față de ratele de transfer a mediilor de stocare externe. Pentru a face doar o simplă comparație să analizăm următoarele date:

Dacă luăm în calcul un HDD foarte rapid, de exemplu SATA-300 vom obține o viteză maximă de transfer de 300 Mocteți/s;

Pentru o memorie DDR2-800, care este accesată pe 64 biți (vezi Figura 2.6) vom obține o viteză de transfer de 6400 Mocteți/s. În schimb dacă se utilizează o tehnică de tip dual canal (dual channel mode) de accesare a memoriei vom obține o viteză de 12800 Mocteți/s. În schimb, problema fundamentală a memoriilor nu este rata de transfer ci timpul de latență (cu cât o memorie întârzie prezentarea

10 Nu toate procesoarele au unități ALU ce suportă operațiile matematice de tip înmulțire sau împărțire -

în principal datorită complexității ridicate a blocurilor ce susțin aceste funcții. 11 Sinonim cu latență. 12 Această divizare a memoriei cache L1 este una din cele mai importante îmbunătăţiri a procesoarelor din

familia Pentium faţă de familia anterioară 486.

Page 13: Curs Sist Embedded Inteligente - Hardware

13

datelor atunci când acestea sunt cerute). De exemplu, dacă o memorie are CL (CAS Latency) de 3, acest fapt semnifică că memoria va întoarce data cerută după 3 cicli (impulsuri de tact) față de momentul cererii. În tot acest interval de timp CPU va trebui să aștepte. Deci teoretic ar trebui să împărțim viteza de transfer la 3. Cu toate acestea performanțele nu scad atât de dramatic deoarece memoriile lucrează în mod normal într-un mod de lucru de tip „burst mode” (după prima accesare care este întârziată cu CL datele vor fi preluate la fiecare puls de tact, dacă se accesează locații consecutive din aceeași pagină);

Un CPU ce rulează intern la 2 GHz și care are bus-urile interne pe 64 de biți va avea o viteză de transfer a datelor de 16 Gocteți/s. Dar, dacă luăm în calcul că bus-urile de date între memoria L2 și memoria L1 pot fi de 128 (ca la un AMD standard) sau de 256 (ca la un Intel) biți atunci vom obține viteze mult mai mari: 32 Gocteți/s sau 64 Gocteți/s.

Figura 2.6. Schema bloc a unui procesor Pentium [Pentium, 2011] În cadrul unităţilor de procesare moderne sunt înglobate mai multe unităţi de

execuţie. Aceste unităţi de execuţie sunt proiectate pentru a rula în paralel, iar o astfel de

Page 14: Curs Sist Embedded Inteligente - Hardware

14

arhitectură poartă numele de arhitectură suprascalară13. De exemplu, în cazul utilizării a patru unităţi de execuţie, teoretic, se pot executa până la patru instrucţiuni în paralel obţinându-se astfel o creştere cu 4 a vitezei de lucru. În mod ideal, un CPU cu n unităţi de execuție ar trebui sa ofere o viteza de prelucrare de n ori mai mare decât un sistem cu o singură unitate de execuție. Dar, în realitate, consumul suplimentar de resurse necesar pentru coordonarea activității unităților de execuție și soluționarea competiției pentru resurse comune (date, magistrale de informații, rezolvată oarecum parțial prin utilizarea pipeline-urilor) nu permite atingerea acestui deziderat. În plus și programul rulat trebuie dezvoltat de o așa natură astfel încât să permită o rulare în paralel a mai multor instrucțiuni.

Figura 2.7. Schema bloc simplificată a unui procesor Pentium O altă caracteristică a acestor unități de execuție este dată de faptul că acestea nu sunt

identice, ele sunt specializate pe un anumit gen de operații (de exemplu, numere întregi – unitatea de execuţie ALU –, sau numere în virgulă mobilă – unitatea de execuţie FPU).

13 De exemplu, procesoarele de tip Pentium 4 au cinci unităţi de execuţie care lucrează în paralel

Page 15: Curs Sist Embedded Inteligente - Hardware

15

În final, putem concluziona că prin intermediul unei astfel de abordări, similară cu cea anterioară, se obține o creștere substanțială a performanțelor global ale microprocesorului. De exemplu, în Figura 2.6 se observă că procesoarele Pentium au două unităţi ALU şi o singură unitate FPU.

Aceeași schema bloc a unui procesor Pentium prezentată în Figura 2.6 este reprezentată puţin mai schematizat în Figura 2.7.

Din punct de vedere a funcționării, în momentul în care CPU va dori să preia o nouă instrucţiune acesta o va căuta pentru prima dată în memoria cache de instrucţiuni L1, dacă o găsește („memory hit”) o va prelua și va lucra cu ea. În schimb, dacă nu o găseşte („memory miss”), va continua căutarea instrucţiunii respective în memoria L2, dacă nici aici nu există în final o va prelua direct din memoria RAM a sistemului. Având instrucţiunea căutată, blocul decodor de instrucţiuni va determina imediat paşii necesari executării instrucţiunii respective. Utilizând microcodul asociat fiecărei instrucţiuni unitatea de control va determina toţi paşii intermediari necesari executării instrucţiunii şi va lansa secvenţele de comenzi individuale necesare finalizării acestor instrucţiuni către unităţile de execuţie.

În memoria cache L1D se stochează datele ce sunt procesate. Dacă citirea datelor, incluzând toate mecanismele implicate, nu ridică nici o problemă conceptuală, în schimb scrierea acestora în memoria cache și sincronizarea memoriei L1D cu memoria RAM a sistemului se poate realiza prin două mecanisme diferite: write-back și write-through. Prin intermediul metodei write-back14 modificările făcute în memoria cache nu sunt copiate imediat în memoria RAM externă. Scrierea datelor este realizată în memoria RAM doar atunci când este absolută nevoie, de exemplu când zona ocupată și procesată anterior este necesară pentru stocarea unor noi date. În contrast în cadrul metodei write-through o dată cu scrierea datelor în memoria cache sunt scrise simultan și în memoria RAM. Datorită mecanismelor ce guvernează aceste metode, de cele mai multe ori metoda write-back determină obținerea unor performanțe mai bune (a unei viteze mai mari) decât atunci când se utilizează metoda write-through. Aceste performanțe sunt superioare datorită minimizării numărului de scrieri în memoria RAM exterioară a sistemului.

2.3. Utilizarea tehnicilor de tip pipeline în procesoare

Introducere Tehnicile de pipelining sunt metode de creștere a performantei globale a unui

procesor prin utilizarea paralelismului existent la nivelul fiecărei instrucțiuni prin suprapunerea proceselor de execuție a instrucțiunilor. În acest mod se obține o creștere a vitezei de execuție a instrucțiunilor fără a crește viteza de lucru a procesorului. Tehnica de tip pipelining, de altfel la fel ca și utilizarea arhitecturilor scalare, este o tehnică transparentă programatorului, acesta ne fiind obligat să țină cont de acestea în scrierea programelor. Cu toate acestea, o scriere a programelor, ce are în vedere existența acestor tehnologii înglobate în procesor, poate determina o maximizare a performanțelor ce se obțin cu aceste CPU-uri.

14 Această metodă a fost folosită în clasa procesoarelor Intel începând cu procesorul 80486.

Page 16: Curs Sist Embedded Inteligente - Hardware

16

Etapele execuţiei unei instrucţiuni O instrucţiune, în limbaj de asamblare, constă dintr-o secvenţă de octeţi (1-4 octeţi).

Dintre octeţii unei instrucţiuni cel puţin unul reprezintă codul de instrucţiune (care spune ce operații realizează respectiva instrucțiune) iar restul sunt utilizaţi pentru a coda regiştrii ce stochează date, datele sau adresele datelor ce vor fi prelucrate şi/sau locul unde vor fi stocate. O instrucţiune are o durată de execuție cunoscută sub numele de ciclu instrucțiune. Funcţie de tipul procesorului, de complexitatea instrucțiunii durata unui ciclu de instrucţiune poate varia sau o instrucțiune poate fi compusă din mai multe cicluri mașină.

Pentru utilizarea tehnologiei de tip pipeline un ciclu instrucţiune este descompus într-un număr fix de segmente (stage). Fiecare segment reprezentând un subproces elementar în care se descompune procesul de execuţie a unei instrucţiuni.

În general, execuţia oricărei instrucţiunii se poate descompune în următoarele subprocese sau segmente mai simple:

1. IF - instruction fetch (citirea codului fiecărei instrucţiuni, extragerea instrucţiunii din memoria L1P, L2 sau RAM),

2. ID - instruction decoding (înţelegerea, decodificarea codului instrucţiunii – în urma acestui proces CPU va şti exact ce are de făcut),

3. OF - operand fetch (extragerea operandului, preluarea acestuia şi stocare în unul din regiştri interni ai CPU),

4. EX - execution (executia operației prin folosirea unuia din unitățile de execuţie de care CPU dispune),

5. WB - write-back (rezultatul obținut în urma procesării de către una din unităţile de execuţie este salvat în memorie).

Instr1 IF ID OF EX WB Instr2 IF ID OF EX WB Instr3 IF ID OF EX WB Tact 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Figura 2.8. Modalitatea de execuţie a trei instrucţiuni pe un CPU ce nu utilizează tehnica de tip pipelining

Tehnica utilizării pipline-urilor

În continuare vom presupune că durata unui segment este egală cu perioada ceasului

CPU – presupunere adevărată în cea mai mare parte a situațiilor. Din Figura 2.8 se observă că în cazul unui CPU ce nu utilizează tehnica de tip pipeline pentru execuția unei secvențe de 3 instrucţiuni sunt necesare 15 tacturi. În general acest mod de lucru este specific microcontrolerelor de generaţii mai vechi care datorită simplității constructive (generatoare de costuri reduse) nu au înglobate în CPU tehnici de tip pipelining. Cu toate

Page 17: Curs Sist Embedded Inteligente - Hardware

17

acestea microcontrolerele ce fac parte din generaţii recente înglobează intern tehnica de tip pipeline15.

Figura 2.9. Structura unui pipeline ce corespunde etapelor de descompunere a unei instrucţiuni anterior prezentate

Una dintre metodele cele mai directe de a evita execuţia secvenţială prezentată în

Figura 2.8 este aceea de a începe unele din subprocesele necesare execuţiei unei instrucţiuni (de exemplu IF şi ID) înainte ca instrucţiunea anterioară (care se află, de exemplu, în etapa OF) să-şi fi terminat execuţia. O astfel de acţiune se poate realiza în principal deoarece circuitele de procesare interne CPU ce se ocupă diferitele segmente ale unei instrucţiuni sunt independente, unele de altele, şi nu necesită accesul la aceleaşi resurse (de cele mai multe ori).

În Figura 2.9 se prezintă structura unui pipeline static care corespunde descompunerii anterioare a unei instrucţiuni în cele 5 subprocese.

Instr1 IF ID OF EX WB Instr2 IF ID OF EX WB Instr3 IF ID OF EX WB Instr4 IF ID OF EX WB Instr5 IF ID OF EX WB

Tact 1 2 3 4 5 6 7 8 9

Figura 2.10. Modalitatea de execuţie simultană a unui număr de instrucţiuni pe un CPU ce utilizează un pipeline cu o „adâncime” de 5

În Figura 2.10 se prezintă funcţionarea schematică a unui pipeline ce are o adâncime

de 5 subprocese şi o singură unitate de execuţie. Din această figură se observă că cel puţin teoretic un astfel de pipeline poate susţine execuţia unui instrucţiuni în fiecare ciclu sau perioadă procesor.

15 De exemplu, microcontrolerele produse de Atmel şi Microchip, AVR respectiv PIC înglobează un

pipeline de două segmente (stages).

Iesire

Circ

uit

Pro

cesa

re IF

Latc

hIntrare

Circ

uit

Pro

cesa

re ID

Latc

h

Circ

uit

Pro

cesa

re W

B

Latc

h

...

Semnal clock

Starea pipeline-ului la al 5-lea tact

Page 18: Curs Sist Embedded Inteligente - Hardware

18

Pentru îmbunătăţirea în continuare a performanţelor, a vitezei de execuție, se utilizează arhitecturi suprascalare, arhitecturi ce au mai multe unităţi de execuţie. Pentru arhitecturile suprascalare pipeline-ul trebuie să fie de o dimensiune mult mai mare16 comparativ cu arhitecturile subscalare. Unul din blocurile fundamentale ale unei structuri suprascalare este blocul de distribuţie (dispatcher), înglobat în unitatea de control, ce are rolul de a determina ce instrucţiuni pot fi executate în paralel, pe ce unități de execuție şi care instrucțiuni nu pot fi executate în paralel.

Instr1 IF ID OF EX WB Instr2 IF ID OF EX WB Insr3 IF ID OF EX WB Instr4 IF ID OF EX WB Instr5 IF ID OF EX WB Instr6 IF ID OF EX WB Instr7 IF ID OF EX WB Instr8 IF ID OF EX WB Instr9 IF ID OF EX WB Instr10 IF ID OF EX WB

Tact 1 2 3 4 5 6 7 8 9

Figura 2.11. Modalitatea de execuţie simultană a unui număr de instrucţiuni pe un CPU suprascalar ce utilizează un pipeline cu o „adâncime” de 10

Dacă două instrucţiuni pot fi executate în paralel şi sunt disponibile unităţi de

execuţie atunci acestea sunt procesate în paralel. În acest mod, teoretic, numărul de instrucţiuni ce pot fi executate în paralel este egal nu numărul unităţilor de execuţie disponibile.

Funcţie de eficienţa blocului de distribuţie (dispatcher) a instrucţiunilor, a capacităţii acestuia de a „umple” într-un mod eficient, corect şi la timp pipeline-ul, astfel încât cât mai multe din unităţile de execuţie să fie utilizate, va rezulta un număr mai mic sau mai mare de instrucţiuni ce pot fi executate în paralel. Pentru pipeline-ul prezentat în Figura 2.11 un maximum de două instrucţiuni pe ciclu pot fi executate, avînd la dispoziţie două unităţi de execuţie.

Pipeline-uri dinamice

16 În cadrul procesoarelor produse de compania Intel, familia de procesoare Pentium 4 are implementată în

CPU o structură de tip pipeline cu 20 segmente. Noile ediții revizuite ale procesoarelor Intel cu nume de cod Prescott (scos pe piață pe data de 1 februarie 2004), Prescott 2M (în prima parte a anului 2005, arhitectură IA-64) și Cedar Mill (5 ianuarie 2006, cu o arhitectură IA-64) înglobează pipeline-uri cu 31 de segmente. Comparativ DSP-urile produse de compania Texas Instruments acceptă între 7 și 11 subprocese simultan în cadrul familiei TMS320C6200 și între 7-16 subprocese în cadrul familiei de DSP-uri TMS320C6700.

Starea pipeline-ului la al 5-lea tact

Page 19: Curs Sist Embedded Inteligente - Hardware

19

Structura unui pipeline dinamic este prezentată în Figura 2.12. Într-un astfel de pipeline structura lui se poate schimba/modifica în timp ce datele îl parcurg. De exemplu, o anumită instrucţiune are nevoie doar de subprocesele 1, 2 şi 3 în timp ce o alta are nevoie de doar subprocesele 1 şi 3. Prin această schimbare a arhitecturii pipeline-ului se obţine caracterul dinamic al acestuia. Dezavantajul major al acestor pipeline-uri dinamice este dat de complexitatea circuitelor de control a structurii pipeline-ului.

Figura 2.12. O posibilă structură unui pipeline dinamic Probleme ce apar în cazul CPU ce utilizează pipeline-uri Există mai multe probleme ce pot apare în cazul utilizării tehnicilor de tip pipelining.

Aceste dificultăți în utilizarea pipeline-urilor sunt generate în principal de: 1. necesitatea furnizării rapide şi corecte de instrucțiuni la intrarea pipeline-ului

(problemă costisitoare din punctul de vedere al ariei chipului necesară îndeplinirii corecte a acestui deziderat),

2. “strangularea” (bottleneck) a unui subproces datorită volumului de lucru afectat unui segment al instrucţiunii,

3. probleme denumite generic a emiterii instrucţiunii (issuing) – deci, a existenţei unei instrucţiunii disponibile, dar care nu poate fi executata datorită unui anumit tip de hazard: structural, al datelor sau al controlului programului.

Problemele de tip hazard structural sunt generate de imposibilitatea utilizării unor

anumite resurse ale CPU care sunt blocate de alte activități în derulare. De cele mai multe ori aceste probleme sunt rezolvate prin implementarea hardware a unui număr mai mare de unități de execuție și/sau registre.

Instr1 IF ID OF EX WB Instr2 IF ID OF EX WB Tact 1 2 3 4 5 6

Figura 2.13. Repartizarea în pipeline a instrucțiunilor Hazard creat de date este generat de dependența unei instrucțiuni de o instrucțiune

anterioara, de rezultatul obținute de la această instrucțiune anterioară. De exemplu, dacă dorim să executăm următoarea structură de cod:

Latc

h

Latc

h

Latc

h

Page 20: Curs Sist Embedded Inteligente - Hardware

20

Instr1: ADD R2, R3, R1 R1 = R2 + R3 Instr2: ADD R1, R4, R5 R5 = R1 + R4

pe un procesor ce are un pipeline, vom obține o repartizare a subproceselor necesare executării acestor două instrucțiuni conformă cu Figura 2.13. Din Figura 2.13 se observă că în momentul în care cea de a doua instrucțiune execută procesul operand fetch (OF), în ciclul 4, și dorește să preia datele din registrele R1 și R4 prima instrucțiune nu a finalizat operația de adunare, prin stocarea rezultatului, operație care se va realiza abia în ciclul 5 imediat următor.

Pentru rezolvarea acestei probleme se introduc în mod forțat un anumit număr de întârzieri ce au drept scop blocarea (stalled) execuției celei de a doua instrucțiuni. Există două soluții posibile ce sunt prezentate în Figura 2.14 și Figura 2.15.

Instr1 IF ID OF EX WB Instr2 IF ID - - OF EX WB Tact 1 2 3 4 5 6 7 8

Figura 2.14. Prima modalitate de rezolvare a problemei

Introducerea întârzierilor se realizează cu ajutorul unui bloc denumit „pipeline interlocks”. Acest bloc hardware analizează în mod continuu fluxul de date și detectează independența unei instrucțiuni de precedenta și, ulterior, întârzie instrucțiunile interdependente până la soluționarea conflictului existent.

Instr1 IF ID OF EX WB Instr2 - - IF ID OF EX WB Tact 1 2 3 4 5 6 7 8

Figura 2.15. Cea de a doua modalitate de rezolvare a problemei O altă modalitate de rezolvare a unei astfel de probleme este de rearanja codul astfel

încât aceste interdependențe să nu mai aibă loc. Aranjarea codului poate fi făcută de către compilator sau de către procesor. Astfel următoarea structură de comenzi:

Instr1: ADD R2, R3, R1 R1 = R2 + R3 Instr2: ADD R1, R4, R5 R5 = R1 + R4 Instr3: INC R8 R8 = R8 + 1 Instr4: ADD R6, R6, R7 R7 = R6 + R6

poate fi aranjată sub forma:

Instr1: ADD R2, R3, R1 R1 = R2 + R3 Instr3: INC R8 R8 = R8 + 1 Instr4: ADD R6, R6, R7 R7 = R6 + R6 Instr2: ADD R1, R4, R5 R5 = R1 + R4

Page 21: Curs Sist Embedded Inteligente - Hardware

21

În cadrul pipeline-ului noua structură de comenzi se prezintă ca în Figura 2.16. În cazul în care, de exemplu, compilatorul nu găsește o situație optimă de rearanjare a codului astfel încât problema interdependenței între instrucțiuni să dispară, la executarea subproceselor în pipeline, va introduce o serie de instrucțiuni de tip nop (no operation) pentru rezolvarea problemei.

Instr1 IF ID OF EX WB Instr3 IF ID OF EX WB Instr4 IF ID OF EX WB Instr2 IF ID OF EX WB Tact 1 2 3 4 5 6 7 8

Figura 2.16. Structura pipeline-ului după rearanjarea codului În cadrul procesoarelor moderne codul (format din instrucțiunile) nu este executat

secvențial în ordinea în care a fost scris de programator ci intr-o altă ordine pentru a scoate maximul de performanta din procesor. Procedeul se cheamă Out of Order Execution (OOE). Acest procedeu implica rearanjarea codului compilat (daca este posibil), executarea lui si apoi scrierea rezultatelor în memorie în ordinea codului original pentru a nu denatura scopul original al programului. Pentru orice programator și pentru orice utilizator, procedeul este unul transparent. Numai CPU știe ordinea exacta in care s-au executat instrucțiunile.

În afară de problemele de hazard ce țin de datele ce intră într-un pipeline, de interdependența instrucțiunilor, există și alte probleme ce apar datorită modalităților de scriere/citire a datelor. Aceste probleme se împart în trei mari clase: RAW (read after write), WAR ( write after read) și WAW (write after write).

Hazardul WAR a fost prezentat anterior în Figura 2.13. Din punct de vedere teoretic prima instrucțiune trebuie să scrie date într-un anumit registru, iar cea de a doua, ulterior, trebuie să citească acest registru, dar datorită pipeline-ului sau a reordonării instrucțiunilor scrierea se produce ulterior citirii.

În situația problemelor de tip WAW prima instrucțiune trebuie să scrie date într-un registru, iar ulterior o a doua instrucțiune trebuie să scrie date în același registru. În realitate cea de a doua instrucțiune este cea care scrie prima.

Hazardul de tip RAW (read after write) apare atunci când două instrucțiuni consecutive trebuie să acceseze o resursă comună, de exemplu un registru, astfel încât prima instrucțiune să citească datele iar ulterior cea de a doua să scrie noi date în resursa comună. Cu toate acestea scrierea are loc înaintea citirii determinând o afectare a ordinii normale și firești a programului ce generează rezultate imprevizibile.

Ultima clasă de probleme, pe care o studiem în acest subcapitol, este dată de hazardul rezultat în urma evoluției programului. O instrucțiune care modifică liniaritatea programului (secvențierea acestuia) poate genera o modificare a fluxului instrucțiunilor, a inexistenței datelor corecte în memoriile cache ale CPU (L1 sau L2) și de aici o imposibilitate de umplere la capacitatea maximă a pipeline-ului. Acest fapt poate genera în cea mai nefavorabilă situație o execuție a programului similară cu cea din Figura 2.8.

Page 22: Curs Sist Embedded Inteligente - Hardware

22

De aici reiese importanța unității de predicţie a salturilor (branch predictor) care are rolul de a identifica aceste “discontinuități” existente în codul programului și de a încărca în mod corect instrucțiunile necesare astfel încât pipeline-urile să fie „încărcate” la maxim pentru atingerea performanțelor maxime ale CPU.

Funcție de abordarea pe care compania producătoare o preferă toate aceste hazarde pot fi gestionate în două moduri distincte. În prima abordare procesoarele pot gestiona toate aceste hazarde (ca în cazul companiei Intel). Această metodă implică existența unui hardware suplimentar necesar în analiza fluxurilor de date și în aplicarea tehnicilor de corecție. În cea de a doua metodă compilatorul și asamblorul generează codul de o așa natură astfel încât aceste probleme să nu apară. În această situație CPU îndeplinește mai puține sarcini și este mai simplu arhitectural. Această simplitate arhitecturală determină de asemenea și un consum mult mai redus.

2.4. Arhitecturi de tip Very long instruction word (VLIW)

Comparativ cu arhitecturile suprascalare în care fiecare instrucțiune execută o singură operație, în CPU-urile de tipul VLIW o singură instrucțiune include mai multe operații, numărul acestor operații este egal cu numărul unităților de execuție pe care CPU le deține. Din acest motiv numărul biților ce codează o instrucțiune este foarte mare (de cele mai multe ori este mai mare de 64 de biți).

În cazul DSP-urilor din familia TMS320C6000 o instrucțiune are 256 de biți. Aceste procesoare, din această familie, au 8 unități de execuție (fiecare unitate putând procesa date reprezentate pe 32 de biți). O instrucțiune conține 8 operații distincte și se executa într-un singur ciclu mașină.

Tratarea interdependențelor între instrucțiuni, a hazardelor de orice natură, a salturilor condiționate sau nu, nu sunt realizate în unitățile de procesare, ce unt caracterizate de arhitecturi de tipul VLIW. Toate aceste probleme sunt tratate de către compilatoare și nu de componente hardware a CPU.

Deci, în cazul arhitecturilor VLIW compilatorul este cel care reorganizează programul original “împachetând” într-o singură instrucţiune mai multe instrucţiuni independente. Aceste instrucțiuni sunt alocate unităţilor de execuţie în conformitate strictă cu poziţia lor în instrucţiunea multiplă.

Dezavantajul fundamental în utilizarea acestor procesoare este dat de paralelismul limitat al aplicaţiilor. Acest paralelism determină ca unităţile de execuţie să nu fie ocupate permanent – problemă care apare frecvent şi la modelul superscalar de CPU. Din acest motiv utilitatea practică a acestor procesoare se remarcă mai ales în cazul aplicaţiilor ce prelucrează digital diferite semnale (aplicații multimedia, imagistică medicală etc.). Un alt dezavantaj este dat de faptul că procesorul VLIW și compilatorul asociat trebuie să fie într-o simbioză perfectă, nemaiputând exista compatibilitatea în jos existentă în familia Intel (cod dezvoltat pentru un procesor sau o clasă de procesoare mai „bătrân(e)” să ruleze pe versiunile mai noi ale arhitecturii).

În implementări comerciale procesoarele VLIW sunt mai rare decât cele superscalare. De exemplu, compania Analog Devices produce familia SHARC17 de DSP-uri bazate pe această arhitectură, în timp ce compania Texas Instruments produce familia C6000 de 17 Super Harvard Architecture Single-Chip Computer

Page 23: Curs Sist Embedded Inteligente - Hardware

23

DSP-uri ce utilizează de asemenea arhitectura VLIW. Modelele de arhitecturi superscalar şi VLIW nu sunt exclusive (numai superscalar sau

numai VLIW), în implementările reale se întâlnesc adesea procesoare hibride, ce urmăresc să optimizeze raportul performanţă preţ. Un astfel de exemplu este arhitectura procesoarelor IA-6418 (existentă în procesoarele de tip Itanium) de tip EPIC19, arhitectură ce a evoluat și are ca bază arhitectura VLIW și a înglobat multe din conceptele arhitecturii de tip superscalar.

2.5. Arhitecturi CISC şi RISC

Alte abordări arhitecturale, în afara celei de tip VLIW prezentată anterior, ce au influențat profund lumea sistemelor de calcul sunt cele cunoscute sub numele de CISC (complex instruction set computers) și RISC (reduced instruction set computers).

În anii `70 o dată cu scăderea continuă a prețului părții hardware a sistemelor de calul și cu creșterea prețurilor produselor software s-a lansat ideea mutării complexității de la nivelul aplicațiilor software către nivelul hardware a sistemului – ideea fundamentală ce stă în spatele arhitecturii de tip CISC. În acest mod un programator nu mai era obligat să scrie o anumită structură repetitivă de comenzi de fiecare dată când era necesar, deoarece această structură era implementată la nivelul hardware a CPU printr-o singură instrucțiune mașină complexă ce executa toți acești pași. Prin această abordare setul de instrucțiuni al CPU-ului era foarte puternic și se apropia de cel al limbajelor de nivel înalt. Pentru ca aceste instrucțiuni să fie executate era necesară existența unui microcod (stocat în interiorul CPU-ului într-o memorie de tip ROM, vezi Figura 2.6 și Figura 2.7), a unor subrutine ce erau executate și asociate cu fiecare instrucțiune a CPU-ului. Aceste instrucțiuni complexe erau anterior decodate (activitate care consuma un anumit număr de tacte, număr direct proporțional cu complexitate instrucțiunii) și ulterior microcodul asociat fiecărei instrucțiuni complexe era executat.

Imediat s-a căutat creșterea vitezei de execuție a CPU-ului. Pentru atingerea acestui obiectiv s-a urmărit identificarea acelui set de instrucțiuni cel mai utilizat și ulterior optimizarea acestuia, în vederea obținerii vitezei maxime de execuție, chiar dacă restul de instrucțiuni se executau puțin mai greu. În final s-a observat că în medie într-un CPU 20% din instrucțiuni execută 80% din întregul program și în plus utilizându-se doar o colecție de instrucțiuni simple același program se poate executa mai repede decât utilizând un set complex de instrucțiuni. Aceste două observații au determinat proiectarea și implementarea unor arhitecturi de tip RISC (reduced instruction set computers) caracterizate de un set mic de instrucțiuni simple. În final s-a ajuns la consensul ca cea mai mare parte a instrucțiunilor de tip RISC să se execute într-un singur ciclu mașină. Astfel, multe din instrucțiunile mașină a unui CPU de tip RISC (deci vorbim despre instrucțiunile limbajului de asamblare al CPU-ului) sunt chiar microinstrucțiunile unui procesor de tip CISC.

Dezvoltarea primului CPU cu arhitectură RISC a fost realizat la Berkeley în anul 1980 de o echipă condusă de profesorul David Patterson. Primul procesor de tip RISC, cunoscut sub numele de arhitectură RISC-I, a fost finalizat în anul 1982 având un set de doar 32 de instrucțiuni. Procesorul bazat pe arhitectura RISC-II a fost finalizat în 1983

18 Arhitectura IA-64 a fost dezvoltată de firmele Hewlett-Packard și Intel 19 Explicitly Parallel Instruction Computing

Page 24: Curs Sist Embedded Inteligente - Hardware

24

având 39 de instrucțiuni și fiind de 3 ori mai rapid decât predecesorul sau. La ora actuală toate CPU-urile de tip RISC au la bază conceptele dezvoltate și implementate în procesorul RISC-II.

Actualmente marea majoritate a CPU-urilor sunt de tip RISC. Astfel, arhitecturi precum Alpha, ARC, ARM, AVR, MIPS, PA-RISC, PowerPC, SuperH și SPARC sunt de tip RISC.

Arhitectura x86 produsă de compania Intel este una de tip CISC, în principal deoarece setul de instrucțiuni este unul de tip complex. Cu toate acestea, intern aceste procesoare sunt de tip RISC ce emulează arhitectura de tip CISC pentru a asigura compatibilitatea cu primele modele de procesoare care erau în totalitate de tip CISC. Alte instrucțiuni precum cele de tipul MMX20 nu au în spate nici un cod de execuție de tip microcod, aceste instrucțiuni fiind implementate direct hardware.

De asemenea, se observă actualmente că setul de instrucțiuni RISC devine din ce în ce mai mare, tinzând din ce în ce mai mult să fie similar cu cel de tip CISC.

Utilizarea arhitecturii de tip RISC, în unele cazuri, determină îmbunătăţiri ale performanţelor procesoarelor de până la 10 ori. Aşa, de exemplu, este cazul μC ATtiny13A21 produs de compania Atmel™. Acesta este un microcontroler AVR pe 8 biţi ce are la bază o arhitectură RISC îmbunătăţită.

2.6. Arhitecturi Von Neumann şi Harvard

Funcția principală a unui CPU este de a citi codul unei instrucțiuni, de a o decodifica, și de a executa instrucțiunea. Pentru citirea instrucțiunilor, citirea datelor și scrierea datelor (văzute aici ca subprocese necesare executării unei instrucțiuni) sunt necesare anumite medii de stocare de tip RAM (random-access memory), flash sau ROM (read-only memory).

Arhitectura von Neumann presupune proiectarea sistemului de calcul de o așa natură astfel încât să fie compus, la un nivel grosier de descriere, dintr-o unitate de procesare și o memorie, vezi Figura 2.17Figura 2.17(a). Memoria stochează atât programul ce trebuie rulat cât și datele necesare sau generate de acest program. Această arhitectură a fost denumită după numele matematicianului John von Neumann ce a propus-o. Actualmente, această arhitectură s-a impus ca standard. Datorită vitezei de transfer limitată a datelor între CPU (capabil să atingă viteze foarte mari de procesare) și memoria exterioară (memorie lentă) a fost necesară găsirea altor soluții practice. În plus, în ultimii ani viteza de lucru a procesoarelor a crescut mult mai repede decât viteza de acces a memoriilor externe. Aceste cauze au dus la găsirea unor tehnici software (de minimizare a numărului de accesări a memoriei externe) sau hardware (de îmbunătățire a ratelor de transfer) de creștere a vitezei de transfer a datelor.

20 Acest acronim are mai multe semnificaii (semnificații diferite funcție de sursa citată): MultiMedia

eXtension, Multiple Math eXtension, or Matrix Math eXtension. Inițial acest set de instrucțiuni a fost folosit pentru îmbunătățirea capabilităților de prelucrare a graficii 2D și 3D de către procesor. Actualmente, o dată cu dezvoltarea explosivă a plăcilor grafice, acest set de instrucțiuni este oarecum redundant și mai puțin folosit.

21 “The resulting architecture is more code efficient while achieving throughputs up to ten times faster than conventional CISC microcontrollers” [ATtiny13A, 2011]

Page 25: Curs Sist Embedded Inteligente - Hardware

25

Arhitectura Harvard a fost dezvoltată, ulterior arhitecturii von Neumann, în ideea îmbunătățirii performanțelor, a vitezei de acces către informațiile stocate în memoria externă. Conceptul fundamental al acestei arhitecturi este acela de a separa memoria program și memoria de date. Numele acestei arhitecturi a fost dat de calculatorul Harvard Mark I22, produs de firma IBM pentru universitatea Harvard, calculator ce implementa pentru prima dată această arhitectură.

Figura 2.17. O reprezentare schematică a arhitecturilor (a). von Neumann și (b). Harvard În cadrul arhitecturii Harvard datorită existenței a două zone separate de memorie

viteza de transfer poate fi crescută prin accesări simultane a codului instrucțiunii (situat în memoria program) și a datelor (plasate în memoria de date). În plus, în timp ce procesorul execută instrucțiunea codul următoarei instrucțiuni poate fi încărcat. Un alt avantaj este dat de posibilitatea de a avea lățimi diferite pentru date (de exemplu 8 biți) și instrucțiuni (de exemplu 12 biți, vezi Figura 2.17(b).)23. În situația unui microcontroler pe 8 biți caracterizat de o arhitectură von Neumann atât datele cât și instrucțiunile în mod obligatoriu au același număr de biți.

Arhitectura Harvard modificată îmbină arhitecturile von Neumann și Harvard în vederea îmbunătățirii performanțelor sistemului global. Sistemul global utilizează arhitectura von Neumann, vezi Figura 2.17(a), în timp ce procesorul are două memorii cache diferite (vezi Figura 2.5, Figura 2.6 și Figura 2.7): pentru instrucțiuni și pentru date. Deci, arhitectura internă a procesorului este de tip Harvard în timp cea externă este de tip von Neumann.

Dezavantajul arhitecturii Harvard este dat de existența a 2 bus-uri de date și adrese diferite implicând existența a mai multe trasee și pini ai microprocesorului.

Foarte multe procesoare ce utilizează arhitectura ARM sunt de tip Harward. Din

22 În cadrul acestui calculator instrucțiunile erau stocate pe o bandă magnetică (24 de biți) în timp ce

datele pe un suport electo-mecanic (23 de digiți). 23 Un exemplu relevant în acest sens este dat de microcontrolerele PIC pe 8 biți (produse de compania

Microchip) ce au o lățime a cuvintelor de date de 8 biți în timp ce lățimea cuvintelor instrucțiune poate fi de 12, 14 sau 16 biți în conformitate cu subfamilia din care face parte.

CPU

Memoria de date și

program

Adrese

Date

(a). 8 biți

CPU Memoria

program

Adrese

Date

Adrese

Date

Memoria de date

(b). 8 biți 12 biți

Page 26: Curs Sist Embedded Inteligente - Hardware

26

familia microcontrolerelor, familia de circuite PIC produse de compania Microchip Technology, și familia AVR produsă de compania Atmel utilizează această arhitectură. De asemenea, întreaga familie de DSP-uri (TMS320Cxxxx) produsă de firma Texas Instrument are la bază o arhitectură de tip Harvard.

2.7. Diferenţele existente între microprocesoare, DSP şi microcontrolere

Microprocesoarele (μP) de uz general24, μP, ce stau la baza calculatoarelor personale (de uz general), sunt utilizate în special în situaţia în care sunt necesare capacităţi mari de stocare a datelor (memorie RAM şi HDD). Aceste calculatoare personale sunt caracterizate în general de utilizarea unor sisteme de operare complexe care pot fi sau nu sisteme de operare de timp real (Real Time Operating System – RTOS). O descriere a acestor μP a fost realizată pe larg în unul din capitolele anterioare.

Microcontrolerele (μC) sunt circuite care înglobează în acelaşi cip pe lângă CPU şi o serie largă de periferice, având de cele mai multe ori un set redus de instrucţiuni, comparativ cu μP şi DSP-urile. De cele mai multe ori un microcontroler înglobează o paletă largă de perifericele (ADC, DAC, porturi seriale – RS232, I2C, SPI, CAN etc. –, porturi paralele, numărătoare, sistemul de întreruperi etc.), memoria (program şi cea de date), oscilatorul etc. şi sunt capabile în implementările practice să aibă un număr minim de componente suport externe. μC lucrează la frecvenţe inferioare μP şi DSP-urilor, având în general putere de procesare redusă, ele fiind de altfel dedicate sistemelor embedded ce necesită costuri şi dimensiuni reduse.

Un DSP (digital signal processor) este un microprocesor ce are aceleași caracteristici principale și componente ca și acesta. Diferența între un DSP și un microprocesor constă în faptul că cea mai mare parte a componentelor unui DSP-ului sunt puțin modificate astfel încât acesta să fie capabil să execute procesări numerice de semnal la o viteză superioară unui μP, îndeplinind totodată cerințele de lucru în timp real impuse de o anumită aplicație.

În continuare se vor prezenta puncte comune și elemente ce diferențiază microprocesoarele, DSP-urile și microcontrolerele. Actualmente este din ce în ce mai dificil de a pune o graniță foarte exactă între toate aceste dispozitive. Din ce în ce mai mult producători împrumută tehnici utilizate și specifice unui anumite familii (μP, μC , DSP) pentru sporirea performanțelor propriei familii de dispozitive.

Registrul acumulator Dacă analizăm ecuațiile matematice a celor mai utilizați algoritmi dedicați diferitelor

procesări de semnale se observă între acești algoritmi o similitudine formală, vezi Tabelul 2. Din relațiile prezentate în Tabelul 2 se observă că toți acești algoritmi realizează o operație de sumare a unui anumit număr de termeni de tip produs. Din aceste observații rezultă că este necesar să avem regiștri capabili să stocheze aceste rezultate (în unele situații sumele prezentate în Tabelul 2 pot depăși 1000 de termeni).

În cadrul diferitelor tipuri de unități centrale de procesare (CPU) s-a stabilit convenția

24 Cele mai cunoscute familii de microprocesoare sunt cele produse de companiile Intel™ şi AMD™.

Page 27: Curs Sist Embedded Inteligente - Hardware

27

ca în urma unei operații matematice rezultatul să se salveze într-un registru special numit registrul acumulator25. Dacă în cazul calculatoarelor de uz general26 registrul acumulator are același număr de biți (număr de biți egal cu lățimea bus-ului de date al procesorului27) ca orice alt registru de uz general, în cazul DSP-urilor acestea au implementate registre acumulatoarea cu un număr de biți mult mai mare, capabile să stocheze rezultatele unor operații numerice de procesare a semnalelor similare cu cele prezentate în Tabelul 2.

Tabel 2. Algoritmi clasici utilizați în prelucrarea semnalelor

Algoritm Ecuație

Filtru FIR

Filtru IIR

Convoluție

Transformata Fourier Discretă

Transformata cosinus discreta 2 12

De exemplu, DSP-urile pe 16 biți în virgulă fixă ADSP-21xx și ADSP-219x produse

de compania Analog Devices au înglobate un acumulator pe 40 de biți, în timp ce familia de DSP-uri ADSP-21xxx („SHARC”) au un acumulator pe 80 de biți – această ultimă familie de DSP-uri susține calcule matematice pe 32-bit în virgulă fixă în timp ce calculele matematice în virgulă mobilă sunt efectuate pe 32 și 40 biți. În mod similar, familia de DSP-uri 56300 produsă de Frescale are înglobat un acumulator pe 56 de biți în timp ce bus-ul este pe 24 de biți. În timp ce, DSP-urile familiei TMS320C67x, produse de compania Texas Instruments, au două bancuri de registre pe 32 de biți, fiecare banc incluzând un număr de 32 de regiștri. În cadrul acestei familii în cazul unei înmulțiri a două numere în virgulă mobilă reprezentate pe 32 de biți, rezultatul este stocat în două registre pe 32 de biți alăturate.

25 AX, EAX (in cadrul familiei Intel), ACC or A (pentru microcontrolerele din cadrul familiei 8051), W

register (working register – pentru familia de microcontrolere produsa de Microchip) etc. 26 În cazul unei operații de înmulțire de tipul MUL ECX (operație realizată pe un microprocesor din clasa

Pentium, se realizează înmulțirea conținutului registrului pe 32 de biți ECX cu conținutul registrului EAX) rezultatul final, pe 64 de biți, se va găsi împărțit între registrele EAX și EDX.

27 De exemplu, pentru familia Pentium acest număr este egal cu 32.

Page 28: Curs Sist Embedded Inteligente - Hardware

28

Instrucțiuni de tipul MAC Din Tabelul 2 se observă că anterior stocării rezultatului sunt necesare efectuarea

unui număr de înmulțiri și de adunări consecutive, operații denumite MAC (multiply accumulate). Din acest motiv producătorii microprocesoarele de tip DSP au optimizat această operație implementând-o hardware într-o unitate specializată. Cele mai multe procesoare de tipul DSP efectuează această înmulțire și adunare într-un singur ciclu mașină. Pentru a realiza acest deziderat multiplicatorul și circuitul care realizează adunarea sunt implementate în circuite realizate exclusiv combinațional.

Astfel de unități, de tip MAC, există în cadrul familiei TMS320C55x (produsă de Texas Instruments), a familiei ST100 (STMicroelectronics28), ADSP-21xx (Analog Devices) etc. Mai mult, în cadrul aceluiași DSP existând implementate chiar două astfel de unități. În schimb alte familii, precum familia TMS320C6000, nu au implementate o astfel de unitate (MAC). Familia TMS320C6000 realizează operațiile de tip MAC prin înmulțiri și adunări succesive. În mod normal aceste 2 operații ar necesita 2 cicluri mașină, dar datorită structurii de tip pipeline existente, aceste operații sunt executate în mod aparent într-un singur ciclu mașină. Primele dispozitive ce aveau implementate unități de execuție de tip MAC au fost DSP-urile, dar actualmente multe din procesoarele de uz general au înglobate astfel de unități29.

Multiplicare hardware versus microcod În momentul realizării unui operații de tip MAC ce utilizează numere reprezentate în

virgulă mobilă30, în mod implicit, sunt necesare rotunjiri ale valorilor implicate. Există două abordări ale acestei probleme. În prima metodă, se execută două rotunjiri succesive a operanzilor utilizați și respectiv a rezultatului. Prima rotunjire are loc asupra produsului operanzilor de intrare către alte valori intermediare dar de o precizie mai mare decât precizia finală utilizată și suportată de CPU. Ulterior după efectuarea tuturor calculelor rezultatul mai este rotunjit încă o dată către precizia normală, de lucru suportată de CPU. De exemplu, dacă unitatea MAC trebuie să realizeze la un anumit moment de timp operația a + b · c, în primul pas rezultatul produsului b · c va fi rotunjit, la un anumit număr de biți semnificativi, iar ulterior acest număr rezultant va fi adunat cu a iar acest ultim rezultat va fi din nou rotunjit la un anumit număr de biți semnificativi. Această modalitate de lucru este specifică celor mai multe procesoare de tip DSP. În cea de a doua abordare, inițial se realizează toate calculele într-o precizie superioară iar, în final, are loc rotunjirea (deci doar la sfârșit) – această rotunjire fiind aplicată doar rezultatului (adică numărului a + b · c). Această ultimă metodă este cunoscută sub numele de fused multiply-add (FMA) sau fused multiply-accumulate (FMAC). Avantajul unităților de

28 Anterior SGS Microelettronica, Italia 29 De exemplu, microprocesoarele ce utilizează o arhitectură de tip SH3 (produse de compania Renesas

Technology), precum microprocesorul SH7708, au o singură unitate de tip MAC. Această unitate de execuție poate multiplica 2 operanzi pe 32 de biți, stoca rezultatul în memorie sub forma unui număr pe 32 de biți și, ulterior, aduna acest produs la valoarea existentă în registrul acumulator. Acumulatorul fiind un registru pe 42 de biți.

30 Numerele reprezentate în virgulă mobilă sunt caracterizate de 2 perechi de numere, mantisa (notată în continuare cu n) și exponentul (notat cu e), ambele numere fiind de tip întreg cu semn. Utilizând aceste valori orice număr real se scrie sub forma: n · 2e.

Page 29: Curs Sist Embedded Inteligente - Hardware

29

execuție de tip FMAC este dat de ușurința în implementare a unor funcții precum radicalul sau exponentul.

La ora actuală există un număr mic de microprocesoare ce au înglobate unități de tip FMAC. Dintre acestea putem aminti microprocesoarele de tipul Itanium (produs de Intel) sau familia Loongson, SPARC64 și SPARC64 II (produse de Fujitsu). Compania AMD a anunțat înglobarea unităților de execuție FMAC în procesoarele sale în anul 2011 în timp ce compania Intel va utiliza din nou aceste module în procesoarele Pentium din clasa Haswell de abia în anul 2012.

DMA-ul Există două modalități de transfer a datelor între diferitele periferice și memorie sau

între diferitele zone de memorie. Prima modalitate de transfer a datelor este realizată de CPU, iar cea de a doua este realizată de DMA (direct memory access).

În cadrul microprocesoarelor de tip DSP datorită lucrului intensiv cu date de diferite tipuri (de exemplu cu eșantioane diferitelor semnale, cu imagini etc. sau cu diferite rezultate obținute în urma procesării acestor date) s-a impus necesitatea transferului rapid al informațiilor între diferite periferice și memorie sau între anumite zone de memorie în background (în timpul în care CPU-ul DSP-ului realizează prelucrări asupra altor informații). Deci, utilizând aceste unități de tip DMA datele vor fi mutate dintr-un loc în altul fără intervenția CPU-ului. CPU-ul va configura doar la început DMA-ul. Din motivele enunțate anterior, cele mai multe dintre DSP au înglobate intern diferite sisteme de tip DMA precum EDMA (Enhanced DMA, utilizat în principal pentru transferul de date între un periferic și memorie), QDMA (Quick DMA – utilizat în principal pentru transferul de date, de blocuri de date, în cadrul memoriei externe) sau IDMA (Intrernal DMA) toate aceste tipuri de DMA cu un număr mare și foarte mare de canale. De exemplu, procesoarele din familia TMS320C67xx înglobează controlere de tip EDMA cu 16 canale în timp ce DSP-urile din familiile TMS320C64xx și TMS320DM64xx au 64 de canale ce pot fi utilizate pentru transferuri de tip DMA. În plus, DSP-urile din familia TMS320DMx+ mai au înglobat în CPU o unitate de tip DMA cu două canale, unitate numită IDMA, capabilă să transfere date intern între memoria cache program L1 (L1P), memoria cache date L1 (L1D), memoria cache L2 (L2) și zona de configurare a perifericelor externe.

Calculatoarele de uz general, bazate pe procesoare de tip Intel, utilizau la începuturi un singur controler DMA (de tipul Intel 8237) ce îngloba doar 4 canale. Ulterior, datorită necesităților practice, a mai fost introdus un controler DMA de același tip (Intel 8237). Primul canal al celui de al doilea DMA este utilizat în cascadarea unităților DMA. Din acest motiv un PC are doar 7 canale DMA disponibile. Pentru păstrarea compatibilității cu sistemele anterioare această arhitectură s-a păstrat31 și a suferit modificări minore de-a lungul timpului. Aceste modificări au fost necesare în principal pentru a ține pasul cu evoluția capacităților de stocare a memoriilor de tip RAM, deci a existenței unui: spațiu de memorie mult mai amplu din care și în care trebuiau stocate datele și a numărului de biți transferați într-un singur ciclu.

31 Utilizarea a două unități DMA, fiecare cu câte 4 canale, s-a utilizat pentru prima dată începând cu

microprocesorul 80286 în anul 1982. Acest procesor a fost primul din familia Intel capabil să ruleze toate aplicațiile scrise pentru predecesorul său.

Page 30: Curs Sist Embedded Inteligente - Hardware

30

În general există: (a) două tipuri de transfer; transfer de tip flyby și fetch-and-deposit (calculatoarele personale pe arhitectură Intel acceptă doar primul tip de transfer), [Harvey, 1991], și (b) trei moduri distincte de lucru a controlerelor DMA, [Harvey, 1991]: de tip element, bloc și la cerere.

Transferul DMA de tip flyby32 (cunoscut și sub numele de transfer de tip un singur ciclu, single-cycle, sau de o singură adresă, single-address) este realizat printr-o singur acces la bus-ul sistemului în care se realizează simultan atât citirea sursei cât și scrierea destinației. Datorită acestui singur acces, acest transfer este unul foarte eficient comparativ cu metoda fetch-and-deposit care presupune două cicluri de acces la bus-ul sistemului (în primul pas se preia data ce se stochează local în controlerul DMA iar ulterior informația este scrisă în destinația aleasă). În transferul de tip flyby (existent atât în sistemele cu bus ISA sau EISA) dispozitivul ce dorește să realizeze transferul de date prin DMA depune o cere către controlerul DMA. Controlerul DMA preia controlul bus-ului de date al sistemului, de la procesor, și generează o anumită adresă sursă sau destinație (stocată anterior în controlerul DMA) în conformitate cu sensul transferului. Ulterior generării adresei, controlerul DMA trimite înapoi către dispozitiv un semnal de acceptare a transferului. Ca urmare a acestui accept dispozitivul va citi datele de pe bus sau își va pune propriile date. Acest tip de transfer este similar cu un ciclu de citire sau scriere a unei locații de memorie de către CPU, cu diferența că de această dată controlerul DMA controlează bus-ul de adrese al sistemului precum și liniile de comandă și control în timp ce dispozitivul citește sau scrie datele. Dezavantajul acestui mod de lucru este dat de imposibilitatea transferului de date între oricare două locații de memorie (imposibil modul de lucru: sursa să fie o locație de memorie iar destinația să fie o altă locație de memorie). Pentru a implementa un transfer de tip memorie-memorie se utilizează două canale DMA [Harvey, 1991].

Figura 2.18. Transferul DMA de tip flyby Într-un calculator personal construit în jurul unei arhitecturi Intel toate cele trei

32 Capabil să asigure viteze maxime de transfer de 33 Mocteți/secundă (mod de operare burst pe 32 de

biți).

Page 31: Curs Sist Embedded Inteligente - Hardware

31

moduri de lucru utilizează tipul de transfer DMA flayby. În modul de lucru de tip element (single transfer mode) controlerul DMA transferă doar o singură valoare. În modurile de lucru bloc (block) și la cerere (demnad) controlerul DMA transferă multiple elemente atunci când controlerul DMA a preluat controlul bus-ul sistemului de la procesor. În modul bloc de date controlerul DMA transferă întregul bloc de date cât mai rapid (lungimea blocului este stocată într-un registru intern controlerului DMA) în urma unei singure cereri DMA lansată de dispozitiv. În modul de lucru la cerere transferul are loc doar atâta timp cât dispozitivul extern lansează cereri către controlerul DMA.

Comparând controlerele de tip DMA (existente în PC) cu cele de tip EDMA (existente în DSP-uri) vom observa că acestea din urmă furnizează o flexibilitate sporită în transferul diferitelor tipuri de date. Pentru a susține această idee se vor prezenta doar două facilități foarte importante a acestor controlere EDMA modurile de lucru de tip înlănțuit (chaining) și legătură (linking).

Comparativ cu primele subfamilii de dispozitive de tip C620x/C670x, ce aparțin familiei C6xxx, a căror arhitectură a controlerului DMA este de tip registru, noile subfamilii au o arhitectură a controlerului DMA de tip memorie RAM. Deosebirea fundamentală între aceste două tipuri de arhitecturi constă în locul de depozitare a setului de parametri utilizați în configurarea controlerului DMA. În cadrul familiei C6xxx aceste zone de memorie variază de la capacități de stocare a unui număr de maximum 85 de grupuri de parametri (2 Kocteți de RAM) până la maximum 213 grupuri de parametri (5 Kocteți de RAM).

Memoria cache Un alt avantaj al CPU de tip DSP este dat de flexibilitatea utilizării memoriei interne,

locale a CPU (L1 sau L2) drept memorie cache sau drept memorie RAM (prin maparea acestei memorii cache în spațiul extern al memoriei RAM). De exemplu, dacă analizăm foaia de catalog a unui DSP de tipul TMS320C64x vom găsi următoarele informații:

L1P (program) o 32 Kbytes configurable: Memory-mapped (default after reset) or direct-mapped

cache – 32bytes cache line L1D (data)

o 32 Kbytes configurable: Memory-mapped (default after reset) or 2-way set associative cache – 64bytes cache line

o 48K bytes memory-mapped L2 (program and data)

o 64Kbytes configurable: Memory-mapped (default after reset) or 2-way set associative cache—128bytes cache line

o 32Kbytes memory-mapped o 16Kbytes ROM

Dacă analizăm funcționarea memoriei L1D observăm că după resetarea sistemului întreaga cantitate de memorie internă de tip L1D va fi map-ată și utilizată drept memorie RAM. Funcție de setările interne ale DSP-ului se pot aloca 4 Kocteți, 8 Kocteți, 16 Kocteți sau 32 de Kocteți drept memorie cache internă de tip L1D, vezi Figura 2.19.Chiar în situația în care se alocă 32 Kbiți drept memorie internă cache, 48 Kocteți vor rămâne în continuare map-ați în spațiul memoriei RAM.

Posibilitate utilizării memoriei cache interne de tip program (L1P) sau date (L1D) sau

Page 32: Curs Sist Embedded Inteligente - Hardware

32

a memoriei L2 pentru a fi map-ată în spațiul memoriei de date sau program externe este o facilitate foarte importantă oferită de familia de DSP-uri produse de firma Texas Instruments. Să presupunem o aplicație tipică de tip procesare de semnale. În primul pas se achiziționează semnalele, ulterior vectorii de date se procesează de către DSP și, în ultimuil pas, rezultatele sunt trimise, de exemplu, către un convertor DAC.

Figura 2.19. Modalități de configurare a memoriei L1D interne a DSP-ului Deoarece într-un microprocesor de tip RISC memoria cache este interna iar

manipularea ei este transparentă utilizatorului (nu este sub controlul lui, a programului dezvoltat de el – CPU-ul o utilizează pentru creșterea performanțelor proprii dar o face independent de voința utilizatorului) pentru stocarea datelor obținute de la un dispozitiv extern (de exemplu un ADC) putem folosi doar memoria RAM, externă a sistemului.

Figura 2.20. Transferul datelor și procesarea lor într-un microprocesor RISC clasic

RAM 0

RAM 1

RAM 2

RAM 3

0 K

4 K

8 K

16 K

32 K

RAM 4 (48 Koct.)

CACHE 0

RAM 1

RAM 2

RAM 3

RAM 4 (48 Koct.)

CACHE 0

CACHE 1

RAM 2

RAM 3

RAM 4 (48 Koct.)

CACHE 0

CACHE 1

CACHE 2

RAM 3

RAM 4 (48 Koct.)

CACHE 0

CACHE 1

CACHE 2

CACHE 3

RAM 4 (48 Koct.)

SoC

CPU

Memorie externă RAM

Echipament periferic (de ex.

ADC/DAC)

EMIF

Port

EDMA

L1D

cache

Unitatea de control și de

procesare a datelor

Buffer de date

(1)

(2)

(3)

(4)

(5)

(6)

Page 33: Curs Sist Embedded Inteligente - Hardware

33

Într-un astfel de sistem fluxul de date este similar cu cel prezentat în Figura 2.20. În primul pas pentru a nu încărca procesorul inutil cu achiziționarea datelor acestea sun preluate, aduse cu ajutorul unui DMA (care poate fi sau nu înglobat în interiorul SoC) în memoria RAM, externă a sistemului, pasul (1). După achiziționarea tuturor datelor CPU începe procesarea lor, la prima citire sau atunci când sistemul de predicție identifică corect calea pe care programul o urmează, datele sun aduse în memoria cache internă procesorului, pasul (2). Procesorul începe prelucrarea lor conform algoritmului utilizat (a programului), pașii (3) și (4). Datele vor fi rescrise în memoria RAM externă prin unul din mecanismele pe care le utilizează write-back sau write-through – opțiunea (5). În final, după finalizarea procesării digitale a întregului vector de date acestea vor fi trimise, prin intermediul unui circuit de tip DMA, către echipamentul periferic destinatar, de exemplu un circuit DAC.

În cazul DSP-urilor de la firma Texas Instruments datorită posibilității map-ării memoriei cache interne în spațiul memoriei RAM externe (cu păstrarea performanțelor unei memorii de tip L1D – adică latență egală aproape cu zero) fluxul de date este similar cu cel din Figura 2.21. În afara faptului că memoria RAM externă (mult mai lentă) nu mai intervine de loc în stocarea datelor, că fluxul de date este mult simplificat se oferă posibilitatea stocării datelor obținute de la dispozitivele periferice direct în memoria cache internă (memorie foarte iute) și, mai mult, zone de cod critice sau diferitele variabile33 utilizate foarte des pot să fie stocate intern în memoria cache.

Figura 2.21. Transferul datelor și procesarea lor într-un DSP din familia TMS320Cxxxx O abordare oarecum similară cu cea prezentată anterior se găsește în cadrul familiei

de procesoare ARM ce au intern o memorie de tip TCM (Tightly-Coupled Memory). În

33 Utilizarea lui register din limbajul C determină ca o anumită variabilă să fie stocată într-un registru al

procesorului obținându-se astfel o creștere a vitezei de execuție a codului. Dar, numărul de regiștri pe care un procesor îi are este limitat. În schimb cantitatea de memorie cache este mult, mult mai mare permițând astfel ca un număr mult mai mare de variabile să fie stocate și manipulate foarte rapid determinând astfel creșterea performanțelor globale ale aplicației.

SoC

CPU

Memorie externă RAM

Echipament periferic

(de ex. ADC)

EMIF

Port

EDMA

L1D

cache

Unitatea de control și de

procesare a datelor

Memorie cache map-ată ca memorie RAM

(1)

(2)

(3)

(4)

Page 34: Curs Sist Embedded Inteligente - Hardware

34

aceasta memorie rapidă, internă procesorului se pot plasa date și părți din programe, performanțele obținute sunt similare cu acelea obținute atunci când codul sau datele sunt în memora cache a procesorului. Singura diferență între aceste memorii (TCM și cache) este dată de posibilitatea controlului direct, a plasării voliționale de către programator a codului și/sau a datelor în memoria TCM comparativ cu modalitatea transparentă programatorului (ne aflată sub controlul acestuia) de aducere automată a informațiilor necesare blocurilor interne procesorului.

Facilități specifice de adresare a memoriei.

Cea mai mare parte a microprocesoarelor de uz general pot executa algoritmi specifici

procesărilor digitale de semnale, deci algoritmi specifici dispozitivelor de tip DSP, fără prea mari probleme. Dar aceste dispozitive de tip μP nu sunt potrivite pentru acest gen de activități, în principal datorită costurilor existente şi a puterii consumate34. Întotdeauna în momentul alegerii unor astfel de dispozitive trebuie să punem în balanţă puterea consumata (de exemplu trebuie să avem în vedere atât consumul unui DSP dar şi acela a unui microprocesor Pentium de tipul simplu sau dual core) cât şi costurile dispozitivelor în sine (cât costă un DSP şi cât costă un μP din familia Intel).

34 De exemplu, puterea consumată de către un DSP se poate situa în domeniul 10-100 mW. DSP-ul

TMS320C5510 consumă doar 80 mW la o frecvență de 160 MHz oferind o putere de calcul de 320 MIPS.

Page 35: Curs Sist Embedded Inteligente - Hardware

35

Bibliografie [ATtiny13A, 2011] Compania Atmel, documentaţia tehnică a microcontrolerului

ATtiny13A, http://www.atmel.com/dyn/resources/prod_documents/doc8126.pdf, link valid ianuarie 2011

[Pentium, 2011] Compania Intel, documentaţia tehnică a procesorului Pentium, www.intel.com/design/pentium/datashts/24199710.pdf, link valid februarie 2011

[Krazit, 2006] Tom Krazit, ARMed for the living room, aprilie 2006, document online la adresa: http://news.cnet.com/ARMed-for-the-living-room/2100-1006_3-6056729.html, link valid ianuarie 2011

[Wikipedia, 2011] Wikipedia - the free encyclopedia, ARM architecture, http://en.wikipedia.org/wiki/ARM_architecture, link valid ianuarie 2011

[Clarke, 2009] Peter Clarke, ARM will overtake Intel in netbooks, smartbooks, says analyst, articol online: http://www.industrialcontroldesignline.com/showArticle.jhtml?articleID=220300319, septembrie 2009

[Harvey, 1991] A. F. Harvey and Data Acquisition Division Staff, DMA Fundamentals on Various PC Platforms, National Instruments, Application Note 011, 1991

[Musah, 2008] A. Musah, A. Dykstra, Power-Management Techniques for OMAP35x Applications Processors, Notă de aplicație SPRT495, Texas Instruments, septembrie 2008, document online pe site-ul web al firmei Texas Instruments: http://focus.ti.com/lit/an/sprt495/sprt495.pdf

[Intel, 2009] Intel, Microprocessor Quick Reference Guide, noiembrie 2009, http://www.intel.com/pressroom/kits/quickreffam.htm

[Gouraud, 1971] H Gouraud, Continuous shading of curved surfaces, IEEE Transactions on Computers, vol. C-20, pp. 623-629, 1971

[Phong, 1975] B. T. Phong, Illumination for Computer Generated Pictures, Communications of the ACM, vol. 18, nr. 6, pp. 311-317, 1975