Table of Contents

Laboratorul 10 - Recapitulare

În acest laborator ne propunem să definitivăm conceptele învățate pe parcursul semestrului, reamintindu-ne etapele prin care am trecut în construirea procesorului nostru.

În plus, vom analiza câte un model pentru colocviu și pentru problema de examen.

Exerciții

0. Completați formularul de feedback de pe curs.upb.ro.

1. Câte registre de uz general are procesorul implementat de noi? Ce dimensiune are fiecare registru?

2. Sunt toate registrele de uz general accesibile de către toate instrucțiunile? Dacă nu, dați exemplu de o instrucțiune care nu poate accesa toate registrele.

3. Cum facem să încărcăm o valoare imediată într-unul dintre registrele R0-R15?

4. De ce procesorul nostru execută în mod corect instrucțiuni precum BREQ/BRNE pe care nu le-am implementat în mod explicit?

5. Ce rol au registrele din spațiul I/O?

6. Dați două exemple de intrucțiuni diferite ce accesează spațiul I/O.

7. Între ce adrese este mapat în memorie spațiul de registre I/O? Ce altceva mai este mapat în spațiul de adrese al procesorului și care este prima adresă validă din acea zonă?

8. Registrul program counter este accesibil din ISA (i.e. îl putem da ca parametru unei instrucțiuni)? Se poate scrie în el? Se poate citi din el?

9. Ce este un prescaler? Cum funcționează? La ce îl folosim în microcontrollerul nostru?

10. Care este diferența dintre o instrucțiune RETI și una RET? Ce au în comun?

11. De ce trebuie să avem multe instrucțiuni RETI la începutul codului dacă folosim întreruperi?

12. Scrieți un program în avrasm care:

  • configurează Timer/Counter0 în modul Fast PWM, TOP == OCRA;
  • setează ceasul Timer/Counter0 să folosească un prescaler de 8;
  • configurează Timer/Counter0 să schimbe starea pinului OC0B astfel: Set OC0B on Compare Match, clear OC0B at BOTTOM(inverting mode);
  • setează valoarea lui OCR0B la 34;
  • setează valoarea lui OCR0A la 130.

13. Scrieți un program în avrasm care:

  • configurează Timer/Counter0 în modul Normal;
  • setează ceasul Timer/Counter0 să folosească un prescaler de 256;
  • configurează Timer/Counter0 să schimbe starea pinului OC0B astfel: Clear OC0B on Compare Match;
  • setează valoarea lui OCR0B la 127.

14. Scrieți un program în avrasm care:

  • configurează Timer/Counter0 în modul CTC;
  • setează ceasul Timer/Counter0 să nu folosească niciun prescaler;
  • configurează Timer/Counter0 să schimbe starea pinului OC0A astfel: Toggle OC0A on Compare Match;
  • setează valoarea lui OCR0A la 55.

15. Scrieți un program în avrasm care configurează Timer/Counter0 pentru a genera un semnal PWM pe pinul OC0B cu un factor de umplere de 25% și o perioadă de 0.04096 ms, știind că frecvența semnalului CLKI/O este de 100 MHz.

16. Scrieți un program în avrasm care configurează Timer/Counter0 pentru a genera un semnal PWM pe pinul OC0A cu un factor de umplere de 50% și o perioadă de 0.02048 ms, știind că frecvența semnalului CLKI/O este de 100 MHz.

17. Scrieți un program care pune pinii portului A în următoarea stare: PA0 - stins, PA1 - stins, PA2 - aprins, PA3 - aprins, PA4 - stins, PA5 - stins, PA6 - aprins, PA7 - stins. Se citește apoi valoarea de pe portul B și dacă PB0 are valoarea 1, atunci se aprinde PA0.

18. Folosind setul de instrucțiuni AVR, scrieți o funcție care calculează suma numerelor din reuniunea a 2 seturi și o plasează în registrul R20. Un set este reprezentat ca un număr pe 8 biți, iar numărul i se află în set dacă bitul i din set este 1. Scrieți un program care apelează funcția cu valorile 7 (00000111 în binar, conține numerele 0, 1, 2) și 81 (01010001 în binar, conține numerele 0, 4, 6). Parametri vor fi transmiși folosind stiva.

Cum mă pregătesc pentru colocviu ?

Parcurgeți și înțelegeți teoria din laboratoarele 00-09. Rezolvați încă o dată exercițiile de configurare din laboratoarele 06-10.

Nu trebuie să rețineți valorile din datasheet, însă trebuie să știți să citiți informațiile de acolo. În timpul colocviului aduceți acest document printat: un cheatsheet cu toate informațiile necesare (extrase din datasheet) pentru a răspunde la întrebările de configurare a microcontrolerului.

F.A.Q:

  1. Trebuie să învăț pe de rost informațiile din datasheet ?
    1. NU, dar trebuie să înțelegeți ce scrie în datasheet.

Model de problemă de examen

Fie un procesor cu adrese pe 8 biți și o memorie cache de 8 octeți cu lungimea liniei de 2 octeți, datele fiind accesibile la nivel de octet. Timpul de acces în cazul unui hit este Thit = 10 ns și timpul de acces în cazul unui miss este Tmiss = 100 ns. Cât va dura următoarea secvență de cod și ce date se vor afla în cache dacă:

  • A. Adresele sunt mapate direct
  • B. Adresele sunt mapate set asociativ cu 2 căi și politica de înlocuire a liniilor este LRU
  • C. Adresele sunt mapate full asociativ și politica de înlocuire a liniilor este FIFO
ldi R19, 0x08
loop:	
	lds R20, 0x01
	lds R21, 0x03
	lds R22, 0x05
	lds R23, 0x07
	lds R24, 0x09
 
dec R19
	cpi R19, 0
	brne loop

Observație: Considerăm ca instrucțiunile ldi (load immediate), dec (decrement), cpi (compare immediate) și brne (branch not equal) se execută în timp 0 și nu afecteaza cache-ul.

Resurse