Î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.
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:
13. Scrieți un program în avrasm care:
14. Scrieți un program în avrasm care:
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.
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:
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ă:
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.