57
BAZELE MICROPROCESOARELOR 3 - 44 3.1 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE 3.2 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE 3.3 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE 3.4 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE

Cap3bnr

Embed Size (px)

DESCRIPTION

Cap3bnr

Citation preview

BAZELE MICROPROCESOARELOR

3 - 44

3.1 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE

3.2 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE

3.3 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE

3.4 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE

MICROPROCESOARE - CONCEPTE GENERALE

3 - 45

3.5 SOFTWARE-UL SISTEMULUI MICROPROCESOR-ASPECTE GENERALE In acest paragraf se va aborda microprocesorul dintr-un alt punct de vedere, cel al programarii sale, al posibilitatilor si al modului de organizare a setului de instructiuni. Dupa cum s-a precizat deja, intrepatrunderea celor doua aspecte, hardware si software, impune stapanirea notiunilor de baza corespunzatoare, atat in proiectarea sistemului, cat si in realizarea programelor pentru o aplicatie data. 3.5.1 Consideratii de baza Pentru o gama foarte larga de microprocesoare, informatia este data sub forma cuvintelor de 8 biti, sau a cuvintelor de 16 biti. Deoarece o instructiune poate necesita un numar mai mare de biti pentru transmiterea informatiei necesare executarii unei anumite operatii, instructiunile unui microprocesor vor avea o lungime de unul sau mai multe cuvinte de 8 (16, 32) biti. Intotdeauna primul cuvant din instructiune va contine codul operatiei (eventual continuat si in al doilea cuvant), urmatoarele cuvinte continand, daca sunt necesare, eventuale valori numerice semnificand constante sau adrese de celule de memorie sau porturi, cu care opereaza instructiunea respectiva. Citind primul cuvant al instructiunii, microprocesorul il decodifica si, sub incidenta sectiunii de CONTROL, executa operatia corespunzatoare. Daca, de exemplu, codul operatiei indica o instructiune cu trei octeti (fie un microprocesor de 8 biti), in care octetii 2 si 3 contin o adresa din memorie, al carei continut va fi adus in acumulator, succesiunea de operatii ce au loc va fi dupa cum urmeaza: • se citeste primul octet al instructiunii; • se decodifica codul operatiei; • conform codului, se mai citesc doi octeti suplimentari (la fiecare citire, PC este incrementat), de la adresele succesive primei citiri (instructiunea are cuvintele unul dupa altul in memoria program); • se configureaza pe magistrala de adrese adresa desemnata de catre cei doi octeti suplimentari cititi si se citeste aceasta celula de memorie, continutul ei fiind transferat in acumulator; • se trece la citirea si executarea altei instructiuni. In general, pentru o organizare pe cuvinte de 8 biti, cele 256 de combinatii posibile oferite de un cuvant sunt suficiente pentru a se configura un set de instructiuni destul de bogat. Evident, microprocesoarele de 16 biti au o paleta de posibilitati mult crescuta. Astfel, de exemplu, figura 3.34 prezinta structura principiala a instructiunilor unui microprocesor pe 8 biti, avand cuvinte de instructiune de 1, 2 sau 3 octeti. Dupa cum s-a precizat, primul cuvant contine codul operatiei, si eventual, operandul (operanzii) instructiunii, cuvantul (cuvintele) suplimentare (daca exista, in functie de instructiune), continand date necesare la executia instructiunii respective.

BAZELE MICROPROCESOARELOR

3 - 46

LSBMSB

cuvint de date

instructiunepe 1 cuvint

instructiune

instructiune

pe 2 cuvinte

pe 3 cuvinte

cod operatie

cod operatie

cod operatie

adresasau data

data sauadresa

B4 B3 B2 B1 B0B7 B6 B5

B4 B3 B2 B1 B0B7 B6 B5

B4 B3 B2 B1 B0B7 B6 B5

B4 B3 B2 B1 B0B7 B6 B5

B4 B3 B2 B1 B0B7 B6 B5

B4 B3 B2 B1 B0B7 B6 B5

B4 B3 B2 B1 B0B7 B6 B5

Fig.3.34. Structura principiala a instructiunilor unui microprocesor

3.5.2 Moduri de adresare O operatie frecventa in diversele etape de executie ale unui program este referirea la diversele celule de memorie RAM, ROM, sau la registrele microprocesorului. Aceste referiri la locatii de memorie implica operatia de adresare, fiind posibile multiple moduri de adresare. Indicat prin codul operatiei ce se executa, modul de adresare implica obtinerea, prin diverse procedee, a adresei cu care se va opera in instructiunea respectiva. Exista o gama relativ importanta de moduri de adresare. In functie de tipul microprocesorului, se implementeaza prin setul de instructiuni unele dintre aceste moduri de adresare. O posibilitate de apreciere a performantelor unui microprocesor este data si de paleta de moduri de adresare ale acestuia. Cu cat gradul de sofisticare oferit de modurile de adresare creste, cresc si posibilitatile si flexibilitatea programatorului de a realiza programe mai eficiente, compacte, performante. Pe de alta parte, intervin deasemenea, ca de altfel in general in procesul elaborarii programelor, si elemente subiective, legate de optiunile personale ale programatorului, de experienta si capacitatea sa de a gasi solutia optima pentru implementarea unei aplicatii date. Vom prezenta in continuare cele mai intalnite moduri de adresare, utilizate la diferite tipuri de microprocesoare, insotite de explicatii si exemplificarea utilizarii lor. In esenta, se va explica felul in care pentru fiecare mod de adresare in parte, se obtine operandul unei instructiuni a microprocesorului. Unele instructiuni contin si acest operand, altele indica adresa sau modul de obtinere al adresei unde se va gasi operandul respectiv. Mecanismul obtinerii acestor operanzi va diferentia modurile de adresare posibile. Figura 3.35. reprezinta in mod sintetic cele mai des intalnite

MICROPROCESOARE - CONCEPTE GENERALE

3 - 47

moduri de adresare. Desi figura exemplifica aceste moduri de adresare pentru un microprocesor de 8 biti, prezentarea ce urmeaza este general valabila, si pentru microprocesoare cu capacitati sporite (16 sau 32 de biti).

Exemplele prezentate utilizeaza instructiuni si notatii specifice microprocesorului INTEL 8086. Pentru a nu intra in detalii care la acest stadiu al prezentarii pot fi incomode si pot complica inutil prezentarea, se prezinta in esenta modul de obtinere al deplasamentului in cazul adresarii memoriei sistemului microprocesor. Mecanismul de operare al microprocesorului 8086 pentru obtinerea adreselor efective, prin utilizarea registrelor de segment, in combinatie cu deplasamentul, nu este evidentiat aici, el fiind de altfel transparent pentru scrierea programului, atata timp cat se vor utiliza registrele segment implicit destinate fiecarei instructiuni in parte. Detalii suplimentare se pot gasi la prezentarea microprocesorului 8086, facuta in capitolul 4 al lucrarii.

Reg. index selectat in octetul de instr.

>

>

Adr. (reg.) inclusa in cadrul instr.

Octet 1

Octet 2 Octet 3 Octet 1Low High

Octet 1 Octet 2 Octet 3 Low High

Octet 1 Octet 2 Octet 3 Low High

>

>

Octet 2 Octet 3Octet 1Low High

>

>

Adr. de baza> Adunare

>Adr.efectiva

Data ; nu este necesar acces la memImediata

Registru

Indexata

Directa

Indirecta

>

>

>

><

Valoare index

Adr. 0 ÷255

Adr. 0 ÷ 65536

Prima adresa

>

Adr.efectiva

Data

Data

Data

Data

Data

Data

Octet 2 Octet 3 Octet 1Low High

Relativa

> Adunare

> >

Adr. efectivaP C

â

Valoareacontorului deprogram, laurmatoareainstructiune

Observatie : Octet 1 reprezinta octetul deinstructiune in toate cazurile

Registre

BAZELE MICROPROCESOARELOR

3 - 48

Fig.3.35. Moduri de adresare ale unui microprocesor Adresarea imediata In cazul adresarii imediate, instructiunea contine in primul cuvant codul operatiei, iar in urmatorul cuvant (urmatoarele cuvinte), contine o valoare constanta, reprezentand chiar operandul necesar pentru executia instructiunii respective (v. fig. 3.35). Aceasta valoare este deci definita inca din faza de scriere a programului, fiind data de programator in codul instructiunii, reprezentand deci in general valori constante, fixe, ale programului. Acest mod de adresare este cel mai simplu mod de manipulare a unei valori constante de catre programator, necesitand un timp redus de executie, deoarece imediat dupa citirea codului operatiei, in subciclul urmator al instructiunii, se extrage (fetch) valoarea operandului, utilizat de catre instructiune la executia sa. Adresarea imediata este utila in compararea continutului unui registru cu o valoare constanta, in vederea luarii unei decizii in program, fara a mai necesita utilizarea de memorie RAM suplimentara. Principala limitare a acestui mod de adresare este data de faptul ca valoarea operandului, fiind continuta in codul instructiunii, este fixa pentru un program dat, neputand fi modificata in cursul rularii acestuia. De exemplu, o instructiune de transfer a unei valori constante intr-un registru al microprocesorului 8086 va avea structura din figura 3.36, indicand incarcarea registrului BX cu valoarea constanta 3.

Mnemonica Reprezentare in memorie Executie instructiune

MOV BX, 3 BXcod operatie

operandinitial: BX = xxxx

final: BX = 0003

PC

PC+1

PC+2

0003BB0300

memorie programregistre

Fig. 3.36. Executia unei instructiuni ce utilizeaza adresarea imediata.

Adresarea directa (absoluta) In cazul adresarii directe, instructiunea contine, dupa primul cuvant, al codului operatiei, un cuvant (sau 2, in functie de tipul microprocesorului si de capacitatea sa de adresare), reprezentand adresa efectiva la care se gaseste operandul necesar pentru implementarea instructiunii respective (v. fig. 3.35). Astfel, daca s-ar utiliza adrese reprezentate pe un octet, cu un cuvant se poate adresa oricare dintre 256 de celule (prea putin, uzual); daca se utilizeaza 2 octeti pentru reprezentarea unei adrese (reprezentate pe 2 cuvinte de instructiune pentru microprocesoarele de 8 biti, sau pe 1 cuvant de instructiune pentru microprocesoarele de 16 biti), se poate indica in instructiune, direct, adresa uneia dintre 64 k cuvinte de memorie. Pentru un microprocesor cu capacitatea totala de adresare de 64 k cuvinte, sau pentru adresarea in interiorul unei pagini de memorie de 64 k cuvinte (specifica unor microprocesoare de 16 biti, precum INTEL 8086), reprezentarea pe 16 biti a adresei, in cadrul cuvantului de instructiune, permite programatorului adresarea oricareia dintre celulele de memorie adresabile (global, sau in pagina de memorie curenta). Figura 3.37. prezinta un exemplu de

MICROPROCESOARE - CONCEPTE GENERALE

3 - 49

instructiune ce utilizeaza adresarea directa, pentru a transfera continutul unui registru (AX = 0523H), intr-o celula de memorie de adresa specificata (ALFA = 07F8H), din segmentul de date curent (celula contine initial o valoare in locul careia se va inscrie noul operand, continutul registrului AX).

Mnemonica Reprezentare in memorie Executie instructiune

MOV ALFA,AX

AXcod operatie

operand

initial: AX =0523H

final: AX = 0532H

PC

PC+1

PC+2

ALFA=07F8

ALFA=XXXX

ALFA = 0532H

0532

0532H

A3

F807

0532

memorie programregistre

memorie de date

Fig. 3.37. Executia unei instructiuni ce utilizeaza adresarea directa

Avantajul adresarii absolute fata de adresarea imediata rezulta din modul de obtinere a datei utilizate la executia instructiunii: dupa cum s-a specificat deja, la adresarea imediata, structura fixa a instructiunii implica utilizarea unei valori constante a operandului; la adresarea absoluta, daca se modifica continutul celulei de memorie a carei adresa este continuta in instructiune, instructiunea va utiliza la executie data de la adresa respectiva, care poate diferi pe parcursul executiei programului. Ca un exemplu, figura 3.38 prezinta comparativ doua secvente de program, prima efectuand adunarea a doua numere constante, specificate in codul operatiilor (utilizand adresarea imediata), iar cea de-a doua efectuand adunarea a doua numere aflate in doua celule din memoria de date (utilizand adresarea directa).

BAZELE MICROPROCESOARELOR

3 - 50

Instructiuni(mnemonici)

Reprezentare in memorie

MOV AX, 123H

AXPC

PC+1

PC+2

ADD AX, 345H

MOV REZ, AX

PC+8

1

2

3

REZ:100H

+

1

23

...

(a) utilizind adresarea imediata

Instructiuni(mnemonici)

Reprezentare in memorie

MOV AX, OP1

PC

PC+1

PC+2

ADD AX, OP2

MOV REZ, AX

PC+8

1

2

3

REZ:100H

+

1

2 3

...

(b) utilizind adresarea directa

0468H

123H

345H

123H468H

468HOP1:80H

OP2:90H

0123H

0345H

0468H

memorie program

memorie de date

memorie de date

memorie program

AX

AX

123H

345H 468H

468H

B3

23

01

05

45

03

A3

00

01

B3

80

00

05

90

00

A3

00

01

registre

registre

Fig. 3.38. Compararea implementarii programelor utilizand adresarea imediata (a), sau directa (b)

In esenta, pentru a modifica datele ce se aduna, programatorul va trebui sa modifice, in cazul adresarii imediate, codul instructiunilor (deci programul), pe cand in cel de-al doilea caz, al adresarii absolute, programatorul va trebui sa modifice continutul celulelor de memorie din memoria de date, in care se gasesc cele doua valori; programul ramane neschimbat in acest caz, pentru diferitele valori ale celor doua numere din memoria de date. Solutia adresarii imediate se va prefera in cazul operarii cu constante (ce nu se schimba in timpul programului), fiind o solutie mai rapida la executia programului. Adresarea registru Acest mod de adresare reprezinta o varianta a adresarii directe, in care operandul (operanzii) sunt continuti in registrele de uz general ale microprocesorului, in loc de memorie (v.fig. 3.35). Deoarece numarul de registre de uz general ale unui microprocesor este relativ redus, se codifica adresa registrului (registrelor) pe cate un cimp de 3-4 biti (functie de numarul maxim al acestor registre), continut in insasi cuvantul de instructiune, care astfel contine operanzii instructiunii. Aceasta permite ca instructiunea sa aiba doar un singur cuvant, fiind deci scurta, si sa se execute foarte rapid (datorita vitezei de executie sporite, la accesarea registrelor interne ale microprocesorului, dupa cum s-a mai mentionat). Figura 3.39 prezinta un exemplu de instructiune utilizand adresarea registru, care transfera continutul unuia dintre registrele microprocesorului (CS), in alt registru al microprocesorului (AX).

MICROPROCESOARE - CONCEPTE GENERALE

3 - 51

Mnemonica Reprezentare in memorie Executie instructiune

MOV AX,CSAX

initial: AX =XXXX

final: AX = A3C2H

PC

PC+1

CS = A3C2H

CS = A3C2H

memorie program CS A3C2

A3C2

A3C2

A3

F8

registre

Fig.3.39. Executia unei instructiuni ce utilizeaza adresarea registru

Adresarea indexata Unele microprocesoare sunt prevazute cu registre denumite registre index, care pot fi utilizate pentru implementarea acestui mod de adresare. In esenta, adresa datei ce se va utiliza de catre instructiune se obtine prin adunarea continutului registrului index, specificat de catre instructiune, cu o valoare numerica continuta in codul instructiunii. Aceasta permite ca, prin modificarea continutului registrului index, sa se obtina adrese diferite ale datei utilizate de catre instructiune. Figura 3.40 prezinta o instructiune de adunare la continutul acumulatorului (AX), a valorii continute in celula de memorie cu adresa data de suma dintre adresa de inceput a unui tabel (TAB) si un indice continut intr-un registru index (SI).

Mnemonica Reprezentare in memorie Executie instructiune

ADD AX, TAB[SI] AXPC

PC+1

memorie program

SI 0005

03

04

registre

00

01

... memorie de date

TAB=100H

TAB+5 0422

AX = 0123HSI = 0005HTAB[5]=0422H

dupa executie:

AX = 0545HSI = 5TAB[5] = 0422H

inainte de executie:

100H

100H

5H

105H

422H

123H

545H123H / 545H

Fig. 3.40. Executia unei instructiuni ce utilizeaza adresarea indexata.

BAZELE MICROPROCESOARELOR

3 - 52

Continutul registrului index poate fi modificat automat (prin indicarea in codul instructiunii a acestui lucru), incrementat sau decrementat, pregatindu-l astfel pentru utilizari ulterioare, ale aceleiasi instructiuni (de exemplu intr-o bucla de program), pentru a se adresa locatii distincte (uzual consecutive), ale memoriei. Tipic, acest mod de adresare este util la adresarea unor elemente ale unui tabel de valori. Adresa de inceput a tabelului (adresa de baza), este continuta in codul instructiunii (ca operand al acesteia), iar deplasamentul fata de inceputul tabelului (deci indicele elementului de tabel ce se doreste a se adresa), in registrul index.

Astfel, prin implementarea unei bucle de program, se pot adresa in mod succesiv locatiile unei zone de memorie. La fiecare trecere a programului prin bucla respectiva, continutul registrului index se reactualizeaza (prin incrementare, de exemplu), fiind pregatit pentru a adresa urmatorul element al tabloului. Figura 5.41 prezinta un asemenea exemplu, in care bucla de program prezentata se executa de un numar de ori egal cu valoarea initiala a registrului CX. La fiecare pas, valoarea registrului index (SI) - initial 0 - este incrementata, determinand adunarea succesiva a tuturor numerelor din tabelul TAB (fie 10 numere). La iesirea din bucla, registrul AX (setat initial cu 0), va contine suma continuturilor tuturor celulelor de memorie din tabelul TAB.

SI = 0AX = 0CX = 10

AX = AX + TAB[SI]

CX = CX - 1

CX = 0

MOV AX, 0

MOV SI, AX

MOV CX, 10

ADD AX, TAB[SI]

ADD SI, 1

LOOP BUCLA

...(a) (b)

BUCLA

; initializari

; calcul suma elemente

Fig. 3.41. Implementarea unei bucle de program, ce utilizeaza adresarea indexata .(a) Schema logica a secventei de program; (b) secventa de program

Adresarea indirecta In esenta, in cadrul adresarii indirecte, instructiunea contine in cuvantul de instructiune, ca operand, o adresa la care se va gasi, in memorie, adresa efectiva unde este localizata data cu care va opera instructiunea la executia sa (v.fig. 3.35). Acest tip de adresare ofera un grad suplimentar de flexibilitate fata de adresarea indexata, in sensul ca apar "doua grade de libertate" in ceea ce priveste modul de localizare a datei ce se manipuleaza in instructiunea respectiva. Ca o varianta, la adresarea indirecta prin registru, instructiunea se refera la un registru al microprocesorului (sau la o pereche de registre), care contin adresa datei ce se va utiliza in instructiune. Figura 3.42 contine un exemplu

MICROPROCESOARE - CONCEPTE GENERALE

3 - 53

de acest tip, in care se schimba continutul registrului BX cu continutul celulei de memorie a carei adresa este continuta in registrul SI.

Mnemonica Reprezentare in memorie Executie instructiune

XCHG BX, [SI] BXPC

PC+1

memorie program

SI 0100H

87

1C

registre

... memorie de date

BX = 1234SI = 100H

mem(100H) =6789

dupa executie:

BX =6789SI = 100Hmem(100H) = 1234

inainte de executie:

100H

5678 1234

1234/6789

6789/1234

100H

Fig.3.42. Executia unei instructiuni ce utilizeaza adresarea indirecta Adresarea relativa Acest mod de adresare utilizeaza operandul continut in codul de instructiune pentru a efectua o deplasare "in sus" sau "in jos" in program, din punctul curent (de la adresa curenta, continuta in registrul contor de program), cu valoarea acestui operand, deci cu un numar dat de cuvinte de memorie. Uzual, acest tip de adresare se utilizeaza la implementarea instructiunilor de salt relativ in program (salturi scurte). Operandul va reprezenta in acest caz nu o adresa, ci o constanta (pozitiva sau negativa - un numar in complement fata de 2), reprezentand numarul de cuvinte de instructiune peste care trebuie sa sara programul "inainte" in memorie - in sensul cresterii adresei (pentru valori pozitive ale operandului), sau "inapoi" in memorie - in sensul descresterii adresei (pentru valori negative ale operandului), de la locatia curenta a programului. Aceasta valoare continuta in operandul unei instructiuni cu adresare relativa se numeste "offset" (deplasare), reprezentand diferenta dintre adresa instructiunii destinatie si cea a instructiunii imediat urmatoare instructiunii curente. Aceste valori de deplasare sunt uzual calculate de catre programul asamblor, in mod automat, programatorul utilizand o scriere formala, convenabila. Figura 3.43 prezinta modul de scriere, si codul generat pentru o secventa de program ce utilizeaza o adresare relativa inainte (JLE ERR), si una inapoi (JMP TST). Se poate remarca modul de obtinere al deplasamentului in cele doua cazuri, reprezentat in cod complementar fata de 2.

BAZELE MICROPROCESOARELOR

3 - 54

8B

DB

83

20

00

7E

05

0F

10

00

EB

F6

8B

C3

MOV BX, AX

CMP BX, 20H

JLE ERR

ADD BX, 10H

JMP TST

MOV AX, BX

Coduri instructiuni Memorie program Comentariiadresa

0

1

2

3

4

5

6

7

8

9

10

11

12

13

salt pozitiv cu +5salt negativ cu -10=F6h

TST

ERR

; incarcare BX cu continut AX

; comparare BX cu 20H

; daca BX < 20H, sau BX=20H, salt la ERR

; BX = BX + 10H

; reluare program de la adresa TST

; memorare BX in AX

cod

Fig. 3.43. Utilizarea adresarii relative la efectuarea salturilor scurte in program

3.5.3 Setul de instructiuni al microprocesorului Gradul de complexitate si varietate al operatiilor ce pot fi efectuate de catre microprocesor definesc puterea de calcul si performantele posibile ale acestuia. Totalitatea operatiilor posibile: intre registre, a celor cu memoria, aritmetico-logice si alte operatii speciale, prin care se activeaza diversele parti constitutive ale microprocesorului (prezentate la sectiunea de hardware) alcatuiesc, in ansamblul lor, setul de instructiuni al microprocesorului. El permite "conectarea" intre ele a diverselor parti ale microprocesorului, dand flexibilitatea deosebita a acestuia. O simpla modificare de program a uneia sau a mai multor instructiuni, si functionarea globala a sistemului este alta. Iata un nou mod de "construire" a unui sistem automat. Pentru a prezenta, in mod principial, modul de organizare al setului de instructiuni al unui microprocesor, se considera un procesor organizat pe cuvinte de 8 biti. Cele 256 de combinatii posibile din codul operatiei vor fi suficiente pentru a genera un set de instructiuni tipic. Clasificarea instructiunilor •• Instructiuni de transfer si actualizare a informatiei

MICROPROCESOARE - CONCEPTE GENERALE

3 - 55

Grupul 0 --- operatii generale. Instructiunile acestui tip permit incrementarea, decrementarea (cresterea, respectiv scaderea continutului registrelor, sau a unei celule de memorie), incarcarea continutului registrelor, rotirea continutului acestora si alte operatii de acest gen. Grupul 1 --- operatii de transfer al informatiei. Contine instructiunile ce permit transferarea informatiei dintr-o locatie denumita sursa, intr-o alta locatie, destinatia, fara a se modifica informatia. Sursele pot fi registre, celule de memorie RAM, PROM, porturi de intrare. Destinatiile pot fi registre, celule de memorie RAM, porturi de iesire. De facto, aceste operatii realizeaza legatura intre o locatie si alta (ca si cum ar fi conectate fizic una cu

alta). •• Instructiuni de modificare a informatiei Grupul 2 --- operatiile aritmetico-logice. Contine instructiunile ce permit efectuarea de operatii aritmetice sau logice, asupra continutului unor registre ale microprocesorului, sau (doar pentru unele microprocesoare), asupra unor celule de memorie. •• Instructiuni de control Grupul 3a --- operatii de control al programului. Sunt instructiunile care permit transferarea executiei programului, de la locatia curenta, intr-o alta zona a programului (modificarea PC). Transferul se poate efectua neconditionat, sau doar in cazul setarii unora dintre indicatorii registrului de stare. In plus, transferurile pot fi cu revenire in punctul de unde se genereaza transferul, in care caz adresa curenta a programului este salvata inainte de a se efectua transferul, sau fara revenire, caz in care nu se salveaza adresa curenta. Grupul 3b --- operatii de control al procesorului. Sunt operatii ce actioneaza direct asupra microprocesorului. Tipice sunt operatiile de stop al procesorului, activare / dezactivare intreruperi, instructiunea inoperanta (NOP - no operation). Se utilizeaza unii dintre bitii octetului de cod al instructiunii pentru a desemna grupa de operatii din care face parte instructiunea. Astfel, pentru cele patru grupe anterior definite, vor fi necesari 2 biti (fie cei mai semnificativi ai octetului), care definesc grupa careia ii apartine o operatie data.

Fig.3.44. Structura codurilor operatiilor unui microprocesor

0 0 D D D N N N

0 1 D D D S S S

S S S1 0 X X X

1 1 C C C Y Y Y

codGrupa 0

destinatie operatie

destinatiecod sursagrupa 1

cod

cod

grupa 2

grupa 3

operatie sursa

operatiedetransfer

conditietransfer

(a)

(b)

(c)

(d)

BAZELE MICROPROCESOARELOR

3 - 56

In figura 3.44 sunt prezentate structurile codurilor operatiilor instructiunilor din cele patru grupe, pentru un microprocesor de 8 biti (pentru simplitatea prezentarii). Astfel, instructiunile din grupa 0 sunt formate din cei doi biti de cod de grupa, trei biti (desemnati prin DDD), codificand registrul asupra caruia se opereaza (se remarca deci limitarea la 8 registre --- sau, uzual, 7 registre si o celula de memorie, adresata indexat de catre un registru index) si trei biti (NNN), indicand operatia ce se efectueaza. Cunoscand, din manualul de programare al microprocesorului, codurile fiecarui registru al acestuia, cat si ale operatiilor dorite a se efectua, se poate genera codul unei anume instructiuni din aceasta grupa. De exemplu, considerand o operatie de incrementare (cod 100) a registrului 3, (cod 011), codul binar al operatiei va fi (DDD=011, NNN=100), 00011100 sau, intr-o forma accesibila, in baza 8 de numarare, 0348. Scrierea unor programe sub aceasta forma, (desemnata ca programare in cod masina), ar fi nu numai greoaie, dar si expusa la foarte probabile erori. De aceea, se utilizeaza asa-numitele mnemonici, cuvinte abreviate, de provenienta engleza, semnificand operatia ce se efectueaza, sursa si destinatia ei (unde este cazul). Ca un exemplu, instructiunea anterioara poate fi referita ca INC R3; (incrementeaza R3). Trebuie accentuat ca scrierea programelor cu aceste mnemonici, alcatuind ceea ce se numeste limbajul de asamblare al microprocesorului (si fiind specific fiecarui procesor in parte), permite elaborarea programelor "pe hartie". Fizic, procesorului i se va pregati in memorie succesiunea de coduri binare, corespunzatoare acestor mnemonici, conform setului de instructiuni, care vor corespunde programului in limbaj de asamblare. Operatia de trecere de la limbajele de asamblare la programul executabil poate fi facuta sau prin elaborarea de catre programator a codurilor corespunzatoare instructiunilor si introducerea lor (de exemplu) de la niste comutatoare, in memoria sistemului (programarea fiind practic efectuata in cod masina), sau prin executarea, la sistemele mai evoluate, a unui program special, numit asamblor. Acesta poate prelua textul, denumit text sursa, continand programul scris in limbaj de asamblare (de exemplu prin citirea de la un periferic a unui fisier), analizeaza aceste instructiuni, generand, in cazul corectitudinii lor, codul binar corespunzator operatiilor dorite. (Evident, trebuie date indicatii suplimentare, referitoare la adresa de memorie unde se va genera codul programului etc., probleme ce nu fac obiectul acestui paragraf). Asamblorul reprezinta o prima etapa in gradul de "evolutie" a limbajelor in care poate fi programat un microprocesor. El realizeaza o corespondenta "unu la unu", fiecare instructiune in limbaj de asamblare generand cod pentru o singura instructiune a microprocesorului. Totodata, limbajul de asamblare este propriu fiecarui tip de microprocesor. Exista limbaje de nivel inalt, care permit programarea microprocesorului cu instructiuni puternice (limbaj FORTRAN, PL/M, BASIC, PASCAL, C, C++, ADA, FORTH. etc.). Dispunand de programele specifice, numite compilatoare (specifice pentru fiecare limbaj), se pot genera, din texte sursa, scrise in aceste limbaje, coduri obiect pentru microprocesorul respectiv. Aceste programe vor necesita pentru a fi executate, sisteme de calcul, uzual asa numitele sisteme de dezvoltare, microcalculatoare de putere sporita, cu facilitati specifice in ceea ce priveste resursele sistemului (memorie, suporturi de memorie externa de tip disc, etc.).

MICROPROCESOARE - CONCEPTE GENERALE

3 - 57

Instructiunile grupei 1 au structura conform figurii 3.44b. Cele doua grupe de cate trei biti, DDD si SSS semnifica registrul destinatie, respectiv sursa, pentru efectuarea transferului. Transferul informatiei din registrul R3 (cod 011) in R6 (cod 110) va avea deci codul 1638. ({1} inseamna cod operatie de transfer, {6} cod registru destinatie, {3} cod registru sursa). Mnemonica corespunzatoare poate fi scrisa ca MOV R6,R3. Pentru operatiile aritmetico-logice, codul operatiei este dat in figura 3.44c. Aici, grupul XXX de trei biti indica operatia ce se efectueaza, iar SSS, registrul sursa, continand unul dintre operanzi. In mod implicit, celalalt operand este considerat a fi continut de catre acumulator. Totodata, rezultatul este memorat tot in acumulator (alterand operandul continut de catre acesta). Astfel, o instructiune ADD R4, va aduna la continutul acumulatorului, continutul registrului R4, rezultatul fiind plasat in acumulator. Instructiunile grupei a treia nu pot fi clasificate intr-o maniera la fel de clara ca pentru grupele anterioare. Totusi, o pondere speciala o au, in aceasta grupa, instructiunile de ramificare a programului. Acestea permit, dupa cum s-a mentionat, devierea executiei programului de la secventa normala de instructiuni, operatie necesara in anumite puncte de decizie (in functie de un anume rezultat, sau data de intrare, de exemplu, se va initia o anume actiune sau alta) sau, in mod neconditionat, in unele puncte din program. Ramificarea conditionata se bazeaza pe examinarea registrului de stare, care contine informatii referitoare la rezultatele ultimei operatii aritmetice sau logice efectuate in ALU. Dupa cum s-a mentionat, indicatorii de stare continuti in acest registru pot specifica: • rezultat nul (Z --- zero), sau nenul (NZ --- not zero); • a aparut depasire (sau imprumut) (C --- carry), sau nu (NC --- not carry); • rezultatul are un numar par de biti 1 (PE -- parity even), sau impar (PO -- parity odd); • rezultat pozitiv (P --- plus), sau negativ (M --- minus); etc. Ca exemple tipice de instructiuni de ramificare conditionate, vom mentiona instructiunile JUMP, CALL si RETURN (toate putand fi instructiuni conditionate sau nu). Instructiunea JUMP ("salt"), permite saltul programului la o noua adresa, in cazul indeplinirii unei conditii in registrul de stare. De exemplu, saltul la aparitia unui rezultat nul, simbolizat prin mnemonica JZ, urmata de adresa dorita la care se comuta programul. Daca indicatorul testat nu este setat, (de exemplu, nu a fost rezultat nul), se continua executia programului, cu instructiunea urmand celei de salt conditionat (nu se efectueaza saltul). Instructiunea CALL ("cheama") permite apelarea de subrutine. Acestea reprezinta zone de program (denumite si subprograme), care se vor executa de mai multe ori in decursul operarii sistemului. Aceste subprograme pot fi "chemate" ("apelate") din programul "principal", sau din alte subrutine, prin instructiuni de tipul CALL. Transferul executiei programului la adresa unde se gaseste subrutina poate fi deasemenea conditionat si se executa din acest punct de vedere ca si pentru instructiunile de salt. Ceea ce deosebeste acest transfer de instructiunile de salt, il reprezinta salvarea

BAZELE MICROPROCESOARELOR

3 - 58

continutului PC, din punctul de unde se face aplelul. Aceasta permite ca, la terminarea subrutinei apelate, prin executarea unei instructiuni de tip RETURN ("intoarcere"), sa se refaca in PC valoarea salvata la apelare. Se determina astfel continuarea programului apelant, de la instructiunea imediat urmatoare celei de apelare (CALL). Si instructiunea de RETURN poate fi conditionata. Salvarea (refacerea) continutului PC este facuta cu ajutorul registrului indicator de stiva (SP). La executarea unei instructiuni de salt la subrutina, microprocesorul va depune in memoria sistemului, la adresa indicata de SP, valoarea numaratorului de program, PC. Aceasta zona de memorie RAM, unde se depune valoarea PC la apelare de subrutine si unde se mai poate depune si continutul registrelor microprocesorului (prin instructiuni specifice de salvare a acestora, necesare la tratarea intreruperilor), se numeste stiva programului. Organizarea acesteia in memoria externa microprocesorului permite realizarea de stive oricat de mari. Dupa fiecare salvare in stiva, SP se modifica, continand adresa varfului noii stive (permitand salvari succesive, nealterand vechile valori din stiva). Aceasta permite executarea de apelari de subrutine, din alte subrutine, inlantuit. La executarea instructiunilor de RETURN, se aduce, de la adresa indicata de SP, (din varful stivei), valoarea PC care fusese salvata la apelare si se reactualizeaza SP, micsorand stiva corespunzator. O asemenea inlantuire a apelurilor de subrutine este prezentata in figura 3.45. Evident, este raspunderea programatorului de a respecta ordinea strict inversa celei de la apelare, in cazul unor inlantuiri de apeluri (ordine LIFO --- last in, first out --- ultimul intrat, primul iesit). Deasemenea, daca s-au salvat registre in stiva, ele trebuiesc refacute etc. Pentru stiva, se rezerva o anumita zona din memoria sistemului. Nu exista uzual o marime standard a stivei, limitarile fiind legate de disponibilul total de memorie, aflat la dispozitia programatorului pentru a-l aloca stivei. Principalul avantaj al utilizarii stivei este ca permite memorarea temporara a datelor fara complicatia de a specifica in mod explicit adresa cu care se opereaza (necesara la adresarile tipice ale memoriei - vezi modurile de adresare). Utilizatorul nu cunoaste si nici nu trebuie sa cunoasca adresa unde se memoreaza datele, operatiile desfasurandu-se indirect, prin utilizarea registrului indicator de stiva. Principala limitare a acestei modalitati de stocare a datelor este data de modul de acces la stiva, secvential. Detalii privind utilizarea stivei vor fi date ulterior, intr-un alt paragraf. In afara instructiunilor de ramificare a programului, mai exista operatii speciale, cu registrul indicator de stiva, operatii de intrare/iesire, operatii de control al microprocesorului etc., pentru fiecare tip de procesor in parte.

MICROPROCESOARE - CONCEPTE GENERALE

3 - 59

adresa instructiunememorie program

0A50 CALL SUBA

011A CALL SUBB

0100...

...

...

0200...

RETURNRETURN...

...

1

2

3

4

- salvare continut PC in stiva-executie subrutina SUBA (100H)

- salvare continut PC in stiva- executie subrutina SUBB (200H)

- refacere continut PC din stiva-continuare executie subrutina SUBA

- salvare continut PC in stiva-continuare executie program principal

SP

SPSP

SPSP

inainte de 1 1 2 3 4

0A51 0A51 0A51011B

Stiva(memorie date)

0A51

011B

Fig.3.45. Modul de utilizare a stivei la apelarea subrutinelor

Pentru a sesiza mai bine corelarea ansamblului de operatii ce se efectueaza pentru executarea unei instructiuni a microprocesorului, se prezinta, in figura 3.46, respectiv 3.47, in mod schematic, transferul de informatie si operatiile efectuate in fiecare perioada de ceas in parte, pentru doua instructiuni ale unui microprocesor de 8 biti (ZILOG 80). Astfel, figura 3.46 prezinta executia instructiunii ADD R de adunare la continutul acumulatorului, a continutului registrului R al microprocesorului. Se remarca executia instructiunii intr-un singur subciclu, de patru perioade de ceas. Primele trei perioade de ceas se folosesc pentru extragerea si decodificarea instructiunii, iar in al patrulea se executa operatia. Durata acestei instructiuni va fi deci de 4xTc. (Pentru un ceas de 2 MHz, instructiunea va dura deci 2 microsecunde). Instructiunea LDA adr (cel de-al doilea exemplu), implica incarcarea continutului acumulatorului cu continutul celulei de memorie de la adresa adr. Figura 3.47 prezinta desfasurarea acestei instructiuni, pentru care se vor efectua 4 accese la memorie (3 pentru citirea codului instructiunii - 1 cod operatie, 2 operanzii, adresa de unde se face citirea - adresare directa, si unul pentru citirea datei dorite, de la adresa adr). Se remarca aparitia a 4 subcicluri pentru executarea acestei instructiuni, durand 13 perioade de ceas (deci 6,5 microsecunde).

BAZELE MICROPROCESOARELOR

3 - 60

U A L

R I

Registru deinstructiuniunitate decomanda

Registru de adrese

Acc

R TR

Registrutemporar

Registrul R

Magistrala internaMagistrala de date

9 F 52

Magistralade adrese

Memorie program

P C>

1

ceas

Fig.3.46. Executia instructiunii ADD R. Registrul contor de program are valoarea 9F52H

(a)(Subciclul 1, T1) Se selecteaza celula de memorie program la adresa 9F52H (valoarea curenta a PC)

U A L

R I

Registru deinstructiuniunitate decomanda

Registru de adrese9 F 52

Acc

R TR

Registrutemporar

Registrul R

Magistralade adrese

+1

>ceas

1000 0010Magistrala de dateMagistrala interna

P C

Memorie program

1 2

Fig.3.46.b. (Subciclul 1, T2) Codul instructiunii (din celula de memorie selectata) pe magistrala de date; se incrementeaza PC

9F 52

ADD R : 1000 0010

9F 52

9F 53

ADD R: 1000,0010

MICROPROCESOARE - CONCEPTE GENERALE

3 - 61

U A L

R I

Registru deinstructiuniunitate decomanda

Registru de adrese9 F 52

Acc

R TR

Registrutemporar

Registrul R

Magistralade adrese

9 F 53>ceas

Magistrala de dateMagistrala interna

P C

Memorie program

1 2 3

Fig.3.46.c. (Subciclul 1, T3) Codul instructiunii citit pe magistrala de date, in registrul de instructiuni

ADD,R : 1000 0010

R I

Registru deinstructiuniunitate decomanda

9 F 52

Registrutemporar

Registrul R

Magistralade adrese

9 F 53>ceas

Magistrala de dateMagistrala interna

P C

Memorie program

1000 00101 2 3

Registru de adrese

cod operatie

4

Fig.3.46.d. (Subciclul 1, T4) Se decodifica si executa instructiunea; se aduna continutul registrului R la acumulator; rezultatul in acumulator

ADD R: 1000 0010

1000 0010

Acc

R RT

UAL

BAZELE MICROPROCESOARELOR

3 - 62

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de dateMagistrala interna

P C

cod operatie

Date : 1100 0010 :C2 8B2F

10A3

10A2

10A110A0

Adrese

Ad1 : 10001011 :8B

Ad2: 00101111 :2F

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

1

10A0

programMemorie

Memoriedate

Fig.3.47. Instructiunea de incarcare a acumulatorului de la adresa ADR = 8B2FH,. continuta in instructiune, PC are valoarea 10A0H. Subciclul 1 -- se

va citi si decodifica ciclul instructiunii: (a) T1. Se selecteaza celula de memorie program de la adresa 10A0H

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

10 A0

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

1

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

Date : 1100 0010 :C2

Ad1 : 10001011 :8B

Ad2: 00101111 :2F

2

+1

Fig.3.47.b. T2. Codul instructiunii pe magistrala de date; se incrementeaza PC

LDA : 00111010 : 3A

10 A0

10 A0

LDA : 00111010 : 3A

LDA : 00111010 : 3A

10 A1

MICROPROCESOARE - CONCEPTE GENERALE

3 - 63

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

10 A0

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

Ad1 : 10001011 :8B

Ad2: 00101111 :2F

1 2

00111010

Date : 1100 0010 :C2

10 A1

3

Fig.3.47.c. T3. Codul instructiunii citit de pe magistrala de date in registrul de instructiuni

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

10 A0

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

:3ALDA : 00111010Ad1 : 10001011 :8B

Ad2: 00101111 :2F

00111010

Date : 1100 0010 :C2

10 A11 2 3 4

Fig.3.47.d. T4. Se decodifica codul instructiunii

LDA : 00111010 : 3A

00111010

BAZELE MICROPROCESOARELOR

3 - 64

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de dateMagistrala interna

P C

cod operatie

8B2F

10A3

10A2

10A110A0Adrese

:3A

Ad2: 00101111 :2F

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

1

programMemorie

Memoriedate

10A1

Date : 1100 0010 :C2

LDA : 00111010

Subciclul 2 -- se va citi cel de-al doilea octet al instructiunii (data) Fig.3.47.e. T1. Se selecteaza celula de memorie progarm de la adresa 10A1H; celula

contine cei 8 biti superiori ai adresei ADR

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

1

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

:3ALDA : 00111010

Ad2: 00101111 :2F

2

+1

Date : 1100 0010 :C2

10 A1

Fig.3.47.f. T2. Valoarea octetului cel mai semnificativ al adresei ADR pe magistrala de date; se incrementeaza PC

Ad1: 10001011 : 8B

10 A1

10 A1

Ad1 : 10001011 : 8B

Ad1 : 10001011 : 8B

10 A2

MICROPROCESOARE - CONCEPTE GENERALE

3 - 65

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

Ad2

Registru temp.de adrese

Registru de adrese

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

:3ALDA : 00111010

Ad2: 00101111 :2F

1 2

Ad1 : 10001011 :8B

Date : 1100 0010 :C2

10 A1

10 A2

3

Fig.3.47.g. T3. Memorarea octetului cel mai semnificativ al adresei ADR in partea superioara a registrului de adrese

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de dateMagistrala interna

P C

cod operatie

8B2F

10A3

10A2

10A110A0Adrese

LDA : 00111010 :3A

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

1

programMemorie

Memoriedate

Ad2 : 10001011 :8B

Date : 1100 0010 :C2

10A2

8B

Subciclul 3 -- se va citi al treilea octet al instructiunii (data) Fig.3.47.h. T1. Se selecteaza celula de memorie program de la adresa 10A2H (PC)

celula contine cei 8 biti inferiori ce compun adresa ADR

10001011 8B

8B Ad1

Ad2 : 00101111 : 2F

10 A2

10 A2

BAZELE MICROPROCESOARELOR

3 - 66

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

1

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

:3ALDA : 00111010

2

+1

Ad1 : 10001011 :8B

Date : 1100 0010 :C2

10 A2

8B

Fig.3.47.i. T2. Valoarea octetului cel mai putin semnificativ al adresei ADR pe magistra- la de date; se incrementeaza PC

U A L R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

Ad1

Registru temp.de adrese

Registru de adrese

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

:3ALDA : 00111010

Ad2: 00101111 :2F

1 2

Ad1 : 10001011 :8B

Date : 1100 0010 :C2

10 A2

10 A3

8B

3

Fig.3.47.j. T3. Memorarea octetului cel mai putin semnificativ al adresei ADR in partea superioara a registrului de adrese

Ad2 : 00101111 : 2F

Ad2 : 00101111 : 2F

10 A3

Ad2 : 00101111 : 2F

2F Ad2

MICROPROCESOARE - CONCEPTE GENERALE

3 - 67

U A L R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

Ad1 Ad2

Registru temp.de adrese

Registru de adrese

programMemorie

Memoriedate

8B2F

10A3

10A2

10A110A0Adrese

:3ALDA : 00111010

Ad2: 00101111 :2FAd1 : 10001011 :8B

10 A3

8B2F

1

Subciclul 4 -- se va executa efectiv instructiunea: se incarca acumulatorul cu valoarea de la adresa ADR

Fig.3.47.k. T1. Se selecteaza celula de memorie de date de la adresa 8B2FH aflata in registrul tampon de adrese

U A L

R I

Registru deinstructiuniunitate decomanda

Acc

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

Ad1 Ad2

Registru temp.de adrese

Registrude adrese

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

:3ALDA : 00111010Ad1 : 10001011 :8B

Ad2: 00101111 :2F

10 A31 2

Fig.3.47.l. T2. Data din celula selectata pe magistrala de date

Date: 11000010 : C2

8B 2F

8B 2F

Date: 11000010 : C2

Date: 11000010 : C2

BAZELE MICROPROCESOARELOR

3 - 68

U A L

R I

Registru deinstructiuniunitate decomanda

R T

Registrutemporar

>ceas

Magistrala de date

Magistrala interna

P C

Ad1 Ad2

Registru temp.de adrese

Registru de adrese

programMemorie

Memoriedate 8B2F

10A3

10A2

10A110A0Adrese

:3ALDA : 00111010Ad1 : 10001011 :8B

Ad2: 00101111 :2F

10 A31 2 3

Fig.3.47.m. T3. Data din celula adresata este memorata in acumulator

3.5.4 Utilizarea stivei programului Desi s-au facut si in paragrafele precedente referiri si s-au dat unele explicatii referitor la definirea si modul principial de utilizare a stivei, data fiind importanta conceptului, se vor da in prezentul paragraf detalii suplimentare in acest sens. In mod implicit, nu exista posibilitatea, in cursul executiei programului, de a se "rememora" adresa unei anumite instructiuni, dupa executia acesteia. Astfel, la apelarea unei subrutine, programatorul trbuie sa indice la sfarsitul acesteia unde trebuie sa se "reintoarca" registrul indicator de program, pentru a continua executia normala a acestuia. Deoarece o subrutina poate fi apelata din puncte diferite ale programului, nu se poate face acest lucru prin revenire intr-un punct fix al programului (a carui adresa ar putea fi, eventual, indicata la revenirea din subrutina). Din cauza structurii explicite a instructiunilor, nu exista aceasta posibilitate in programele scrise in limbajul de asamblare; de aceea, programatorul trebuie sa salveze adresa de revenire, ori de cate ori executia programului se transfera dintr-un punct (unde este memorat secvential), in alta zona a memoriei, unde este memorata alta parte a programului. Conceptul de stiva, introdus in paragrafele precedente, va fi utilizat pentru a explica elementele esentiale legate de operarea cu stiva, particularizat pentru apelarea subrutinelor (CALL), si revenirea din subrutine (RETURN). Dupa cum s-a mentionat, stiva este organizata pe sistemul FIFO, cu registrul indicator de stiva continand adresa urmatoarei locatii libere din stiva. Se utilizeaza doi termeni legat de operatiile cu

Date: 11000010 : C2

Date : 11000010 : C2

C2

MICROPROCESOARE - CONCEPTE GENERALE

3 - 69

stiva: salvarea in stiva (push), si refacerea din stiva (pop). Primul implica transferarea unei date in varful stivei, iar cel de-al doilea, extragerea unei date din varful stivei. Data respectiva poate reprezenta in sens general atat o adresa, necesara la revenirea dintr-o subrutina, cat si argumente (valori, sau continutul unora dintre registrele microprocesorului) transmise prin stiva, subrutinei, sau returnate programului apelant. Figura 3.48 prezinta acest mecanism de utilizare a stivei in cele doua scopuri.

program principal

PUSH AX

PUSH BX

PUSH CX

CALL SUB1

urmat. instr.PC1 CALL SUB2

urmat. instr.

subrutina 1

...

...

...

...

RETURN

SUB1

PC2

adresa

adresa

subrutina 2

RETURN

SUB2adresa

cresterea continutuluistivei

adresa de inceput a stivei

AX

BX

CX

PC1PC2

Fig. 3.48. Salvarea continutului registrelor si a adreselor de revenire in stiva

Programatorul trebuie sa tina seama de urmatoarele elemente relativ la utilizarea stivei: - stiva reprezinta o zona de memorie, operand in modul LIFO; - orice cuvant de date salvat in stiva, va trebui extras de acolo la un moment dat in cursul executiei programului; - o consecinta a modului LIFO de lucru cu stiva este ca informatia poate fi refacuta din stiva in ordine inversata fata de cea de la salvarea in stiva;

BAZELE MICROPROCESOARELOR

3 - 70

- cresterea stivei este corelata cu scaderea continutului registrului indicator de stiva; astfel, cand stiva este goala, SP are valoarea initiala (maxima); cand stiva este plina, SP are o valoare minima. Stiva creste catre baza (valorile mici) ale memoriei sistemului. Apelarea succesiva a unei subrutine din alta subrutina, inlantuit, este posibila in principiu fara alte restrictii decat memoria aflata la dispozitie, alocata stivei. Mai mult, este posibila chiar apelarea unei subrutine de catre ea insasi (apel recursiv), utilizata uzual corelat cu testarea unui indicator care asigura iesirea din bucla recursiva. Subrutinele si stiva Exista trei operatii esentiale, asociate executiei corecte a unei subrutine: - salvarea registrului indicator de program (PC), reprezentand adresa instructiunii imediat urmatoare celei de apelare a subrutinei (prima instructiune de dupa cea de CALL); dupa executia subrutinei, executia programului se reia de la aceasta instructiune; - executarea subrutinei apelate; - revenirea la adresa memorata la aplelare, si continuarea executiei din punctul respectiv. Aceste operatii se efectueaza utilizand cele doua operatii complementare, de apelare a subrutinei (CALL) si, respectiv, de revenire din subrutina (RETURN). Trebuie remarcat ca la orice operatie de salvare in stiva, dupa salvarea valorii respective (PC la apelarea unei subrutine), continutul registrului indicator de stiva SP este actualizat automat (decrementat), permitand o eventuala salvare ulterioara, de exemplu in cazul unui alt apel, inlantuit, al unei alte subrutine. La orice operatie de revenire din subrutina, se actualizeaza SP, (prin incrementare), si doar apoi se reface continutul PC, cu valoarea care se citeste din stiva, reprezentand chiar valoarea salvata la apelarea subrutinei. Transmiterea parametrilor La apelarea sau revenirea dintr-o subrutina, este necesara comunicarea de date intre subrutine, in afara de salvarea adresei de revenire. Acest proces de comunicare intre subrutine este cunoscut sub numele de transmitere a parametrilor (argumente, sau variabile). Se pot evidentia trei metode de baza in transmiterea parametrilor intre subrutine, ce vor fi descrise in continuare. Prima si cea mai simpla metoda de transmitere a parametrilor este de a asocia fiecarei subrutine un set de locatii de memorie, unde programatorul memoreaza date necesar a fi prelucrate de o alta subrutina, apelata de prima. Aceste locatii de memorie pot contine atat date cat si adrese ale unor date (variabile). Principala limitare a acestei metode (simpla, in esenta), este blocarea unor locatii de memorie care vor fi utilizate doar pentru apelarea rutinei respective.

MICROPROCESOARE - CONCEPTE GENERALE

3 - 71

A doua metoda de transmitere a parametrilor se bazeaza pe utilizarea registrelor de uz general. Inainte de a apela o subrutina, se incarca aceste registre cu argumentele ce trebuiesc transferate subrutinei. Problemele asociate cu aceasta metoda (deasemenea simpla), sunt: necesitatea de a salva continutul registrelor, utilizate la apelarea rutinei, pentru reutilizarea continutului lor dupa revenirea din subrutina; limitarea introdusa de numarul relativ redus al registrelor de uz general. A treia metoda de comunicatie este o forma speciala a celei anterioare, si se bazeaza pe utilizarea stivei pentru memorarea temporara a datelor ce trebuiesc transferate subrutinei. In acest scop, majoritatea microprocesoarelor au in setul de instructiuni operatii de transfer in/din stiva a continutului registrelor de uz general (PUSH, respectiv POP, la microprocesorul 8086), care permit salvarea/refacerea explicita in/din stiva, la executia instructiunilor respective, a registrelor procesorului. Argumentele ce trebuiesc transmise subrutinei pot fi astfel salvate in stiva, apoi se face apelul subrutinei; la intrarea in subrutina, se fac refaceri din stiva, citindu-se aceste valori, ce pot astfel fi utilizate in cursul executiei subrutinei. Operatii de acest gen necesita, dupa cum s-a mai mentionat, o mare atentie din partea programatorului, pentru a nu afecta procesul de revenire din subrutina (regasirea continutului PC salvat la apelarea rutinei, in momentul revenirii la programul apelant). Registrul indicator de stiva trebuie initializat la lansarea programului, cu adresa de inceput a stivei. Uzual, incarcarea stivei se face de la adrese mari spre cele mici, deci la start, continutul registrului SP are o valoare uzual reprezentand limita superioara a memoriei de date. Programului si variabilelor programului li se aloca, tot uzual, locatiile inferioare ale memoriei de date. Pe cand aceste locatii sunt atribuite si fixate pe tot parcursul rularii programului (deci ocupa permanent o zona din memorie), stiva se modifica in mod dinamic, dupa cum s-a mai precizat. Principala problema in timpul utilizarii stivei este legata de cresterea acesteia la dimensiuni prea mari, conducand la suprapunerea acesteia peste zona de date sau de cod de program. Daca se ajunge la o asemenea situatie, (posibila in principiu, deoarece evolutia stivei poate scapa de sub estimarea programatorului), efectele pot fi catastrofale pentru executia programului, complet imprevizibile (de exemplu, daca stiva patrunde in zona de cod de program, acesta va fi alterat, prin inscrierea de date in stiva; daca programul ajunge cu executia - contorul de program - in zona respectiva, se citeste data salvata in stiva, ca un cod de program, se decodifica si, in functie de "codul" pe care il reprezinta - daca exista codul respectiv in setul de instructiuni - se "executa". Evident, programul este complet alterat. Problema este dificil de depanat, deoarece este foarte greu de detectat cauza unui asemenea "defect" de program (care, ca simptome, se poate manifesta similar si in cazul unor defecte ale hardware-ului - memorii defecte, de exemplu). Se poate ajunge la executarea "pas cu pas" a programului, si examinarea continutului memoriei program, pe parcursul executiei programului. O masura necesara este de a implementa o stiva cat mai mare cu putinta, avand o rezerva cat mai mare de memorie. 3.5.5 Limbajul de asamblare Limbajul de asamblare utilizeaza, dupa cum s-a mentionat, mnemonici reprezentand prescurtari (abrevieri) ale denumirilor - semnificatiilor - instructiunilor unui anumit tip de microprocesor. Faptul

BAZELE MICROPROCESOARELOR

3 - 72

ca se asociaza fiecarei instructiuni a microprocesorului cate o mnemonica, face ca programarea in limbaj de asamblare sa reprezinte, dupa cum deasemenea s-a precizat, o programare in limbaj de nivel scazut. Aceasta se datoreaza faptului ca fiecare microprocesor are structura sa specifica (arhitectura, modalitati de interfatare si moduri de adresare distincte), si corespunzator, seturile de instructiuni ale diferitelor tipuri de microprocesoare difera intre ele. Astfel, programatorul care scrie programe in limbaj de asamblare trebuie sa stapaneasca foarte bine atat elementele legate de hardware-ul cat si de software-ul microprocesorului respectiv. Pe de alta parte insa, programatorul ce utilizeaza limbajul de asamblare are la indemana un instrument de lucru foarte puternic, in momentul in care il stapaneste, deoarece doar prin utilizarea programarii in limbaj de asamblare se poate avea un control absolut al procesorului. Principalul dezavantaj al utilizarii limbajului de asamblare este ca scrierea, depanarea si modificarea acestor programe este mult mai dificila, si cere o foarte buna cunoastere a microprocesorului si intelegere a functionarii sale. O experienta bogata in acest sens este necesara pentru a implementa programe bune, eficiente. Uzual, la ora actuala, la implementarea aplicatiilor industriale, utilizarea limbajului de asamblare se face concomitent cu utilizarea unui limbaj de nivel inalt. Astfel, partile critice ale programului (de obicei cele asociate operatiilor de timp real ale sistemului), necesitand o maxima eficientizare, mai ales din punctul de vedere al vitezei de executie, se scriu in limbaj de asamblare. Restul programului, care contine parti ce se pot executa cu prioritati mai scazute, nu neaparat in timp real, poate fi implementat prin utilizarea unor limbaje de nivel inalt. Se poate astfel optimiza la miximum ca raport performanta/cost de producere, procesul de implementare a aplicatiei respective. Pentru programul (partea de program) scris in limbaj de asamblare, faptul ca este necesara implementarea elementara a programului, instructiune cu instructiune, face dificila scrierea si testarea acestuia (prin defalcarea operatiilor sistemului in operatii elementare, implementate cu cate o instructiune de program). Pe de alta parte, apare facilitatea de utilizare, gestionare a tuturor resurselor procesorului (registre, memorie, etc.), ceea ce poate conduce la optimizarea la maxim a programului. Cateva reguli de baza la scrierea programelor in limbaj de asamblare sunt urmatoarele: - programatorul raspunde de completa gestionare a tuturor resurselor sistemului; zonele de memorie ocupate de catre program, cele alocate variabilelor, cat si cele alocate pentru stiva, trebuie definite explicit si respectate pe tot parcursul implementarii programului. Similar, adresarea interfetelor de intrare/iesire trebuie facuta corect, coreland pentru fiecare port in parte semnificatia cuvintelor de date, cu actiunile efectuate la adresarea acestora. O selectie gresita (adresare incorecta, sau a unei celule de memorie sau port inexistent), sau utilizarea incorecta a semnificatiei datelor, poate conduce la blocarea sau functionarea defectuoasa a sistemului; - in program trebuiesc specificate adresele pentru fiecare variabila, locatie de memorie sau port accesate la un moment dat;

MICROPROCESOARE - CONCEPTE GENERALE

3 - 73

- trebuiesc anticipate si evitate (prin modul de realizare a programului, sau prin implementarea de teste corespunzatoare) situatiile de aparitie a operatiilor cu rezultate imposibile (depasiri - overflow sau underflow); - programatorul trebuie sa asigure gestiunea valorilor (date), necesare la executia programului. Astfel, trebuie asigurata salvarea datelor (continutul registrelor de uz general, a celulelor de memorie cu utilizare multipla), in diferitele parti ale programului care utilizeaza aceleasi resurse ale sistemului; - manipularea datelor la nivel intern se va face in cod binar, ceea ce va implica necesitatea unor conversii de la/la nivelul utilizator (valori zecimale, hexazecimale, caractere), la nivelul masina (binar); - depanarea programelor se va face mai dificil, uzual utilizand metode speciale (de genul executiei pas cu pas a programului, si examinarii registrelor, continutului memoriei, etc.); - in cazul unei functionari defectuoase a sistemului, este dificila localizarea defectului, care poate proveni din defecte pe partea hardware, sau din partea software, sau din combinatii ale celor doua componente, ceea ce necesita tehnici speciale, si o experienta bogata in testarea sistemului; uzual, prin programe simple se testeaza integritatea si completa functionare a hardware-ului, apoi se trece la implementarea unor programe complexe. Elaborarea unui program in limbaj de asamblare nu este suficienta, dupa cum s-a mentionat, pentru obtinerea si implementarea formei finale a programului, in cod obiect, in memoria sistemului, si executia acestuia. Este necesar sa se dispuna de programul numit asamblor, care poate prelua programul sursa, scris in limbaj de asamblare (mnemonici), si poate genera codul obiect corespunzator fiecarei instructiuni. Scrise intr-o forma simbolica, asambloarele au o seama de facilitati suplimentare: comenzi, directive, care faciliteaza scrierea programelor; utilizarea de denumiri simbolice pentru variabilele programului; utilizarea etichetelor formale (in locul utilizarii adreselor efective ale variabilelor, subrutinelor, etc.); conversii automate din diverse baze de numarare in binar; posibilitatea definirii macroinstructiunilor ce permit simplificarea scrierii programului; etc. Totodata, programul asamblor verifica corectitudinea sintactica a programului scris in limbaj de asamblare, verifica corectitudinea adresarilor variabilelor din memorie, unicitatea lor, etc. Programul asamblor poate fi rezident in memoria PROM a sistemului microprocesor, sau poate fi incarcat in memorie si apoi executat. Pentru scrierea programelor sursa, continand programul in limbaj de asamblare, se utilizeaza deasemenea alte programe speciale, numite editoare de text, care permit scrierea efectiva a acestor programe, si memorarea acestora, intr-o zona a memoriei sistemului sau, la sistemele mai evoluate, pe un suport de memorie externa de tipul discului flexibil, hard-discului, etc. In fine, in etapa finala a elaborarii unui program, si mai ales in cazul necesitatii generarii programului executabil in forma sa finala, din mai multe parti de program, elaborate separat, (scrise eventual in

BAZELE MICROPROCESOARELOR

3 - 74

limbaje diferite, si compilate deasemenea individual, fiecare prin executia programului asamblor sau a compilatorului corespunzator), va fi executat un alt program specific, care realizeaza legarea acestor componente ale programului, numit linker (link = legatura). Linker-ul va face totodata alocarea efectiva a adreselor si resurselor sistemului, generand valorile corecte ale acestora in codul obiect final ce se va implementa si executa. In etapa implementarii si testarii unui program, este deosebit de util un program de depanare (debug), prezent deasemenea la unele sisteme microprocesor. Toate aceste programe necesare pentru a dezvolta, implementa si testa o aplicatie pe un sistem microprocesor, vor necesita ca, in etapa de creare a unei aplicatii, utilizatorul sa aiba la dispozitie un microcalculator de putere relativ ridicata, denumit sistem de dezvoltare. Pe aceste sisteme, programele se incarca in memoria RAM a sistemului, si pot fi cu usurinta testate, modificate, etc. De-abia dupa testarea completa, programele pot fi memorate definitiv in memorii de tip PROM, si implementate pe sistemele ce se vor utiliza in aplicatia finala, care eventual sunt dotate cu resurse mai reduse (mai putina memorie, periferice, etc.). Din cele prezentate, reiese clar necesitatea utilizarii unei anumite strategii in elaborarea programelor pentru sistemele microprocesor. 3.5.6 Metodologia elaborarii programelor Pasul important ce poate fi facut odata cu stapanirea setului de instructiuni al microprocesorului este elaborarea de programe, pentru a determina, prin lansarea lor in executie, implementarea aplicatiilor dorite pe sistemul microprocesor. Programatorul trebuie sa elaboreze un program corect din toate punctele de vedere, nici o eroare neputand fi acceptata. De aceea, in general, strategia elaborarii unui program de la punerea problemei, pana la utilizarea lui, va trebui sa treaca prin urmatoarele faze: (1) analiza; (2) organizare; (3) codificare; (4) testare; (5) elaborarea documentatiei aferente programului. In faza de analiza se contureaza cu claritate cerintele programului, se elaboreaza expresiile matematice ce se vor utiliza. Un program bine elaborat se va ghida dupa un algoritm, care prevede si indica ce trebuie sa faca programul, in oricare dintre situatiile posibile ce apar in cursul rezolvarii problemei propuse. Astfel, algoritmul implica cel putin indicatii asupra actiunilor de urmat, intr-un numar finit de pasi, pentru o problema data. (Ca un exemplu clasic, etapele necesare pentru prepararea unei retete reprezinta un algoritm). Strans legata de faza de analiza este faza de organizare. Algoritmul generat anterior este organizat in operatiile necesare pentru rezolvarea problemei. Este etapa in care se elaboreaza asa numitele scheme logice (diagrame ale algoritmului, utilizand niste simboluri standard, desemnand diversele actiuni posibile --- vezi fig.3.49).

MICROPROCESOARE - CONCEPTE GENERALE

3 - 75

De modul de elaborare optima a algoritmului si a schemei logice, ca organizare si eliminare a portiunilor redundante, depinde obtinerea unui program cat mai eficient (rapid si ocupand memorie cat mai mica). Nu este absolut necesara, pana in acest punct, cunoasterea setului de instructiuni. Totusi, pentru o utilizare cat mai eficace a posibilitatilor microprocesorului, cunoasterea elementelor de hardware si software specifice acestuia este de dorit. Faza de codificare, care urmeaza, reprezinta momentul trecerii la elaborarea codului programului. Aici se utilizeaza setul de instructiuni. Pe baza lui, se scriu instructiunile ce vor genera actiuni ale microprocesorului, corespunzatoare algoritmului si schemei logice elaborate.

Decizie

Operatieiesire

Operatieintrare

calculeoperatii

Start sau Stop

conector

Fig.3.49. Simboluri tipice utilizate la alcatuirea schemelor logice

Dupa codificare, programul este mai intai testat prin comparare cu schema logica, verificand corectitudinea fiecarei instructiuni. Apoi, programul este introdus in memoria microcalculatorului (in cod masina), trecandu-se la executia lui. Este etapa in care se localizeaza si lamuresc diversele erori ce au putut aparea la una dintre fazele trecute. Totodata trebuie remarcat faptul ca, adesea, aceste erori vor implica revenirea si modificarea unor parti din algoritm si/sau schema logica, si/sau codul elaborat. Programul va trebui executat de mai multe ori, pana la obtinerea variantei corecte si definitive. In acest ultim punct, un pas deosebit de important este reprezentat de faza de documentare. Toate informatiile referitoare la etapele anterioare, de la punerea problemei, elaborarea algoritmului si a schemei logice (eventual diversele versiuni succesive, indicand evolutia programului), codul programului (cu comentarii suficiente pentru a se corela cu schema logica), eventuale esantioane de date de intrare/iesire, daca este cazul, trebuie sistematizate si incluse in documentatia aferenta programului respectiv. Sensurile majore ale acestei faze sunt reprezentate atat de necesitatea de a putea rememora cu usurinta elaborarea programului (o succesiune de instructiuni necomentate devine, dupa cateva zile de la scriere, foarte greu de analizat, chiar de catre cel care a elaborat-o), cat si de posibilitatea utilizarii ulterioare a experientei castigate la scrierea programului respectiv, pentru eventuale modificari ale acestuia, sau la elaborarea unor programe noi.

BAZELE MICROPROCESOARELOR

3 - 76

, programarea microprocesoarelor reprezinta o problema serioasa, necesitand

o buna pregatire si experienta, castigate prin scrierea de programe cu grad de dificultate crescut, corelata cu posibilitatea testarii acestora pe viu (pe un sistem microprocesor), ajutand la identificarea si eliminarea erorilor inerente ce apar. Ea se bazeaza pe cunoasterea, cel putin pana la un anumit nivel de profunzime, a arhitecturii de baza a sistemului, a setului de instructiuni al microprocesorului, a posibilitatilor si a metodelor de interfatare cu echipamente de intrare/iesire, cat si pe aplicarea unei anumite metodologii de programare. Aceste aspecte vor fi reluate in capitolele urmatoare, insotite de exemple corespunzatoare.

3.6 ELEMENTE DE INTRARE/IESIRE ALE SISTEMELOR MICROPROCESOR Sistemul microprocesor trebuie sa interactioneze cu lumea inconjuratoare. Este necesara atat primirea de informatii, din afara acestuia, cat si, pe baza calculelor efectuate, furnizarea de informatii, comenzi etc., spre exterior. Desi unitatea centrala (CPU) poate efectua multiple operatii interne, este necesara comunicatia acesteia cu exteriorul, fara de care functionalitatea sistemului ar fi practic inexistenta. Deoarece singura cale de comunicatie dintre procesor si exterior este reprezentata de magistrala de date a sistemului, (utilizand totodata magistralele de adrese si control), este necesar sa se utilizeze circuite speciale care sa converteasca informatiile diverse, de la o gama foarte larga de echipamente si componente de intrare si iesire, la semnale compatibile cu cele de pe magistralele sistemului microprocesor. Aceste circuite, care implementeaza o functie de compatibilizare, se numesc module de interfata (sau module de intrare-iesire). Astfel, comunicatia cu unitatea centrala reprezinta transferul datelor prin aceste interfete, realizata intr-un mod selectiv si controlat uzual (dar nu exclusiv - vezi tehnicile DMA), de catre microprocesor. Conventiile utilizate pentru a implementa aceasta comunicatie, incluzand temporizarile semnalelor, controlul procesului de transfer de date, modul de reprezentare (codificare) a datelor, alcatuiesc asa-numitul protocol al comunicatiei. Functia de baza a modulelor de interfata va fi aceea de a converti semnalele de pe magistralele CPU pentru seturile de porturi de intrare sau iesire. Un port reprezinta astfel o colectie de componente ale sistemului la care se pot conecta echipamente externe (periferice). Dupa cum s-a precizat si in paragrafele precedente, gama arhitecturilor si a implementarilor diverselor sisteme microprocesor este extrem de larga, fara o standardizare a functiilor si/sau semnalelor magistralelor acestora. Pe de alta parte, aceste sisteme diverse vor trebui sa interactioneze cu gama, deasemenea larga si nu neaparat unitara, a echipamentelor periferice, utilizand o paleta importanta de semnale, viteze de lucru si protocoale de comunicatie. Compatibilitatea intre operatiile interne ale procesorului si aceste semnale externe se va asigura de catre o mare varietate de tipuri de interfete. Uzual, firmele producatoare de microprocesoare vor asigura si circuitele specializate, compatibile cu tipurile de microprocesoare produse de catre acestia, pentru a se implementa diversele interfete specializate.

Concluzionand

MICROPROCESOARE - CONCEPTE GENERALE

3 - 77

Astfel, comunicatia intre microprocesor si echipamentele externe are loc in doua etape succesive: prima, in care transferul are loc intre CPU si interfata, si a doua , in care comunicatia are loc intre interfata si periferic. Uzual, primul stadiu se denumeste operatie de intrare-iesire, iar al doilea, operatie de transmisie a informatiilor (v.fig.3.50). In consecinta, interfetele de intrare/iesire reprezinta calea de legatura ce asigura transferul de date intre microprocesor si exteriorul lui. Exista numeroase posibilitati pentru realizarea acestor legaturi. In functie de configuratia sistemului si de cerintele aplicatiei, se pot utiliza structuri mai simple sau deosebit de complexe.

Memorie

Microprocesor

Interfata I/E Periferic

Memorie

Microprocesor

Interfata DMA Periferic

a

b Fig.3.50. Moduri de interfatare: (a) sub controlul microprocesorului; (b) prin acces direct la memorie

Tinand seama ca elementele de intrare asigura preluarea informatiei dintr-o forma accesibila omului (reprezentari --- caractere, litere, cifre, pana la imagini tv.), sau de la elemente diverse ale instalatiilor industriale (semnalizari, traductoare etc.), respectiv cele de iesire furnizeaza informatii utilizabile de catre operatorul uman (mesaje tiparite, semnalizari audio-vizuale, sinteza de voce), cat si pentru comanda, actionarea elementelor echipamentelor industriale, se poate aprecia gama deosebit de larga de tipuri si configuratii in care se vor prezenta atat interfetele de intrare/iesire, cat si perifericele sistemelor microprocesor. Semnale exterioare de o mare varietate a formelor de prezentare (analogice, numerice, de alta natura decat electrice), trebuie convertite la formele de informatie, limitate, acceptate de catre microprocesor. Conversii similare trebuie efectuate la iesirea spre exteriorul sistemului microprocesor. Trebuie adaptate deasemenea vitezele de lucru diferite ale perifericelor, respectiv ale microprocesorului. Uzual, acesta lucreaza mult mai rapid, putand efectua numeroase operatii, in timp ce, de exemplu, se preia un caracter de la o consola (prin apasarea unei clape a acesteia) si se pregateste intr-o forma adecvata citirii de catre microprocesor. De asemenea, exista si echipamente foarte rapide (discuri magnetice, de exemplu), care pot furniza/prelua informatii catre/de la memoria

BAZELE MICROPROCESOARELOR

3 - 78

sistemului, cu viteze mai mari decat cele ce pot fi obtinute daca transferul se efectueaza de catre microprocesor (sub comanda acestuia). In aceste cazuri, se utilizeaza asa-numitele tehnici de transfer al informatiei prin acces direct la memorie (DMA 1), pentru care accesul intre interfata si memoria sistemului se face sub controlul unui circuit specializat, fara controlul programului microprocesorului. Se vor adopta solutii hardware-software care sa asigure o performanta optima a sistemului. In functie de cerintele acestuia, de numarul de elemente pe care le supervizeaza microprocesorul, se vor adopta diverse tehnici de lucru. Exista trei moduri principale de lucru cu elementele de intrare/iesire, permitand controlul si sincronizarea transferului de date: (a) Operatii de intrare/iesire efectuate sub controlul programului; (b) Operatii de intrare/iesire prin intreruperi; (c) Operatii de intrare/iesire prin acces direct la memorie. Tipul de operatie I/E utilizata intr-o aplicatie va depinde de rata de transmitere a datelor, de intarzierea maxima cu care microprocesorul poate prelua/transmite datele din momentul disponibilitatii echipamentului care le vehiculeaza, de posibilitatea executarii, intercalat cu operatiile I/E, a altor operatii ale unitatii centrale. Din punctul de vedere al programarii microprocesorului pentru operatii de I/E, acestea se pot efectua fie prin executarea de instructiuni specifice de I/E, fie prin instructiuni proprii operarii cu elemente de memorie (v.par.urmator). In orice caz, pentru diferentierea intre diversele echipamente ale sistemului, acestea sunt selectate in mod unic, conform informatiei de pe magistralele de adrese si de control, in mod asemanator selectiei celulelor de memorie. Porturile sistemului vor prelua sau transmite informatia sub forma de cuvinte de date, de lungime specifica procesorului (8, 16 biti). Accesul la magistrala de date va fi facut tot prin circuite tampon. Astfel, tehnicile generale de adresare si selectie de cip ale porturilor vor fi similare celor de la memorii, cu unele particularitati specifice, care vor fi mentionate in paragrafele urmatoare. Ca o mentiune speciala, trebuie remarcat ca, spre deosebire de memorii, unde la o adresa se va gasi o singura celula de memorie, aceeasi si pentru operatiile de scriere si pentru cele de citire, la operatiile cu porturi, este permis, si se si intalnesc situatii in care o aceeasi adresa este utilizata pentru doua interfete diferite, una de intrare, si alta de iesire. Aceasta deoarece pot exista porturi doar de intrare, si altele doar de iesire, deci cu flux unic al datelor, doar de la sau doar spre microprocesor. In continuare se vor analiza cele trei tipuri de baza de organizare a transferurilor de date in operatiile de I/E ale microprocesorului. 3.6.1 Operatii I/E efectuate sub controlul programului 1DMA: Direct Memory Access --- acces direct la memorie.

MICROPROCESOARE - CONCEPTE GENERALE

3 - 79

Una dintre cele mai accesibile si utilizate metode de efectuare a operatiilor de I/E este sub controlul nemijlocit al programului microprocesor. Astfel, prin instructiuni specifice, care determina selectia porturilor de I/E ale sistemului, microprocesorul efectueaza operatii de transfer de date intre aceste interfete si CPU. Exista doua tipuri de baza (din punctul de vedere al semnificatiei), pentru informatia transmisa intre microprocesor si portul de intrare/iesire, si anume cuvintele de control si cuvintele de date (vezi fig. 3.51).

>

>

<

<

cuvinte de datedate de intrare

date de iesire

cuvinte de controlcuvinte de comanda

cuvinte de stare

Echipament

intrare / iesireMicroprocesor

Fig.3.51. Fluxul de informatie intre microprocesor si o interfata de I/E

Cuvintele de control sunt utilizate pentru sincronizarea operatiilor portului si ale microprocesorului, si setarea/testarea unor parametri, operatii necesare in vederea transmiterii cuvintelor de date. Folosite in operatii de scriere spre port, cuvintele de control sunt denumite cuvinte de comanda a portului si permit, prin afectarea pentru fiecare bit al cuvantului, a unei semnificatii unice, programarea portului (pentru porturile care pot fi programate). Astfel se pot initia unele operatii sau seta unii parametri (oprirea unui motor, modificarea ratei de transmisie a unor date, stergerea unui indicator de eroare etc.). Citirea cuvintelor de control, denumite in acest caz cuvinte de stare, permite, prin testarea prin program a bitilor cuvantului citit de la port, analizarea starii acestuia (daca are sau nu informatie disponibila, daca poate prelua alt cuvant de date, daca transferul s-a efectuat corect etc., in functie de posibilitatile si functiile portului) si luarea de decizii adecvate de catre microprocesor (in speta, se vor executa in mod corespunzator acele sectiuni din programul sistemului care trateaza situatia existenta). La efectuarea operatiilor de intrare/iesire sub controlul programului, se pot utiliza: (a) instructiuni specifice de I/E. In acest caz, microprocesorul este prevazut cu semnale pe magistrala de control, diferite pentru operatiile cu memoria, respectiv cu porturile. Se conecteaza atat memoria cat si porturile la magistralele de adrese si de date ale sistemului, dar se utilizeaza semnale de control distincte pentru cele doua categorii de componente ale sistemului. Figura 3.52 prezinta

BAZELE MICROPROCESOARELOR

3 - 80

modul de structurare a sistemului in acest caz. Utilizand instructiunile specifice de I/E, prin program, se genereaza la executia acestor instructiuni semnalele de control asociate, selectand porturile de I/E si efectuand transferul dorit al informatiilor.

Mag.adrese

Decodificare Memorie Interfata I/E

Periferic

Mag. date

selectiememorie

selectie port

operatie cu porturi

operatie cu memoria

Micro-

procesor

Mag.

control

Decodificare

Fig. 3.52. Utilizarea operatiilor specifice de I/E, distincte de cele cu memoria

Exista doua moduri principiale de implementare a acestui tip de operatii I/E: (a1) cate o instructiune unica pentru fiecare operatie de I/E mentionata, utilizand minimum o singura adresa pentru un port. In acest caz, exista patru instructiuni tipice:

(1) citire de date (citire cuvant de date); (2) scriere de date (scriere cuvant de date); (3) transmitere comanda (scriere cuvant de comanda); (4) citire stare (citire cuvant de stare). Acest tip de operatie cu porturile ar necesita un numar de minimum 2 semnale de control, pentru a diferentia, la o operatie cu acelasi port, sensul si tipul instructiunii executate la un moment dat. Figura 3.53 prezinta structura sistemului in acest caz. Metoda nu este utilizata in mod tipic, in sistemele microprocesor uzuale.

MICROPROCESOARE - CONCEPTE GENERALE

3 - 81

adrese

Periferic

Mag. date

selectie port

scriere comanda port

Micro-

procesor

Mag.control

Decodificare

Mag.

citire stare port

citire date port

scriere date port

Fig. 3.53. Utilizarea unei singure adrese de port, si a patru semnale de control I/E

(a2) doua instructiuni I/E, una pentru intrare, alta pentru iesire, atat pentru cuvintele de date, cat si pentru cele de control. Se vor utiliza in acest caz minimum doua adrese pentru un port, pentru a diferentia operatia ce se efectueaza, referitor la date sau control. Cele doua instructiuni tipice, ce se definesc in acest caz, vor fi: (1) citire informatie (cuvant de data sau de stare); (2) scriere informatie (cuvant de data sau de comanda). Pentru acest tip de operatie de I/E, este necesar minimum un semnal de control care sa diferentieze sensul transferului datelor (citire sau scriere), care corelat cu adresa de la / la care se face transferul, sa poata defini in mod unic operatia ce se executa. Metoda este una dintre cele mai intalnite tehnici de utilizare a porturilor de I/E. Figura 3.54 prezinta structura de principiu a sistemului in acest caz.

adrese

Periferic

Mag. date

selectie port

scriere port

Micro-

procesor

Mag.control

Decodificare

Mag.

citire port

controlselectie port

date

Fig. 3.54. Utilizarea a doua adrese I/E si a doua semnale de control

BAZELE MICROPROCESOARELOR

3 - 82

(b) nu se folosesc instructiuni separate de I/E. Se va adresa portul ca o celula de memorie. Se configureaza memorie in sistem, mai putina decat capacitatea maxima a acestuia. La adresele ramase libere se va asigura selectia portului respectiv. (Deci, la aparitia semnalelor de adresa corespunzatoare si a celor de control, proprii lucrului cu celula de memorie respectiva, se va selecta de fapt si se va vehicula informatie cu portul dorit)1. Desi memoria sistemului devine astfel mai mica, acesta este un impediment minor, compensat in primul rand de faptul ca paleta de posibilitati oferita de instructiunile de tip lucru cu memoria este mult mai larga. (Din punctul lui de vedere, microprocesorul va efectua operatii cu o celula de memorie, nu cu un port). Operatiile tipice pentru a efectua transferul datelor vor fi in acest caz: (1) incarcare data (citire cuvant de data sau stare); (2) memorare data (scriere cuvant de data sau comanda). Figura 3.55 prezinta structura de principiu a sistemului in acest caz.

Mag.adrese

Decodificare

Memorie Interfata I/E

Periferic

Mag. date

selectiememorie

selectie port

citire/scriere

Micro-

procesor

Mag.

control

Fig. 3.55. Utilizarea operatiilor de I/E, de tipul "memory mapped I/O"

O comparatie succinta a celor doua metode prezentate anterior poate evidentia elementele esentiale ale acestora, de care se tine seama la configurarea structurii sistemului microprocesor. Astfel, utilizarea instructiunilor si a semnalelor specifice de I/E, are avantajul unei mai bune organizari si clarificari a programului, cat si a configurarii schemei de selectie a memoriei si porturilor sistemului. Pe de alta parte, metoda "memory mapped I/O" permite utilizarea instructiunilor uzuale de lucru cu memoria, cu avantajele aferente (mult mai multe instructiuni aferente, moduri de adresare complexe, etc.); pe de alta parte insa, metoda implica complicatii in ceea ce priveste schemele de adresare si selectie a memoriei si interfetelor sistemului. In plus, o problema suplimentara in acest caz o reprezinta modul si metodologia necesar a fi utilizata la depanarea programului, fiind mai dificila diferentierea operatiilor cu memoria de cele cu porturi, de vreme ce instructiunile utilizate la aceste operatii coincid (doar adresele diferentiind cele doua tipuri de componente). 1 Metoda este desemnata cu termenul de "memory-mapped I/O" --- intrare/iesire mapata in memorie

MICROPROCESOARE - CONCEPTE GENERALE

3 - 83

Capacitatea de adresare a porturilor, pentru tipurile uzuale de microprocesoare, variaza de la 256 de porturi I/O (uzual la microprocesoarele de 8 biti), pana la 64k porturi de I/O sau mai mult. In cazul utilizarii porturilor organizate ca "memory mapped I/O", din totalul spatiului de memorie configurabil pentru microprocesorul respectiv se va decide combinatia memorie/porturi optima pentru aplicatia respectiva. Uzual, atat memoria cat si porturile sistemului se organizeaza in acest caz in zone compacte de adrese (blocuri) (pentru memorie acest lucru fiind, evident, absolut necesar). Modalitatile de utilizare in program a cuvantului de control sunt, in principal, date de o secventa de program, de genul: (a) se scrie cuvantul de comanda la port, pentru a cere transferul de cuvant de date; (b) se citeste cuvantul de stare de la port; (c) se verifica bitii de stare ce indica posibilitatea transferarii datelor; (d) se reiau pasii b-c, pana ce portul este gata de transfer; (e) se citeste (scrie) cuvantul de date. O astfel de secventa poate aparea pe parcursul programului principal al microprocesorului. Cu aceasta mentiune, figura 3.56.a prezinta implementarea secventei de executare a operatiilor de I/E in cadrul programului principal, utila in realizarea programelor simple; in figura 3.56.b se prezinta implementarea acestei secvente sub forma unei subrutine, apelata in cursul programului principal, in punctele in care se doreste transferul de informatie de la/la portul respectiv, sau doar se testeaza starea acestuia. Se evita astfel pierderea din timpul de lucru al procesorului. Problema este si mai delicata in cazul mai multor porturi. Utilizarea a cate unei astfel de subrutine pentru testarea starii nu este avantajoasa; se implementeaza solutii de genul celor din figura 3.56.c. Microprocesorul poate testa rapid starea mai multor porturi, evitand testarea separata a acestora. Totusi, pot aparea intarzieri considerabile intre disponibilitatea portului si preluarea/transmiterea datelor de la/la acesta. Totodata, programul principal trebuie sa apeleze, in puncte stabilite de catre programator, si deci doar cand este disponibil (neavand alte sarcini mai importante), aceste subrutine. O solutie mult mai avantajoasa, din punctul de vedere al timpului de raspuns la evenimente (cand este posibil transferul), care permite implementarea unor programe mai clar si corect elaborate, este oferita de catre efectuarea operatiilor I/E prin intreruperi. 3.6.2 Operatii de intrare/iesire efectuate prin intreruperi Operarea prin intreruperi este bazata pe utilizarea unor semnale de control specifice, lansate de la periferice, catre microprocesor, anuntand un eveniment semnificativ la nivelul acestora (date disponibile pentru a fi preluate, posibilitatea acceptarii de noi date de la procesor etc.).

BAZELE MICROPROCESOARELOR

3 - 84

Lucrul in intreruperi permite operarea aparent simultana a mai multor programe distincte ale microprocesorului. In principal, aceasta tehnica este aplicata pentru controlul si lucrul cu echipamentele periferice si pentru implementarea sistemelor ce opereaza in timp real (efectuand anumite operatii --- masuratori, calcule, comenzi), la intervale predeterminate de timp. Bazandu-se pe faptul ca, in general, procesorul are viteza de lucru net superioara perifericelor, el lucreaza cu fiecare doar la "cererea" acestuia, putand astfel sa serveasca mai multe dintre ele, la vitezele lor de lucru. Sistemul de intreruperi va permite acest mod de solutionare a problemei. Intr-o forma simplificata, aparitia unei intreruperi la procesor determina urmatoarele evenimente: •• terminarea instructiunii curente a microprocesorului; •• memorarea valorii contorului de program (PC) in stiva; •• incarcarea PC cu o adresa de program, predefinita; •• inhibarea intreruperilor si continuarea executiei de la noua adresa a PC.

MICROPROCESOARE - CONCEPTE GENERALE

3 - 85

(a)

program

principal

transferposibil

da

transfer date

prin I/E

continuareprogramprincipal

nu

verificare

stare

transferposibil

da

transfer date

prin I/E

nu

verificare

stare

subrutinaI/E

return

program

principal

(b)

program

principal

existadatedisp.

nu

da

existadatedisp.

transferposibilechip.1

transferposibilechip.2

ânu

etc.

transferdate

(echip.2)

transferdate(echip.1)

nu

da

return

subrutinaI/E

(c)

Fig.3.56 Operatii I/E controlate prin program

BAZELE MICROPROCESOARELOR

3 - 86

Dupa tratarea intreruperii (zona de program la care s-a sarit la intrerupere este scrisa special pentru evenimentul aparut), se executa o instructiune specifica de revenire in programul intrerupt (se reface PC din stiva), continuandu-se executia acestuia (printr-un proces asemanator celui intalnit la revenirea din subrutinele obisnuite, apelate prin program). Figura 3.57 prezinta un exemplu in acest sens.

vector de

intrerupere

recunoasterecerere deintrerupere memorare

adresaintrerupereadresa de

revenire

transfer

posibil

nu

da

transferdate I/E

refacere staremicroprocesor

salt la adresade revenire

salt fortat laprogramprincipal

verificarestare

subrutinatratare

intrerupere

Fig. 3.57. Operatii I/E controlate prin intreruperi

Inhibarea intreruperilor, la acceptarea cererii de intrerupere, evita tratarea unei noi intreruperi pana ce nu s-a rezolvat cea in curs de tratare. Uzual, sistemul permite existenta mai multor intreruperi, de la diverse echipamente. Exista diverse modalitati pentru a determina saltul la adresa subrutinei aferente intreruperii respective. Astfel, este posibila existenta mai multor pini distincti ai procesorului, fiecare corespunzator unei anumite intreruperi. Aparitia pe unul dintre acestia a unui semnal activ va implica saltul programului curent, la o adresa fixa, cunoscuta de catre programator, si unde a fost plasata subrutina de tratare a intreruperii respective. In cazul existentei unei singure linii de intrerupere la microprocesor, exista doua moduri principale de recunoastere a sursei care a generat intreruperea: (a) Scanarea echipamentelor (polling). Saltul in subrutina de tratare a intreruperii este la adresa fixa. Aici se testeaza cuvantul de stare al fiecarui echipament de I/E, pentru a se determina, prin program, care echipament de I/E a generat intreruperea. Figura 3.58 prezinta aceasta tehnica, ce permite deci recunoasterea software a sursei de intrerupere. (b) Vectori de intrerupere. In aceste structuri, in momentul in care microprocesorul este disponibil pentru acceptarea intreruperii, el confirma acest accept, setand un semnal catre echipamentele ce solicita intreruperea. Primind acceptarea, acestea vor genera pe magistrala de date, un cod de

MICROPROCESOARE - CONCEPTE GENERALE

3 - 87

instructiune de apelare de subrutina, cod generat de catre logica de intrerupere (uzual, un controler de intrerupere --- circuit specializat pentru arbitrarea si generarea intreruperilor). Acest cod contine cate o adresa pentru fiecare echipament in parte. In general, aceste adrese sunt localizate secvential in memoria program si formeaza asa-numitul vector de intrerupere al sistemului. (De exemplu, vor fi plasate in memorie, din 8 in 8 celule de memorie). Evident, cele 8 celule nu permit, de regula, tratarea corespunzatoare a intreruperii. De aceea, programatorul va plasa aici doar o instructiune de salt, catre adresa unde se gaseste subrutina corespunzatoare de tratare a intreruperii). O problema importanta, la tratarea intreruperilor, este reprezentata de prioritatea cu care se executa acestea. Este posibila aparitia simultana a mai multor intreruperi, sau aparitia unei intreruperi ce trebuie deservita, chiar in timp ce se deservea o intrerupere mai putin urgenta. Inhibarea, pur si simplu, a intreruperilor elimina aceasta posibilitate, ceea ce poate sa nu ofere performante satisfacatoare sistemului. De aceea, acordarea unei prioritati fiecarei cereri de intrerupere si solutionarea acestora conform prioritatii avute sunt foarte importante.

intrare laintrerupere

verificare starebit intrerupereal echipam.I/E 1

verificare starebit intrerupereal echipam.I/E 2verificare starebit intrerupereal echipam.I/E 3

iesire la eroare

param. pt.echipam.3

param. pt.echipam.2

param. pt.echipam.1

return

ßà

ââ

â

â

â

â

â

â

da

da

da

nu

nu

nu

â

Fig. 3.58. Testarea cererii de intrerupere a echipamentelor de I/E in rutina de intrerupere

Se poate rezolva problema prioritatii atat prin software, cat si prin hardware. (a) Prioritatati software. Ordinea in care se testeaza starea echipamentelor de I/E (conform fig. 3.58) corespunde prioritatii acestora. Detectarea, in ordinea testarii, a unei cereri de intrerupere implica saltul la rutina corespunzatoare acestei intreruperi, care va avea prioritate. (b) Prioritati hardware. Un semnal de control trimis de catre microprocesor in exterior trece prin logica de control a fiecarui echipament (vezi fig. 3.59). Daca intreruperile sunt inhibate (mascate), acest semnal nu permite generarea de intreruperi catre procesor. Cand intreruperile sunt activate, semnalul trece pe rand prin echipamentele ce nu cer intrerupere. Ajungand la cel care cere intrerupere, logica implementata blocheaza generarea de intreruperi de la urmatoarele echipamente si

BAZELE MICROPROCESOARELOR

3 - 88

determina generarea intreruperii catre procesor. Astfel, pozitia in lantul de echipamente determina prioritatea acestora.

Echipam.I/E3

logica controlintreruperi

Echipam.I/E2

logica controlintreruperi

Echipam.I/E1

logica controlintreruperi

logica controlintreruperi

Microprocesor

Fig.3.59. Implementarea hardware a logicii de prioritati la intrerupere, de la echipamentele I/E

Schemele cele mai sofisticate permit existenta a cate unui bit de mascare a intreruperii corespunzator fiecarui nivel de intrerupere existent. Conform acestor scheme, aparitia unei intreruperi determina mascarea nivelelor de prioritate inferioara. Intreruperi de prioritate mai mare vor intrerupe, la randul lor, subrutinele de tratare a intreruperilor de nivel inferior. Dupa tratarea evenimentelor prioritare, se va reveni la tratarea celor mai putin prioritare. Intreruperile aparute pe nivele inferioare celui tratat vor astepta (fiind mascate), terminarea tratarii curente. Figura 3.60 prezinta modul de desfasurare a evenimentelor in acest caz. O mentiune trebuie facuta si referitor la salvarea starii programului, la aparitia unei intreruperi. Saltul la rutina de intrerupere va implica alterarea, prin operatiile efectuate acolo, a informatiei din registrele procesorului.

MICROPROCESOARE - CONCEPTE GENERALE

3 - 89

Subrutinatratareintreruperenivel 1

programprincipal

cerere deintreruperenivel 3

cerere deintreruperenivel 1

cerere deintreruperenivel 2

Subrutinatratareintreruperenivel 2

Subrutinatratareintreruperenivel 3

return return return

Fig.3.60. Rezolvarea intreruperilor multiple cu prioritati software mascabile Deoarece, la revenirea in programul intrerupt, procesorul trebuie sa reia operatiile din starea dinainte de intrerupere, este necesara salvarea prealabila a acestei stari, inainte de a se incepe tratarea propriu-zisa a intreruperii. Se vor executa instructiuni specifice de salvare in stiva procesorului a continutului registrelor acestuia. La terminarea tratarii intreruperii, se vor reface, din stiva, aceste informatii. Unele microprocesoare au doua seturi de registre, unul pentru programul principal, altul pentru rutinele de intreruperi. Alte procesoare au zona de registre de lucru in memoria RAM a sistemului, exterioara microprocesorului. Adresa de baza a zonei de registre este continuta intr-un registru special al procesorului. Modificarea continutului acestuia implica operarea in alta zona de memorie. Refacerea valorii sale implica revenirea la vechea stare a programului (evident, trebuie luate masuri ca celelalte rutine sa nu afecteze, in cursul efectuarii diverselor operatii, aceste zone de memorie). Aceste operatii de salvare a starii procesorului, durata lor in speta, vor determina viteza de raspuns a sistemului, pentru tratarea intreruperilor la evenimentele aparute.

3.6.3 Operatii de I/E efectuate prin acces direct la memorie Accesul direct la memorie (DMA) este utilizat, dupa cum s-a mentionat deja, in cazul transferurilor foarte rapide de date, care se efectueaza de la/la periferice cu viteze de lucru superioare celei a microprocesorului. Se permite astfel transferul de informatii fara a se opera sub controlul programului procesorului. In cazul transferurilor DMA, transferul de date intre periferice si memoria sistemului este coordonat de catre un controler specializat pentru aceste transferuri, programat in prealabil de catre microprocesor (in vederea cunoasterii adreselor unde/de unde sa se faca transferul de date de la/la periferice).

BAZELE MICROPROCESOARELOR

3 - 90

Operatiile DMA se intrepatrund cu operatiile normale ale sistemului. Exista trei metode uzuale pentru transferuri DMA. Una dintre ele opreste microprocesorul, pe cand celelalte doua interfereaza cu operatiile sale curente. Metoda de oprire a activitatii procesorului (HALT) implica, la aparitia unei cereri de acces DMA, terminarea efectuarii instructiunii curente a procesorului, urmata de trecerea tuturor pinilor acestuia (pe magistralele de date, adrese si control) in starea de mare impedanta si permite efectuarea transferurilor DMA pe aceste magistrale. Dezavantajul metodei consta in faptul ca vor fi necesare cateva cicluri-masina din momentul aparitiei cererii de transfer, pana la posibilitatea satisfacerii acesteia. Uneori, aceasta intarziere poate fi prea mare. Avantajos este faptul ca, odata obtinut, controlul magistralelor poate fi mentinut pentru transferuri oricat de lungi. Figura 3.61 prezinta aceasta tehnica de transfer DMA. O alta metoda consta in oprirea microprocesorului in cadrul instructiunii curente, la terminarea ciclului de instructiune curent. Se obtin timpi de raspuns mult mai buni, deci performante sporite. Se pot transfera deasemenea seturi mari de date, la o astfel de intrerupere a executiei programului.

Microprocesor

Circuittampon

Circuittampon

Magistralade adrese

Magistralade date

< Memoriasi I / E

<

>

<

R / W

transfer posibil

cerere D M A

halt

Fig.3.61. Transfer DMA cu oprirea microprocesorului la terminarea executarii instructiunii curente

Figura 3.62 prezinta schema tipica a sistemului in acest caz. Metoda lungeste practic durata executarii unor instructiuni (in timpul carora procesorul este oprit si se efectueaza transferul de informatii prin DMA). A treia metoda este complet "transparenta" pentru procesor. Acesta nu este oprit, si nici incetinit la executarea programului. Este metoda cea mai rapida, dar si cea mai critica in acelasi timp. Necesita o deosebita atentie la proiectare si memorii cu timpi de acces foarte mici. Operatiile microprocesorului si ale DMA sunt multiplexate, luand in considerare faptul ca transferurile unitatii centrale apar doar pentru anumite faze ale ceasului sistemului.

MICROPROCESOARE - CONCEPTE GENERALE

3 - 91

Utilizarea unei anumite tehnici DMA se va face printr-un compromis intre complexitatea structurii hardware, viteza de executie necesara si rata de transfer DMA ce trebuie obtinuta.

Microprocesor

Circuittampon

Circuittampon

Magistralade adrese

Magistralade date

<Memoriasi I / E

<

<

R / W

cerere D M A

Controlceas

ceas

acces memorievalid

CT

<

transfer posibil

ceas D M A

Fig.3.62.Transfer DMA cu oprirea microprocesorului la terminarea subciclului curent de instructiune

3.7 SISTEM MICROPROCESOR --- EXEMPLU Pe baza conceptelor referitoare la hardware-ul si software-ul sistemelor microprocesor, prezentate in paragrafele anterioare, se va implementa in continuare un sistem microprocesor, intr-un exemplu complet, atat ca structura hardware, cat si ca program, pentru o aplicatie data. In ideea de a nu complica prezentarea cu detalii care ar dauna coerentei paragrafului, scopul urmarit fiind de a se concretiza modul de implementare al acestor sisteme, se va considera un microprocesor ipotetic, nu dintre tipurile existente, ci cu unele simplificari, la prezentarea structurii hardware a sistemului. Mentionam insa ca partea de software este implementata in limbajul de asamblare al unui microprocesor de 16 biti (compatibil 8086). Aplicatia aleasa, fiind doar un exemplu simplu, nu va acoperi nici pe departe posibilitatile reale ale unui microprocesor, atat din punct de vedere al hardware-ului, cat si din cel al software-ului. Dar nu acesta este scopul acestei prezentari. Deci, care este problema: sistemul microprocesor sa realizeze liniarizarea iesirii unui element neliniar (un traductor, de exemplu), generand, pe baza achizitionarii marimii analogice de la iesirea traductorului, un semnal analogic corespunzator, liniarizat. Altfel spus, sistemul va trebui sa genereze un semnal analogic (iesirea), avand o valoare depinzand de un semnal analogic de intrare, dependenta, neliniara, fiind cunoscuta si memorata in memoria sistemului, sub forma unui tabel de valori.

BAZELE MICROPROCESOARELOR

3 - 92

Din considerente de simplitate, s-au utilizat, atat pentru conversia analog-numerica, cat si pentru cea numeric-analogica, convertoare de 8 biti. Deoarece exista 256 de valori posibile ale marimii de intrare, s-au considerat existente si memorate intr-un tabel de 256 de elemente valorile corespunzatoare pe care poate sa le ia marimea de iesire. Pentru a sugera posibilitatea ca aceasta functie a sistemului procesor sa reprezinte doar una din sarcinile sistemului, s-a utilizat lucrul in intreruperi, iar portiunea de program implementand functia dorita a fost considerata o subrutina de intreruperi. In acest context, doar la momente de timp corespunzand disponibilitatii datelor de intrare (de la CA/N, la sfarsitul conversiei analog-numerice), procesorul va fi anuntat de catre acesta, prin intrerupere, va executa citirea, prelucrarea datei si va da catre CN/A valoarea corespunzatoare intrarii. Terminarea intreruperii va permite revenirea la executarea altor sarcini ale sistemului. 3.7.1 Structura hardware a sistemului

Schema de principiu care va implementa aplicatia dorita este prezentata in fig.3.63. Trebuie sa mentionam ca, pe baza aceleiasi scheme, modificarea programului va permite implementarea unor functii noi (sistemul poate functiona, de exemplu, si ca regulator etc.). S-a presupus, dupa cum se observa, ca s-a utilizat un microprocesor de 8 biti, cu o magistrala de adrese de 16 biti. Se considera disponibile direct la iesirea microprocesorului semnalele: IO/M (indicand operatie cu un port, daca este 1 logic, sau cu memoria, daca este 0 logic); WR (operatie de scriere, pentru 0 logic); RD (operatie de citire pentru 0 logic); INTA (acceptarea unei cereri de intrerupere, pentru 0 logic). La intrari, se considera semnalele: RESET (care pentru 0 va aduce procesorul in starea de start initial; se considera in acest caz, ca PC va fi initializat cu valoarea 0); READY (indicand procesorului ca transferul de date de la/la memorie sau port s-a efectuat); INT (semnal care, la valoarea 1 logic, va indica cerere de intrerupere catre procesor). Tot din considerente de simplitate, s-a presupus existenta unui singur nivel de intrerupere, la adresa, fie, 0004H, fixa, valoare pe care contorul de program (PC), o va primi in mod automat, la acceptarea unei cereri de intrerupere. Ca o mentiune cu caracter general, legata de simbolistica utilizata in prezentarea schemelor, reamintim ca semnalele barate sunt active pentru valoarea 0 logic, cele nebarate sunt active pentru 1 logic. Totodata, simbolul de inversare este utilizat in scheme, in conformitate cu functia logica implementata de catre circuit, din punct de vedere al logicii semnalelor de intrare si al celor de iesire din circuit. Astfel, la inversarea semnalului IO/M, pentru a genera semnalul M/IO folosit la selectarea memoriilor, se remarca utilizarea simbolului de inversare la intrarea si nu, cum era uzual, la iesirea inversorului. Astfel se accentueaza faptul ca un semnal 0 pe intrare va fi 1 pe iesire, aceasta fiind situatia necesara la selectie de memorie. Aceeasi remarca si la sinteza selectiei de cip pentru circuitele PROM: semnalul CSP0, de exemplu, va aparea la coincidenta in valoare logica 0 a semnalelor RD si BANC0 (un SI-NU de semnale active pe 0), deci dat de functia logica:

MICROPROCESOARE - CONCEPTE GENERALE

3 - 93

CSP0 = RD BANC0⋅ = RD + BANC0 implementata fizic cu un circuit de tip SAU. Utilizarea simbolului pentru circuitul SAU nu ar fi fost suficient de clara pentru a intelege direct functionarea logica a schemei. Pentru memoria program s-au utilizat doua circuite PROM de cate 256x8 biti capacitate, suficient, dupa cum se va vedea, pentru aplicatia data. Memoria RAM, de 256 cuvinte, s-a obtinut prin utilizarea a 2 cipuri de 256x4 biti fiecare, functionand in paralel, unul pe primii 4 biti de date (D0÷D3), celalalt pe ultimii 4 (D4÷D7). Profitand de utilizarea memoriilor de 256 octeti, s-a implementat logica de selectie a memoriei din bitii superiori de adresa (Ad8 ÷ Ad15), obtinandu-se semnalele BANC0, BANC1, BANC2, corespunzator zonelor de adrese 0÷0FFH, 100H÷1FFH, respectiv 200H÷2FFH. Astfel, memoria program se va gasi incepand de la adresa 0 (de la aceasta adresa se lanseaza procesorul, la RESET), pana la adresa 1FFH, iar memoria RAM, intre adresele 200H si 2FFH. Se remarca selectia memoriei PROM doar la operatii de citire (corelat cu semnalul RD ). Bitii inferiori de adresa Ad0÷Ad7 sunt utilizati direct la nivelul cipurilor, pentru selectia celulelor de memorie de pe cipul selectat.

BAZELE MICROPROCESOARELOR

3 - 94

Decodifi-care

pentruselectiamemoriei

BANC 0

BANC 1

BANC 2

CS

256 x 4 biti

RAM

CS

256 x 4 biti

RAM

CS

256 x 8 biti

PROM

CS

256 x 8 biti

PROM

RD

MICRO-PROCESOR

IO/MRDWRcuart

RESET

INT INTACLK

READY

RD

PORT0

PORT1

WR

P0I

P0OQ

RD

T

"1"

intrareanalogica

iesireanalogica

CN/A

LatchTamponP1O

WR

STARTCONV

EOCCA/N

SF.CONV

PORT1

Magistralade date

Magistralade adrese

8

16

8

Bistabil

8

8

MEMREADY

8Ad0Ad7

¸ Ad0Ad7

¸ Ad0Ad7

¸ Ad0Ad7

¸8 8

CSP1

CSP0

(CSRAM)

4D0 ¸ D3

D4 ¸ D7 D0 ¸ D7D0 ¸ D7

4 8 8

Ad0 Ad7¸

IOREADY

Decodificarepentruselectia

convertoa-relor

(adresateca porturi)

8 8

Fig. 3.63. Schema de principiu a sistemului microprocesor exemplificat

MICROPROCESOARE - CONCEPTE GENERALE

3 - 95

In ceea ce priveste adresarea convertoarelor, s-a considerat ca sunt elemente de tip porturi, adresate prin instructiuni de I/E. Se considera ca microprocesorul poate adresa un numar de 256 porturi de intrare, si 256 porturi de iesire, deci la o operatie de I/O, denotata de aparitia semnalului IO/M de valoare 1, primii 8 biti de pe magistrala de adrese contin adresa portului cu care se va opera. Corelat cu semnalele de RD sau WR, se poate cunoaste si sensul transferului de informatie (input sau output). (Nu este necesara nici o legatura functionala intre un port de intrare si unul de iesire, care au aceeasi adresa, diferenta constand in selectarea unuia printr-o operatie de INPUT --- semnal RD , respectiva celuilalt printr-o operatie de OUTPUT --- semnal WR). Convertorul A/N considerat are un pin de comanda START .CONV, pe care, aplicand un semnal 0 logic, se determina startul unei conversii analog-numerice a marimii de la intrarea convertorului. Durata conversiei este de odinul 100 microsecunde --- nu consideram un convertor prea rapid. Tot din considerente de simplitate, se presupune ca semnalul de intrare variaza lent comparativ cu durata conversiei (pe timpul careia se considera constant), altfel fiind necesara utilizarea unui circuit de esantionare si retinere (SAMPLE AND HOLD). La sfarsitul conversiei, convertorul va genera semnalul EOC (End of Conversion - sfarsit de conversie). In configuratia aleasa, semnalul va determina setarea unui bistabil, generand un semnal de intrerupere catre procesor. Printr-o operatie de citire de la portul P0 (fie la adresa 00H), microprocesorul va avea acces, prin deschiderea circuitului tampon, la valoarea convertita de la iesirea CA/N. Se considera ca startul conversiei se va da printr-o operatie de OUTPUT, la portul P0. In ceea ce priveste conversia numeric-analogica, se va selecta la o operatie de OUTPUT, la adresa 1H (portul P1), un circuit latch, care va memora informatia corespunzatoare de pe magistrala de date. Iesirile acestui circuit vor fi aplicate la intrarile CN/A. Conversia N/A dureaza de ordinul sutelor de nanosecunde. Se remarca in schema sintetizarea semnalului de READY, din doua semnale furnizate de catre logica de selectie a memoriei, respectiv a porturilor. Se considera ca timpul de selectie al memoriei este inferior celui critic pentru a opera fara perioade de WAIT. Pentru operatiile cu porturile (START .CONV, citire valoare marime convertita A/N, output o noua valoare la CN/A), se considera deasemenea ca nu se pune problema timpilor de WAIT. Semnalul INTA, generat de microprocesor, in cazul acceptarii unei intreruperi, va determina resetarea bistabilului care a generat intreruperea si anularea cererii de intrerupere, pana la semnalizarea unui nou sfarsit de conversie.

BAZELE MICROPROCESOARELOR

3 - 96

3.7.2 Structura software a sistemului Structura programului care va implementa aplicatia dorita este deosebit de simpla. Programul principal va trebui doar sa genereze semnalul de start pentru prima conversie, sa initializeze si sa activeze intreruperile. Apoi, microprocesorul va intra in starea de HALT, din care poate fi scos doar la intrerupere (sau la RESET, dar nu acest caz intereseaza). La aparitia unei intreruperi, anuntand sfarsitul conversiei A/N, se va trece la tratarea intreruperii. Subrutina scrisa in acest scop va salva starea microprocesorului (continutul registrelor). (Subrutina este scrisa pentru cazul general cand procesorul ar fi intrerupt din executia unui program, in care, revenind la sfarsitul intreruperii, trebuie sa poata continua executia normala). Apoi se va citi valoarea convertita. Considerand ca elementele tabloului cu valori ale functiei de iesire sunt aranjate la adrese succesive in memoria PROM, incat elementul corespunzator valorii n citite la intrare (n ia valori intre 0 si 255 --- marime pe 8 biti), va fi al n-lea in tabloul memorat, adresa acestuia va fi data de suma intre adresa primului element al tabloului si valoarea n citita. Odata obtinuta aceasta adresa, se va extrage din tabel valoarea corespunzatoare si se va transmite convertorului N/A prin operatia de OUTPUT respectiva. Se va da apoi un nou start de conversie la CA/N pentru o noua achizitie. Dupa refacerea starii microprocesorului dinainte de intrerupere (refacerea continutului registrelor) si reactivarea intreruperilor (acestea se dezactiveaza automat la acceptarea intreruperii), se revine in programul intrerupt (se reface din stiva, prin executia unei instructiuni de RETURN, valoarea PC salvata la acceptarea intreruperii --- in acest caz, adresa primei instructiuni dupa cea de HALT). Schema logica a subrutinei de intrerupere este prezentata in figura 3.64. Exemplul fiind fictiv, dupa cum s-a mentionat deja, utilizam doar pentru convenienta, instructiuni specifice microprocesorului 8086 (ca mnemonica si semnificatie de principiu), fara a implementa in acest caz, un program riguros corect dedicat acestui microprocesor. In continuare vom face cateva precizari inainte de a prezenta programul scris in limbajul de asamblare al unui asemenea microprocesor - de tipul INTEL 8086 (sau, echivalent, microprocesorul 8088, care are magistrala de date exterioara cipului, de 8 biti, iar interior opereaza pe 16 biti). Pentru intelegerea instructiunilor utilizate (comentate de altfel), reamintim ca microprocesorul 8086 (8088) are un registru acumulator AX, de 16 biti (care contine un operand, si rezultatul, la operatii aritmetice sau logice; la operatii de INPUT contine data citita de la portul adresat; la operatii de OUTPUT continutul sau este scris la portul adresat pentru iesire). Exista deasemenea si registre utilizabile ca registre de uz general, cum ar fi BX, CX, de cate 16 biti, etc. (Pentru detalii asupra microprocesorului 8086, v. cap. 4). Toate aceste registre pot fi adresate global, ca registre de 16 biti, dar si individual, ca registre de 8 biti (AL si AH, ce compun registrul AX; BL si BH, ce compun registrul BX; CL si CH, ce compun registrul CX, etc.). Instructiuni specifice pot fi utilizate pentru a adresa si manipula continutul acestor registre, in operatii pe 8 biti. Deoarece exemplul dat este fictiv, respectam in cele ce urmeaza mnemonicile si sensul primar al instructiunilor similare ale microprocesorului 8086. Detaliile si elementele specifice acestui microprocesor se vor prezenta doar in capitolul urmator (segmentarea memoriei, moduri de adresare, tratarea intreruperilor, etc).

MICROPROCESOARE - CONCEPTE GENERALE

3 - 97

Mai remarcam faptul ca trebuie avuta in vedere valoarea adreselor diferitelor parti din program (zona de cod, continand programul propriu-zis, si tabelul cu valorile functiei, situate uzual in memoria PROM, precum si zona de date, necesara in acest caz doar pentru crearea stivei programului, situata in memoria RAM). La RESET, presupunem ca microprocesorul isi initializeaza PC cu 0. Deasemenea, se presupune, in mod simplificat, si fara a preciza mecanismele complete ale procesului de intrerupere, saltul la adresa 0004H, la aparitia unei cereri de intrerupere. Deoarece programul principal incepe la adresa 0H, la aceste doua adrese se vor gasi instructiuni de salt neconditionat, la programul principal propriu-zis si, respectiv, la subrutina de tratare a intreruperii. In afara instructiunilor in limbaj de asamblare, carora le corespunde cod masina pentru microprocesor, se utilizeaza si asa-numitele directive pentru asamblor. Acestea nu determina generare de cod. Ele dau indicatii asamblorului, despre adresa la care sa se amplaseze o zona de program, valoarea unor simboluri literale in program etc. Deasemenea, asamblorul permite utilizarea adreselor simbolice (asemanatoare etichetelor instructiunilor in limbajele de nivel inalt), ceea ce usureaza efortul programatorului, eliminand si erorile posibile; de exemplu, o secventa de salt la o adresa se scrie:

...

...

... instructiuni JMP ADR1 instructiuni ... ... ... ADR1: instructiune ...

START

Salvare registrein stiva

Citire valoareC A / N

Calculul adreseielementului

corespunzator dintabelul de valori

Citire din tabel avalorii functiei

Output laC N / A

Output,start onoua conversie

Refacere registredin stiva

Activare intreruperi

STOP

Fig.3.60. Schema logica a subrutinei de tratare a intreruperii la sfarsitul conversiei analog-

numerice

BAZELE MICROPROCESOARELOR

3 - 98

Asamblorul va calcula, stiind lungimea (in cuvinte de instructiune, octeti), a fiecarei instructiuni, valoarea reala a adresei ADR1, si va genera codul corect de salt la aceasta adresa.

Textele scrise dupa semnul ";" sunt comentarii, neluate in seama de catre asamblor. Ele ajuta la intelegerea cat mai rapida a programului. Listingul programului pentru implementarea aplicatiei propuse: ;=============================================================== ; Program test pentru citirea unui semnal analogic (utilizand un convertor ; A/D), gasirea unei valori corespunzatoare unei dependente functionale, ; prin cautare intr-un tabel de valori memorate, si transmiterea valorii ; din tabel, la o iesire D/A a sistemului. ;=============================================================== ; Definirea adreselor porturilor sistemului: ; ---------------------------------------------------------- PORT0 EQU 0H ; adresa convertorului A/D. Operatiile de ; output la PORT0 determina startul conversiei ; A/D; input de la portul PORT0 permite citirea ; valorii convertite de catre convertor PORT1 EQU 1H ; adresa convertorului D/A. Prin output la PORT1, ; se transmite data ce trebuie convertita; ;------------------------------------------------------------------------------ ; Zona de cod a programului ; ;---------------------------------------- ; la adresa 0, salt la programul principal ; ORG 0 ; directiva pentru asamblor; se genereaza cod de la adresa 0 ; JMP PRINC ; instructiune de salt la programul principal ; ; la adresa 4, salt la subrutina de tratare a intreruperii ; ORG 4 ; JMP INTRER ; --------------------------------------------------------------------- ; programul principal, fie de la adresa 10H ; ORG 10H ; PRINC: MOV CS, 280H ; initializare CS; in CS se incarca adresa ; varfului stivei initiale a programului, fie 280H OUT (PORT0), AL ; start conversie A/D ; (nu conteaza continutul acumulatorului) EI ; activare intreruperi BUCLA: HLT ; procesorul in HALT, pe perioada cat nu se ; trateaza intrerupere de la CA/D

Observatie

MICROPROCESOARE - CONCEPTE GENERALE

3 - 99

JP BUCLA ; la revenire din intreruperi, salt din nou la ; instructiunea de HALT ; -------------------------------------------------------------------- ; Urmeaza subrutina de tratare a intreruperilor; ; aici sare programul (prin executarea instructiunii de salt, ; de la adresa 0004H, la aparitia intreruperii, la sfarsitul conversiei). ; Inainte de saltul la rutina de intrerupere, se salveaza in stiva continutul PC. ; La executia instructiunii de RET, programul se reia de unde fusese intrerupt, ; prin refacerea PC din stiva. ; INTRER: ; La intrarea in rutina de tratare a intreruperilor, se salveaza in mod explicit, ; prin program, in stiva, toate registrele microprocesorului, al caror continut este ; modificat de catre rutina respectiva. La iesirea din subrutina, se reface, in ; ordine inversa celei de salvare, continutul initial al acestor registre. ; Pentru exemplul dat, sunt salvate registrele AX si SI. ; PUSH AX ; salvare registru AX in stiva PUSH SI ; salvare registru SI in stiva ; IN AL, PORT0 ; citire in A valoare convertita de CD/A MOV SI, [TABEL] ; SI contine adresa primului element al ; tabloului cu valorile functiei MOV AH, 0 ; AX = AH & AL, contine valoarea conversiei ; A/D, identica cu indexul elementului de tablou, ; corespunzator transformarii functionale ADD AX, SI ; se aduna la SI, valoarea din AX, si se obtine ; in AX rezultatul, adresa elementului cautat ; in tabelul TABEL MOV SI, AX ; SI contine adresa elementului cautat in tabel MOV AL, [SI] ; in AL se aduce, prin citire din memorie, ; de la adresa denotata de SI, valoarea functiei ; OUT PORT1, AL ; valoarea functiei este transmisa convertorului D/A OUT PORT0, AL ; start o noua conversie A/D ; cind se va termina conversia, convertorul A/D va genera o noua intrerupere ; refacerea continutului registrelor SI si AX POP SI POP AX EI ; activare intreruperi (dezactivate automat la ; intrarea in rutina de intreruperi) RET ; revenire la programul intrerupt (se reface PC ; din stiva, salvat la acceptarea intreruperii) ;-------------------------------------------------------------------------------------------------------- ; in continuare, urmeaza tabelul cu valori ale functiei (fie, pe cate un octet) ; se utilizeaza directiva DB --- define byte ; lista contine, despartite de virgule, elementele tabloului (vor fi in PROM), ; valori memorate in ordinea scrierii: ; TABEL: DB 0, 1, 5, 17, 22, 9 DB 8, 7, 11, 33, 19,... ... (in total 256 numere, cu valori intre 0 si 255) ...

BAZELE MICROPROCESOARELOR

3 - 100

... END ; directiva indicand asamblorului sfarsitul textului sursa 3.7.3 Concluzii Prezentul paragraf nu a urmarit si nici nu poate sa acopere problemele ridicate de implementarea reala a hardware-ului si software-ului unui sistem microprocesor in totalitatea sa. Cu toate acestea, au fost prezentate elementele fundamentale si problemele ce apar in acest sens. Cateva dintre problemele care nu au fost, cu buna stiinta, abordate, sunt urmatoarele: • nu s-au facut consideratii asupra timpilor de acces si selectie pentru diferitele circuite utilizate (presupuse deci ca opereaza cu viteze satisfacatoare relativ la viteza microprocesorului); • nu s-au facut consideratii privitoare la capacitatea de incarcare (fan-out) a magistralelor si semnalelor de iesire ale microprocesorului (de regula insuficiente si necesitand circuite repetoare cu fan-out mai mare); • nu s-au detaliat circuitele de selectie ale memoriei si porturilor (circuite combinationale cu grad relativ redus de complexitate); • s-au facut ipoteze simplificatoare privind semnalele de control, tratarea intreruperii (salt la adresa fixa) --- apare doar la unele tipuri de microprocesoare; • nu s-a evaluat durata executiei subrutinei de intrerupere; compararea acesteia cu durata conversiei A/N permite, in cazul unei durate mai mici a executiei subrutinei, sa se execute instructiunea OUT PORT0, de start a conversiei, imediat dupa citirea valorii convertite. (Astfel se castiga timp, executandu-se instructiuni de prelucrare a valorii citite --- cautare in tabel, OUTPUT valoarea functiei --- in timp ce se converteste deja o noua valoare). Mai trebuie mentionat din nou ca, dispunand eventual si de un circuit de ceas programabil, care sa permita achizitia de date la intervale fixe de timp, structura hardware a sistemului prezentat ar putea implementa, cu un alt program, de exemplu un regulator de orice tip (in functie de algoritmul utilizat, de parametrii implementati), bineinteles pentru un proces cu constante de timp corelate cu durata maxima a executiei calculelor care ar impune temporizarea ceasului.