Mérés laboratórum 2 - 2. mérés ellenőrző kérdései

A VIK Wikiből

1. Az ATmega128 mikrokontroller Neumann-architektúrájú-e? A válaszát indokolja is meg!

(c) by wikimedia.org & Hainzmann János
A képen balra: Neumann architektúra, jobbra: Harvard architektúra (AVR ATmega128 mikrokontroller)
Válasz: Nem. A mikrokontroller tömbvázlatát megnézve megállapíthatjuk, hogy a programkódnak és az adatoknak külön memóriája van, nem egy közös tárban találhatóak. Az adatátviteli csatorna is más a programkód számára, mint az adatok számára. Ebből nyilvánvalóan kitűnik, hogy nem Neumann-architektúráról van szó.
Válasz2: Nem. A vezérlő Módosított Harvard architektúrát használ, melyben a Neumanntól eltérően elkülönül egymástól és külön címtartományban helyezkedik el az utasításokat és adatokat tároló memória. Azért módosított, mert speciális utasításokkal lehetőség van a programmemória adatainak olvasására is.

2. Van-e egy kitüntetett funkciójú akkumulátor-regiszter az AVR architektúrájú processzorokban?

Nincs. Az utasítások paramétere - kevés kivételtől eltekintve - bármelyik regiszter lehet.

3. Milyen memória-tartományai vannak az ATmega128 mikrokontrollernek?

Az AVR architektúrának két fő memóriatartománya van:

- program memória:
|alkalmazás szakasz |} |boot szakasz |}
- adat memória:
|regiszterek |} |standard I/O reg. |} |extended I/O reg. |} |belső SRAM |} |külső SRAM |}

4. Milyen fő csoportjai vannak az utasításoknak?

  • aritmetikai és logikai (and, or, eor stb)
  • ugró és elágazó utasítások(jmp, call, breq, brne stb)
  • adatmozgató (load/store, regiszter-->memória, memória-->regiszter)
  • bitmódosító és bittesztelő utasítások (rol, ror, lsl, lsr stb)

5. Vázolja fel az általános digitális I/O portok felépítését! Hány regiszter tartozik egy porthoz, és mi az egyes regiszterek feladata?

A digitális I/O portok kétirányúak, tehát be-és kimenetként is működhetnek. Minden porthoz 3 regiszter tartozik, egy adatregiszter (PORTx), egy irányregiszter (DDRx), és egy, csak olvasható regiszter (PINx). Az irány-és adatregiszter bitenként programozható.

Ha a DDRx (ahol x: A…G) értéke 1, akkor kimenetként, ha DDRx értéke 0, akkor bemenetként definiáltuk a portot. Kimeneti port esetén a PORTx-re írjuk a kimeneti értéket, bemeneti port esetén a felhúzó ellenállást (pull-up) szabályozzuk. (Ha a bemeneti portokat nem húzzuk fel logikai 1-be, akkor lebegni fognak, ezáltal a környezetben fellépő zajok miatt kiszámíthatatlan lesz a bemenetek értéke.) Bemeneti port esetén a PINx regiszterekből a bemeneten lévő érték olvasható ki, kimeneti port esetén a PORTx értéke olvasható ki egy órajellel később. (Utóbbit ritkán használjuk.)

6. Mikor szokás egy perifériát interrupttal kezelni? Mi az interruptos kezelés előnye?

Akkor, ha:

  • a megszakítás kérés előreláthatólag nem túl sűrűn következik be, közöttük a CPU sok műveletet el tud végezni
  • IT bekövetkezése véletlenszerű, de gyorsan ki kell szolgálni
  • IT alatt elvégzendő feladatok nem vesznek sok időt igénybe, vagy ha igen, akkor megszakítható az IT (vagyis többszintű az IT rendszer)
  • az IT-s szervezés a program struktúráltságát szolgálja

Előnyei ebból adódóan:

  • növeli a program áttekinthetőségét
  • a periféria kérések gyorsan kiszolgálódnak (aktuális utasítás ciklus végén válaszol IT-ra a CPU)
  • kiszámíthatatlan idejű kérések esetén sokkal jobb a CPU kihasználtága, mintha lekérdezéses ütemezést választanánk

Hátrányos lehet akkor, ha túl sűrűn jönnek a kérések, mert ekkor az IT rutin nem a periféria kezeléséhez tartozó részeit is folyton el kell végezni, ami rontja a CPU kihasználtságát.

Egy jó példa erre a kezelésre a billentyűzet, mint periféria kezelése.

7. Mit takar az az elnevezés, hogy keresztfejlesztő rendszer (cross-development system)?

A beágyazott rendszerek többségében nincs elég szabad erőforrás a fejlesztő szoftver és vele egyidejűleg az alkalmazás futtatására. A gyártott termékekek költségérzékenyek, jelentősebb tartalék számítási kapacitás betervezése ezért nem elfogadható. Másik problémát a fejlesztői konzol (display + klaviatúra) jelenti, mert a beágyazott rendszereknek általában speciális be/kimeneti eszközeik vannak. A vázolt problémák miatt a beágyazott rendszereknél az ún. keresztfejlesztő rendszer (cross-development system) alkalmazása szokásos. Ebben az esetben a fejlesztő szoftver egy másik platformon, rendszerint egy PC-n fut. Ezt a számítógépet nevezik host-nak, a fejlesztendő készülék pedig a target. Keresztfejlesztés esetén kapcsolatot kell létesíteni a két platform között. Ennek szokásos eszközei:

  • RS-232 soros port;
  • processzorba, mikrovezérlőbe integrált speciális soros port (JTAG stb.);
  • speciális emulátor hardver.

8. Milyen célt szolgál az ún. töréspont?

A törésponttal a programban egy helyet jelölhetünk meg; ha a program futása oda ér, akkor a futás felfüggesztődik. A debugger programmal debuggolás céljából megnézhetjük a regisztereket és a memóriatartalmakat (memory dump).

9. Mi a különbség a szoftver és a hardver töréspont között?

A fordítóprogam a szoftveres töréspontot úgy hozza létre, hogy a kijelölt helyen az ott található utasítást kicseréli egy ugrás vagy hívás utasításra, mely a futást a debug rendszernek adja át.

Hardver töréspont esetén a chipbe már be van építve a törésponttámogatás. Sokszor külön regisztert tartanak fenn, amiben eltárolható a töréspont címe. Ha a program counter értéke megegyezik ezzel az értékkel (ez egyszerűen komparátorral vizsgálható), akkor a CPU kivételt generál, ezzel jelez a debuggernek.

10. Létrehozható-e szoftver töréspont ICE (In-Circuit Emulator - áramkörbe ágyazott emulátor) nélkül?

{tipp}: ha elég ügyesek vagyunk, tudunk írni egy szubrutint, ami az egyik porton keresztül átadja a hostnak a futás körülményeit (pc, regiszterek, stb), és végtelen ciklusban fut, amíg a host nem küld neki jelet a továbbfutásra. Fix töréspontokat el tudunk úgy helyezni, hogy ezt a szubrutint hívjuk meg az adott helyen (még feltételt is beleprogramozhatunk). Neumann szervezésű gépnél (a vizsgált chip nem az :( ) még a lépésenkénti végrehajtást is belehegeszthetjük: minden utasítás (kivéve az ugrók) után teszünk két NOP-ot, és a töréspont kezelő rutin a host utasításától függően a NOP-ot átírja a töréspontot meghívó utasításra (a CALL 2 hosszú), vagy visszaírja NOP-ra.

Ez mind egy csomó szívás (pl az ugró utasításokat újra kell számolni), plusz pazarolja a programmemóriát, és leginkább: nem akarjuk újra feltalálni a spanyolviaszt. -- SzaMa - 2005.09.26.


-- Olthyer - 2005.09.25.


11. Mit jelentenek és hogyan működnek a CALL ill. JUMP utasítások?

A CALL utasítás egy szubrutint (függvényt) hív meg, a JUMP pedig egy adott utasításra ugrik. Javitsatok ki ha valami pontatlan!!!
-- Nyuzo - 2008.04.08.
A CALL (pl. egy függvényhívás C-ben) utasítás a szubrutin meghívása előtt a visszatérési címet (a CALL utáni utasítás címe) elmenti a Stack-be. Szubrutinból a RET utasítással lehet visszatérni, ilyenkor értelemszerűen a STACK-be elmentett címen folytatódik a program futása. Egy példa erre:

...					; utasítások
call szubrutin	 			; szubrutinhívás
...					; további utasítások
szubrutin:  ...				; még mindig utasítások
ret					; visszatérés szubrutinból<br/>


Egy Jump (C-ben goto) utasítás (JMP) során az utasítás végrehajtása a megadott címen folytatódik. Erre is egy egyszerű példa:


M_LOOP:	  jmp M_LOOP		  	; ugrás M_LOOP cimkére, ami nem más mint egy végtelen hurok<br/>

-- mate - 2009.03.09.

12. kb.: ~Sorolj fel integrált perifériákat az AVR mikrokontrollertől!

• 2. db 8-bites Timer/Counter külön előosztó (Prescaler) egységgel és Compare üzemmóddal
• 2 db 16-bites Timer/Counter külön előosztó (Prescaler) egységgel és Compare valamint Capture üzemmóddal
• Real Time Counter külön saját oszcillátorral
• 2 db 8-bites PWM (pulzus-szélesség modulációs) csatorna
• 6 db PWM csatorna with 2 től 16 bitig programozható felbontással
• Output Compare Modulator
• Egy 8-csatornás, 10-bit felbontású A/D átalakító (ADC), melynek bemeneti egysége az alábbi módok valamelyikébe konfigurálható - 8 Single-ended Channels - 7 Differential Channels - 2 Differential Channels with Programmable Gain at 1x, 10x, or 200x
• Byte-orientált kétvezetékes soros interfész (Two-wire Serial Interface)
• Dual Programmable Serial USARTs
• Master/Slave SPI soros interfész
• Programozható Watchdog Timer integrált óragenerátorral
• Analog komparátor
-- Nyuzo - 2008.04.08.

13. Milyen módon történik egy megszakitáskérés (interrupt) kiszolgálása? Folyamatábra is!

Az interruptok engedélyezése két szinten történik. Minden interruptkérő vonalhoz tarozik egy külön engedélyező bit az adott kérő-vonalat használó egység vezérlő/státusz regiszterében, és a mikrokontroller státuszregiszterében van még egy interruptot általánosan engedélyező bit, az ún. Global Interrupt Enable bit, röviden I bit.
-- Nyuzo - 2008.04.08.

① Amikor befut egy engedélyezett IT kérés, a mikrokontroller befejezi a főprogram éppen futó utasításának végrehajtását, majd megszakítja a főprogram futását. A mikrokontroller ekkor letiltja a globális IT-t, tehát egy esetleges újabb IT nem szakíthatja meg a már futó IT rutint.

② A verembe eltárolódik a programszámláló aktuális tartalma, amely azt mutatja, hogy az IT kiszolgálása után melyik címről kell folytatni a főprogram végrehajtását. Ezután az IT rutin címe betöltődik az PC-be. Az előre definiált vektortáblában arra a címre ugrunk, ami az adott IT kéréshez tartozik. ② PC visszaállítása veremből Globális IT engedélyezése

③ Mivel az IT kezdőcímek nagyon közel helyezkednek el egymáshoz képest (2 programszó/IT), ezért az adott IT vektor mellé egy ugróutasítást helyezünk el, ami a tényleges IT rutinra ugrik.

④ Főprogram környezetének mentése verembe IT kérő egység kiszolgálása

⑤ Főprogram környezetének visszaállítása és RETI Utasítás Hardware-es vezérlés, mikrokontroller végzi Megszakításkezelő rutin, ISR

③ Mivel az IT kezdőcímek nagyon közel helyezkednek el egymáshoz képest (2 programszó/IT), ezért az adott IT vektor mellé egy ugróutasítást helyezünk el, ami a tényleges IT rutinra ugrik.

④ Az IT rutin elején el kell mentenünk a főprogram környezetét a verembe. (A státuszregisztert és egyéb regisztereket, melyeket rutinunk módosít, és a főprogram más célra használ, tehát amik tartalma nem változhat az IT rutinból visszatérve). Ezt követi a tényleges megszakításkezelés, mely során törekedjünk a szükséges minimumra – a megszakításkezelő rutin NEM a főprogram, amíg fut, minden megszakítást blokkol, így érdemes pl. egy kijelölt regiszterben eseményjelző bitet állítania csupán, melyet majd a főprogram ellenőriz.

⑤ Az IT rutin végén visszaállítjuk a veremből a főprogram környezetét, majd a RETI utasítással visszatérünk a rutinból.

⑥ Ennek hatására visszaállítódik a programszámláló, és engedélyeződik a globális IT flag.

ml2_avr.pdf 5.fejezet

14. Milyen utasításokkal lehet menteni a státuszregisztert az interrupt előtt ill. visszaállítani a főprogram környezetét az IT rutin kiszolgálása után?

 * magyarul mik ezek a sablonkódok, amit minden IT előtt és után be kell irni?!:



itrutin:

push temp 	; temp regiszter mentése stacioner
in temp,SREG 	; proc. státusz mentése
push temp	; megszakítást kérő egység kiszolgálása
pop temp 		; proc. státusz visszaállítása
out SREG,temp
pop temp 		; temp regiszter visszaállítása
reti 			; rutin vége


-- Nyuzo - 2008.04.08.

Note that the Status Register is not automatically stored when entering an interrupt routine, nor restored when returning from an interrupt routine. This must be handled by software (atmega128.pdf, 14. oldal lap közepe).

cli kiadása a rutin elején, és az sei kiadása a reti előtt nem kell:
When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled. ... The I-bit is automatically set when a Return from Interrupt instruction – RETI – is executed (atmega128.pdf, 14. oldal lap teteje).

RETI:
Returns from interrupt. The return address is loaded from the STACK and the Global Interrupt Flag is set (avr_instr_set.pdf). -- mate - 2009.05.15.

Én ebben nem vagyok biztos: http://www.mit.bme.hu/oktatas/targyak/vimia216/jegyzet/avr/atmega128.pdf (14. oldal). Itt eléggé használja. -- Tomi - 2009.03.10.

De ha jól megnézed, az nem interrupt-kezelő rutin, hanem azon kívül valahol letiltotta meg engedélyezte a megszakításokat, ahol éppen kedve volt. De az egésznek az a lényege, hogy mikor belép a program egy interrupt-kezelő rutinba, akkor ő tul.képp benyom magának egy cli-t, azaz letiltódnak az interrupt-ok. És a legvégén, mikor a reti-hez érsz, az meg benyom egy sei-t, tehát újra engedélyezve lettek. -- Gyuszi999 - 2011.03.31.