arhitektura procesora...arhitektura procesora m inimalan skup komponenti od kojih je sastavljen neki...
TRANSCRIPT
Arhitektura procesora
Minimalan skup komponenti od kojih je sastavljen neki racunarski
sistem, naziva se mikroracunar . U okviru ovog predavanja upoznacemo
se sa osnovnom strukturom mikroracunarskog sistema, nakon cega cemo vise
paznje posvetiti arhitekturi procesora. Na kraju predavanja, osvrnucemo se na AVR
arhitekturu Atmel mikrokontrolera.
1 Uvod - osnovna struktura mikroracunarskog sistema
Minimalna hardverska konfiguracija mikroracunarskog sistema se sastoji od tri fundamentalne
komponente: centralne procesorske jedinice (eng. Central Processing Unit - CPU), sistemske
memorije i nekog oblika ulazno/izlaznog podsistema. Ove komponente su povezane visestrukim
linijama grupisanim u skladu sa njihovim funkcionalnostima. Linije koje povezuju osnovne
elemente mikroracunarskog sistema se nazivaju sistemske magistrale (eng. system buses). Kao
dodatak, osim tri osnovna elementa mikroracunarskog sistema, dodatne komponente obezbeduju
neophodno napajanje sistema ali i vremensku sinhronizaciju neophodnu za normalnu
funkcionalnost sistema. Na slici 1 moze se videti osnovna arhitektura mikroracunarskog sistema.
Slika 1: Osnovna arhitektura mikroracunarskog sistema
Komponente mikroracunarskog sistema mogu biti implementirane na najrazlicitije nacine. Jedna
implementacija podrazumeva da su svi elementi mikroracunarskog sistema nezavisne komponente
1
(cipovi), dok bi alternativno resenje bilo integracija svih komponenti u okviru jednog cipa, strukturi
koja se naziva Mikrokontroler.
Nezavisno od toga kako je realizovan mikroracunarski sistem, svaka od komponenti tog sistema
ima specificnu funkciju i namenu:
1. Centralna procesorska jedinica (CPU) cini jezgro svakog mikroracunarskog sistema. CPU
prima instrukcije iz programske memorije, dekoduje ih i izvrsava ih. Osim toga, CPU je
zaduzen i za adekvatno koriscenje periferijskih jedinica koje sacinjavaju ulazno/izlazni
podsistem.
2. Sistemska memorija je zaduzena za smestanje programa i podataka, koji se koriste od strane
centralne procesorske jedinice. Dva tipa memorijskih elementata se najcesce mogu pronaci
u okviru sistema: programska memorija i memorija podataka. Programska memorija ima
ulogu da skladisti programe u formi sekvence instrukcija koje ce se izvrsavati. Ovi programi
odreduju funkcionalnost celokupnog sistema. Memorija za podatke ima ulogu da skladisti
podatke koji se koriste tokom izvrsavanja programa.
3. Ulazno/Izlazni podsistem se cesto naziva i Periferijski podsistem i on ukljucuje sve
komponente, tj. periferije koje omogucavaju centralnom procesoru da razmenjuje
informacije sa drugim komponentama sistema i spoljasnim svetom.
4. Sistemske magistrale su skup linija koje povezuju CPU, memoriju i ulazno/izlazni podsistem.
Grupe ovih linija sistema imaju razlicite funkcije unutar sistema pa se one mogu podeliti na
adresnu magistralu, magistralu podataka i kontrolnu magistralu.
1.1 Razlike mikrokontrolera i mikroprocesora
Mikroprocesorska jedinica (ili skraceno mikroprocesor, eng. MPU) sadrzi centralnu procesorsku
jedinicu opste namene. Da bi se dizajnirao mikroracunarski sistem baziran na mikroprocesoru, svi
elementi sistema prikazani na slici 1 (magistrale, memorije i periferijske jedinice) moraju se povezati
kao eksterne komponente. Osim toga, karakteristike mikroprocesora su i:
• optimizovana arhitektura u cilju preuzimanja programa i podataka iz eksterne memorije
(skrivena memorija, eng. cache);
• mogucnost obradivanja vise instrukcija istovremeno;
• predvidanje grananja (eng. branch prediction);
• postojanje numerickih ko-procesora, itd.
Najtipicniji primeri mikroracunarskog sistema baziranog na mikroprocesorima su personalni
racunari (eng. Personal Computer, PC) kao i takozvani mainframe racunari. Najpoznatiji
proizvodaci mikroprocesora su Intel, Freescale, Zilog, Fujitsu, Siemens i mnogi drugi. Dizajn
mikroprocesora je znatno napredovao u poredenju sa prvobitnim modelima koji su se pojavili
pocetkom 70-tih godina proslog veka. Intel-ov prvobitni 4004 iz 1971. godine je bio napravljen u
10um tehnologiji, koristio je takt na 400kHz i bio je sacinjen od 2250 tranzistora. Intel-ov Xeon
2
Slika 2: Arhitektura mikrokontrolera
E7 mikroprocesor, predstavljen 2011. godine, napravljen je u 32nm tehnologiji, koristi takt od
2GHz i sadrzi oko 2.6x109 tranzistora.
Mikrokontroleri (skraceno MCU od engleskog Micro Controller Unit), bazirani su na jezgru
mikroprocesora, odnosno centralnoj procesorskoj jedinici (CPU), uglavnom manje slozenosti u
poredenju sa mikroprocesorom. Ovakvom jednom CPU je dodata memorija (kako programska
tako i memorija za podatke) i nekoliko tipova periferijskih jedinica. Svi ovi elementi su integrisani
u jedno integrisano kolo (cip) i nazivaju se mikrokontroler.
Ovakva struktura mikrokontrolera omogucava fleksibilnost i minimalan broj eksternih
komponenti u cilju implementacije kompletnog sistema. Brojaci i tajmeri, ulazno/izlazni portovi,
blokovi za obradu prekida i konvertori podataka (analogno/digitalni i digitalno/analogni)
uglavnom spadaju u periferijske jedinice koje su sadrzane u vecini savremenih mikrokontrolera.
Na slici 2 prikazana je tipicna arhitektura mikrokontrolera.
Iako mikrokontroleri imaju vrlo slicne karakteristike kao i mikroprocesori opste namene, znatno
su manje kompleksnosti i vise su prilagodeni aplikaciji za koju su namenjeni. Mikrokontroleri su
uglavnom grupisani u kategorije (familije) koje karakterisu zajednicke karakteristike (struktura
registara, set instrukcija, modovi adresiranja, itd). Na trzistu je danas dostupan ogroman broj
najrazlicitijih mikrokontrolera, od preko hiljadu razlicitih proizvodaca. Jedan od njih je Atmel, a
njihova AVR familija u koju spada i mikrokontroler ATmega328P koji cemo mi koristiti u okviru
nastave, je najpopularnija familija mikrokontrolera danasnjice.
3
1.2 RISC i CISC arhitektura
Mikroracunarski sistem sluzi za izvrsavanje softvera koji je podrzan od strane hardverske
arhitekture sistema. Mikroracunarski sistemi se uglavnom optimizuju tako da su optimizovani ili
sa stanovista softvera, ili sa stanovista hardvera. U skladu sa tim, postoje dve standardne
arhitekture mikroracunara: CISC i RISC.
CISC (Complex Instruction Set Computing) masine karakterise:
• promenljiva duzina instrukcijske reci (razlicit broj bita se koristi za kodovanje instrukcija);
• mala velicina programa i
• instrukcije koje se izvrsavaju tipicno u nekoliko sukcesivnih perioda sistemskog takta.
CISC arhitektura ima za cilj izvrsavanje sto vise operacija u okviru svake instrukcije, u cilju
generisanja jednostavnih programa (cesto prihvat iz memorije, izvrsavanje aritmeticke ili logicke
operacije i smestanje rezultata nazad u memoriju).
RISC (Reduced Instruction Set Computing) masine, sa druge strane, su dizajnirane sa fokusom
na jednostavnim instrukcijama, cak i po cenu vece velicine programa koji ce se izvrsavati. Ovakav
pristup pojednostavljuje strukturu hardvera. Kod RISC arhitekture, izvrsavanje svake pojedinacne
instrukcije je znatno skraceno u poredenju sa CISC arhitekturama.
2 Centralna procesorska jedinica (CPU)
Centralna procesorska jedinica je jezgro mikroracunarskog sistema. CPU je zaduzen za
izvrsavanje instrukcija, odnosno njegova uloga je da pretvara instrukcije u signale i akcije
izvrsavane na hardveru mikroracunarskog sistema. Minimalan skup komponenti koje definisu
arhitekturu centralne procesorske jedinice su:
• Hardverske komponente
– Aritmeticko-Logicka jedinica (eng. Arithmetic Logic Unit, ALU)
– Kontrolna jedinica (eng. Control Unit, CU)
– Skup registara
– Kontrola interfejsa magistrale
• Softverske komponente
– Set instrukcija
– Modovi adresiranja
Instrukcije i modovi adresiranja su determinisani i definisani specificnostima hardverskih jedinica
ALU i CU. Ovde cemo vise paznje posvetiti hardverskoj strukturi centralne procesorske jedinice.
Slika 3 prikazuje pojednostavljeni model centralne procesorske jedinice sa njenim internim
hardverskim blokovima. Ovi blokovi omogucavaju da CPU pristupa programu i podacima koji su
smesteni u memoriji i/ili periferijskim jedinicama. Sam program se sastoji od sekvence
pojedinacnih instrukcija koje su sadrzane u setu podrzanih instrukcija datog CPU. Program
4
Slika 3: Centralna procesorska jedinica
smesten u memoriji odreduje sekvencu operacija koje ce se izvrsiti na sistemu. Prilikom obrade
podataka, svaka komponenta centralne procesorske jedinice igra vaznu ulogu i zaduzena je tacno
za jednu vrstu operacija koje ne mogu biti izvrsene od stane drugih komponenata, alternativno.
Hardverske komponente u okviru CPU koje izvrsavaju operacije na podacima su ALU, interna
magistrala podataka, ali i ostali funkcionalni blokovi kao sto su jedinica za aritmetiku u
pokretnom zarezu (eng. floating-point unit), hardverski mnozaci itd. Hardverske komponente
koje vrse operacije vezane za kontrolu sistema nazivaju se Kontrolna jedinica (eng. Control Unit).
Jedinica za kontrolu magistrale, kao i komponente za sinhronizaciju se takode najcesce
posmatraju kao deo Kontrolne jedinice.
2.1 Kontrolna jedinica (CU)
Kontrolna jedinica (CU) upravlja funkcionalnoscu centralne procesorske jedinice, implementirajuci
konacni automat (eng. Finite State Machine tj. FSM) koji ciklicno ponavlja tri stanja: Prihvat
(eng. Fetch), Dekodovanje (eng. Decode) i Izvrsavanje (eng. Execute), kao sto je prikazano na
slici 4. Ova tri stanja predstavljaju elementarne operacije koje se koriste prilikom izvrsavanja svake
pojedinacne instrukcije i odnose se na:
• prihvat instrukcije iz memorije
• dekodovanje instrukcije nakon cega CPU “zna” koja instrukcija treba da se izvrsi
• izvrsavanje instrukcije.
Prihvati-dekoduj-izvrsi ciklus se cesto u literaturi naziva i instrukcijski ciklus (eng. instruction
cycle ili CPU cycle). Kompletan instrukcijski ciklus tipicno zahteva nekoliko taktova procesora da
5
Slika 4: Konacni automat Kontrolne jedinice
se izvrsi, u zavisnosti od same instrukcije i operanada koji se u njoj koriste (konstante, varijable iz
memorije ili sadrzaji lokalnih registara). Neretko se desava da CPU ima svoj interni takt koji je
vise ucestanosti od sistemskog takta (cak i do cetiri puta vise). U takvim slucajevima, u literaturi
se moze videti da je za izvrsenje instrukcije dovoljan jedan sistemski takt, sto je naravno tacno,
ali treba imati u vidu da se zapravo instrukcija izvrsi nakon cetiri (ili vise) internih taktova.
Nekoliko blokova ucestvuje u instrukcijskom ciklusu, medu kojima specijalnu ulogu imaju registri
PC (programski brojac, eng. Program Counter) i IR (instrukcijski registar, eng. Instruction
Register). Kompletan ciklus se moze opisati kao:
1. Stanje Prihvata instrukcije: tokom stanja prihvatanja nove instrukcije, koriscenjem bloka
kontrole interfejsa magistrale (eng. Bus Interface Logic - BIL), instrukcija iz memorije stize
do CPU. Programski brojac (PC) obezbeduje adresu u memoriji sa koje se instrukcija cita.
Novo procitana instrukcija se cita koriscenjem magistrale podataka i smesta se u instrukcijski
registar (IR);
2. Stanje Dekodovanja instrukcije: nakon prihvata instrukcije, CU prelazi u stanje dekodovanja,
u kome se znacenje instrukcije “desifruje”. Dekodovana informacija se koristi kako bi se slali
odgovarajuci signali ka odgovarajucim CPU komponentama u cilju izvrsavanja aktivnosti
predvidenih samom dekodovanom instrukcijom;
3. Stanje Izvrsavanja instrukcije: u ovom stanju, CU salje komande odgovarajucim
funkcionalnim jedinicama u okviru CPU u cilju izvrsavanja aktivnosti odredenih
instrukcijom. Na kraju ove faze izvrsavanja, sadrzaj programskog brojaca se inkrementira,
kako bi pokazivao na adresu sledece instrukciju koja ce se izvrsiti u narednom
instrukcijskom ciklusu.
Nakon izvrsne faze, CU salje komande bloku kontrole interfejsa magistrale, kako bi ona koristeci
sadrzaj programskog brojaca preuzela narednu instrukciju iz memorije, cime se inicira naredni
6
Slika 5: Jednostavna aritmeticko-logicka jedinica
instrukcijski ciklus (novi prihvat instrukcije).
Ciklus moze obuhvatati medu-cikluse slicne instrukcijskom ciklusu, u slucaju kada je tokom
dekodovanja instrukcije potrebno preuzeti iz memorije dodatne podatke (npr. za instrukciju koja
sabira dva broja, brojeve koje treba sabrati). Ovo takode zavisi i od moda adresiranja koji se
koristi, ali o ovome cemo vise pricati kasnije.
Obzirom na to da je Kontrolna jedinica realizovana kao konacan automat, neophodan je Reset
signal kako bi se inicirao ciklus na pocetku izrsavanja prve istrukcije. U cilju preuzimanja prve
instrukcije iz memorije, sadrzaj programskog brojaca nakon reseta je uvek takav da pokazuje na
prvu instrukciju koja treba da se izvrsava (u slucaju mikrokontrolera, to je uglavnom adresa 0).
Adresa prve instrukcije se cesto naziva reset vektor.
2.2 Aritmeticko Logicka jedinica (ALU)
Aritmeticko logicka jedinica je CPU komponenta zaduzena za sve aritmeticke i logicke operacije
koje treba izvrsiti u datom mikroracunarskom sistemu. Osnovne aritmeticke operacije kao sto su
sabiranje, oduzimanje i komplement (predstava negativnih brojeva), podrzane su od strane svih
ALU. Neke slozenije, sa druge strane, ukljucuju i hardverske komponente za kompleksnije
operacije, kao sto su mnozenje i deljenje. Ipak, u vecini slucajeva ove operacije se vrse ili
softverski (koriscenjem nekog od algoritama i vec postojecih elementarnih aritmetickih operacija)
ili koriscenjem dodatnih periferijskih jedinica, kao sto je na primer hardverski mnozac.
Logicke operacije koje se tipicno izvrsavaju od strane ALU su operacije koje rade sa pojedinacnim
bitima u okviru bajta ili reci (I, ILI, NE, EX-ILI). Takode, u ove operacije spadaju i pomeranje i
rotiranje. Ove operacije su izuzetno znacajne jer omogucavaju promenu odredenih bita u registrima,
bez uticaja na ostale bite.
Kontrolna jedinica upravlja aritmeticko-logickom jedinicom tako sto specificira koja operacija
7
Slika 6: AND, OR i sabirac/oduzimac koji se koriste unutar ALU
treba da se izvrsi, prosleduje joj promenljive nad kojima se vrsi operacija, i obezbeduje prostor gde
ce biti sacuvan rezultat. Kapacitet ALU je odreden arhitekturom mikroprocesora: na primer, za
16-bitni mikroprocesor ALU ima mogucnosti izvrsavanja operacija na 16-bitnim podacima. Ovo
uveliko odreduje i samu strukturu mikroprocesora, jer podrazumeva da je sirina magistrale podataka
takode 16, kao i velicina registara koji se koriste.
Primer aritmeticko logicke jedinice je prikazan na slici 5. Ova jednostavna ALU ima mogucnost
izvrsavanja jedne od cetiri operacije: sabiranje, oduzimanje, logicko AND i logicko OR. Ulaz op
odreduje koja ce se operacija izvrsavati u skladu sa tabelom:
op Operacija
00 AND
01 sabiranje
10 OR
11 oduzimanje
Slika 6 prikazuje strukturu kombinacionih mreza koje se koriste za izvrsavanja aritmetickih i
logickih operacija u okviru ALU.
2.3 Kontrola interfejsa magistrala
Kontrola interfejsa magistrala je struktura u okviru centralno procesorske jedinice koja koordinira
interakciju izmedu internih magistrala i sistemskih magistrala. Ovaj blok definise nacin na koji
eksterne adrese, podaci i kontrolna magistrala funkcionisu. U slucaju jednostavnih sistema ovaj blok
je sadrzan u okviru CPU, dok je u slucaju slozenijih sistema najcesce potrebno dodavanje eksternih
modula koji su zaduzeni da obezbede ovu funkcionalnost. Primeri ovih modula su periferije za
kontrolu magistrala, mostovi (eng. bridges) i hardverski moduli za arbitriranje na magistralama.
2.4 Registri
CPU registri omogucavaju privremeno smestanje podataka, memorijskih adresa i kontrolnih
informacija na nacin da im se moze brzo i jednostavno pristupiti. Oni predstavljaju najbrzu
memoriju u mikroracunarskom sistemu, ali sa druge strane imaju i najmanji kapacitet. Sadrzaj
8
registara u okviru CPU se gubi nakon nestanka napajanja. U nacelu, registri se mogu podeliti u
dve grupe: registri opste namene i specijalizovani registri.
Registri opste namene su registri koji nisu “vezani” za specificne funkcije procesora i mogu da
se koriste za smestanje podataka, promenljivih ili pokazivaca na adrese, po potrebi. U skladu sa
ovim, cesto se u literaturi klasifikuju kao adresni ili registri za podatke. U zavisnosti od arhitekture
procesora, CPU moze sadrzati do nekoliko desetina registara opste namene.
Registri specijalne namene su registri koji su zaduzeni za specificne funkcije u radu CPU.
Najosnovniji registri koji su sadrzani u okviru CPU strukture su:
• Instrukcijski registar (IR)
• Programski brojac (PC) koji se cesto naziva i Instrukcijski pokazivac (eng. Instruction
Pointer -IP)
• Pokazivac steka (eng. Stack Pointer -SP)
• Statusni registar (eng. Status Register -SR)
2.4.1 Instrukcijski registar (IR)
Instrukcijski registar cuva instrukciju koja se trenutno dekoduje i izvrsava od strane CPU. Akcija
prenosa instrukcije iz memorije u IR se naziva Prihvat instrukcije.
2.4.2 Programski brojac (PC)
Ovaj registar cuva adresu instrukcije koja ce biti prihvacena iz memorije od strane centralne
procesorske jedinice. Cesto se naziva i instrukcijski pokazivac. Svaki put kada se instrukcija
prihvata i dekoduje, kontrolna jedinica inkrementira vrednost PC registra kako bi pokazivao na
narednu instrukciju koja ce se izvrsavati iz memorije. Ovakvo ponasanje se moze promeniti tokom
izvrsavanja programa, na vise nacina (npr. instrukcijama grananja kada se sadrzaj programskog
brojaca zamenjuje novom adresom na koju treba skociti). Obzirom da PC sadrzi adresu, njegova
sirina mora biti uskladena sa velicinom programske memorije.
Programski brojac nije predviden da mu se sadrzaj menja direktno iz programa koji se izvrsava.
Ovog pravila se pridrzavaju tradicionalne arhitekture, jer ne omogucavaju da PC bude dostupan kao
operand instrukcija. Novije RISC arhitekture su postale malo fleksibilnije u tom smislu u pokusaju
da pojednostave programiranje. Ipak, i u slucaju novijih RISC arhitektura, ova fleksibilnost treba
biti koriscena oprezno kako se ne bi narusio korektan tok izvrsavanja programa.
2.4.3 Pokazivac steka (SP)
Stek je specijalizovan memorijski segment koji se koristi za privremeno smestanje podataka u
specificnom redosledu. Sama operacija smestanja i prihvatanja podataka u skladu sa ovim
redosledom upravljana je od strane CPU koriscenjem pokazivaca steka. Nekolicina
mikrokontrolera koristi fiksnu poziciju steka u memorijskom prostoru, dok je u vecini slucajeva
dozvoljeno korisniku da definise poziciju steka u okviru RAM sekcije (ukoliko to ne uradi korisnik,
automatski ce se dodeliti prostor tokom procesa kompajliranja). Sadrzaj pokazivaca steka se
9
Slika 7: Stek i pokazivac steka
odnosi na vrh stek memorije. Ova pozicija govori CPU gde se nalazi poslednje smesteni podatak.
Operacija smestanja podatka na stek se u literaturi najcesce naziva push operacija, dok se citanje
podatka sa steka naziva pop operacija. Svaki put prilikom koriscenja steka, sadrzaj pokazivaca
steka se menja.
Termin stek (eng. stack) je preuzet iz analogije slaganja tanjira koje se vrsi u prirodnom LIFO
(Last-In-First-Out) maniru: tanjir koji je poslednji stavljen na gomilu je onaj koji mora prvi biti
uzet sa gomile, u suprotnom ce vrlo verovatno tanjiri pasti i razbiti se. Upravo se iz tog razloga
sadrzaj steka upravo odnosi na vrh steka.
Medutim, u vecini implementacija, popunjavanjem steka, on raste na “dole” umesto na “gore”.
To zapravo znaci da se vrednost SP smanjuje svaki put kada se na stek stavi novi podatak, a
povecava se kada se podatak podigne sa steka. SP se obicno inicijalizuje na poslednju (najvisu)
adresu u RAM memoriji, da bi ovakav mehanizam bio omogucen. Na primeru sa slike 7 cemo videti
kako funkcionise stek.
Prilikom inicijalizacije, stek je prazan i pokazivac pokazuje na adresu 10. Nakon postavljanja
nekoliko podataka na stek (njih 5), pokazivac steka je pomeren na 5. Ukoliko bi se jos jedan podatak
stavljao na stek, on bi bio postavljen na adresu 5 (broj 8 sa slike). Ipak, ukoliko se cita podatak sa
steka (operacijom pop), pokazivac steka se pomera na 6, jer je poslednje procitan podatak uklonjen
sa steka (broj 67). Nakon jos jednog uklanjanja, pokazivac steka se povecava na 7, nakon sto se
podatak sa vrha steka uklanja (broj 125).
Osnovna uloga steka je kontrola toka programa u slucaju pozivanja procedura (funkcija kako se
one nazivaju u nekim programskim jezicima). Procedure (funkcije) su skupovi instrukcija grupisani
u celine, u cilju smanjenja ukupne velicine programa. Da bismo ilustrovali problem, posmatramo
sledeci primer: ukupna velicina memorije je 256 bajtova, glavni program je velicine 100 bajtova, za
sabiranje dva broja potrebno je 10 bajtova i neka je tokom izvrsavanja glavnog programa potrebno
5 puta sabrati dva broja (Slika 8).
Ukoliko ne bismo koristili procedure, samo za ovakvo sabiranje bi nam bilo potrebno 50 bajtova.
Ako, pak, definisemo proceduru za sabiranje brojeva, i nju samo pozivamo kad god zelimo da
saberemo dva broja, potrebna memorija u tom slucaju je samo 10 bajtova (ako se zanemari velicina
same instrukcije za poziv procedure, koja je uglavnom zanemarljiva u odnosu na velicinu same
procedure). U primeru sa slike 8, glavni program pocinje na adresi 0 i zavrsava se na adresi 99
(ukupna velicina glavnog programa je 100 bajtova), dok procedura Saberi pocinje na adresi 145.
Stek se nalazi na dnu memorijskog prostora i popunjava se na “gore”.
10
Slika 8: Sadrzaj memorije u primeru poziva procedure Saberi
Problem koji ovde nastaje se odnosi na mesto povratka nakon sto se izvrsi procedura, jer procesor
nakon sto izvrsi proceduru do kraja, mora da se vrati na ono mesto sa koga je procedura bila
pozvana. Kao sto je receno, ovo se desava na 5 razlicitih mesta u nasem programu, i procesor svaki
put nakon izvrsenja procedure mora da zna na koju lokaciju u memoriji mora da se vrati kako bi
nastavio sa radom. Tok izvrsavanja programa koji poziva proceduru Saberi prikazan je u sledecim
koracima:
1. Na pocetku izvrsavanja glavnog programa sadrzaj programskog brojaca je PC=0 i program
pocinje da se izvrsava pocevsi sa adresom 0;
2. PC se uvecava nakon izvrsenja svake instrukcije i nakon odredenog vremena dode do 30. Na
adresi 30 se nalazi prvi poziv procedure Saberi. U ovom trenutku pokazivac steka ima sadrzaj
255 (0xFF) sto znaci da je stek prazan;
3. Da bi procesor znao gde treba da se vrati nakon sto se izvrsi procedura Saberi, na vrh steka se
stavlja adresa povratka, koja je jednaka trenutnoj vrednosti PC uvecanoj za 1. Dakle, nakon
ovog koraka na lokaciju na koju pokazuje pokazivac steka se upisuje broj 31 (slika 9 levo);
4. Pokazivac steka se umanjuje za 1 kako bi pokazivao na sledecu lokaciju na koju ce se upisati
sledeci podatak na stek (SP=0xFE, tj SP=254);
5. U PC se upisuje adresa pocetka procedure Saberi, koja je jednaka 145 (0x91);
6. Posto PC uvek pokazuje na instrukciju koja ce sledeca da se izvrsi, nakon ovoga ce krenuti
da se izvrsava prva instrukcija iz procedure Saberi;
7. PC se uvecava nakon izvrsenja svake instrukcije, slicno kao u koraku 2. Kada dode do kraja
procedure, imace vrednost PC=154 (0x9A);
11
Slika 9: Stavljanje povratne adrese na vrh steka (levo) i preuzimanje adrese sa steka (desno)
8. U ovom trenutku izvrsavanje treba da se vrati na mesto u glavnom programu gde je bilo
prekinuto pozivom procedure Saberi, a to ce se desiti tako sto se sa vrha steka podigne adresa
koja je prethodno bila upisana i ta vrednost se upise u PC. Da bi se ovo uradilo potrebno
je najpre uvecati vrednost pokazivaca steka za 1 kako bismo se vratili na poslednji upisani
podatak: SP = 0xFF (slika 9 desno);
9. Vrednost sa adrese na koju pokazuje SP se upisuje u PC: PC = 31 (0x1F);
10. Nakon ovoga, stek je ponovo prazan, SP = 0xFF, a naredna instrukcija koja ce se izvrsavati je
prva instrukcija koja sledi nakon prvog poziva procedure Saberi, tj. instrukcija koja pocinje
na adresi 31 (0x1F);
11. Na slican nacin, kada sledeci put bude bila pozvana procedura Saberi (pozivom sa adrese 48)
mikroprocesor ce znati da, kada se zavrsi procedura, treba da se vrati na adresu 49, kada se
pozove sa adrese 60 da se vrati po zavrsetku na adresu 61 itd...
Stek omogucava ugnjezdavanje poziva procedura. Na primer, stek bi omogucio pozivanje neke
druge procedure (npr. Oduzmi) tokom izvrsavanja procedure Saberi. U tom slucaju nakon poziva
procedure Oduzmi iz procedure Saberi, na steku bi se nalazile dve povratne adrese:
1. na vrhu steka bi bila adresa koja se odnosi na adresu unutar procedure Saberi gde se treba
vratiti nakon izvrsenja procedure Oduzmi;
2. ispod nje je druga adresa koja predstavlja adresu u okviru glavnog programa, na koju se treba
vratiti kada se izvrsi do kraja procedura Saberi.
12
Slika 10: Primeri elementarnih aritmetickih operacija
2.4.4 Statusni registar (SR)
Statusni registar na engleskom se cesto naziva i Processor Status Word (PSW) registar ili Flag
registar i on sadrzi skup indikatorskih bita (eng. flags). Indikatorski biti su zapravo biti koji
predstavljaju specificno stanje u kome se nalazi procesor.
Broj statusnih bita kao i uslovi koji su signalizirani takvim statusnim bitima su najcesce zavisni
od samog mikrokontrolera ili, u opstem slucaju, centralne procesorske jedinice. Vecina indikatorskih
bita predstavlja stanje neposredno nakon izvrsavanja instrukcije koja je poslednja izvrsena od strane
ALU, iako, u nacelu, oni mogu biti menjani direktno iz programa. Najcesci indikatorski biti koji
se mogu naci u slucaju vecine platformi su:
• Indikator nule (Zero flag-ZF) se postavlja na logicko 1 kada je rezultat ALU jednak nuli, u
suprotnom je postavljen na 0
• Indikator prenosa (Carry flag-CF) je postavljen na 1 u slucajevima da je ALU operacija
proizvela rezultat sa prenosom (npr. sabiranjem dva 8-bitna broja je dobijen 9-bitni broj).
Postoje i instrukcije koje imaju uticaj na ovaj indikator, a nisu vezane za elementarne
aritmeticke operacije
• Indikator znaka (Negative flag ili Sign flag, NF) se postavlja na 1 kada je rezultat ALU
operacije negativan, dok je 0 u suprotnom.
• Indikator prekoracenja (Overflow flag-VF) signalizira prekoracenje prilikom operacije
sabiranja ili oduzimanja oznacenih brojeva (koji mogu biti kako pozitivni tako i negativni)
• Indikator prekida (Interrupt flag-IF) sluzi da dozvoli/zabrani zaustavljanje programa nakon
pojave eksternog dogadaja (prekida).
Osim gore navedenih indikatorskih bita, razlicite familije mikrokontrolera mogu imati znatno vise
indikatora na raspolaganju. Na slici 10 je prikazan primer postavljanja indikatorskih bita prilikom
aritmetickih operacija.
U gornjem primeru vrednosti statusnih bita su:
• 4Ah + 79h = C3h : C = 0, N = 1, Z = 0 i V = 1
• B4h + 4Ch = 100h : C = 1, N = 0, Z = 1 i V = 0
• 9Ah + B9h = 153h : C = 1, N = 0, Z = 0 i V = 1
• CAh + 1Bh = E5h : C = 0, N = 1, Z = 0 i V = 0
13
Slika 11: AVR CPU arhitektura
Treba obratiti paznju da se prekoracenje ne desava u slucajevima kada su oba operanda prilikom
sabiranja razlicitog znaka, tj. kada im se razlikuju MSB (bitovi najvece znacajnosti). N i V
indikatorski biti se uglavnom odnose na oznacene brojeve u aritmetickim operacijama oduzimanja
i sabiranja. Indikator nule ovek pokazuje, nezavisno od operacije, da li je rezultat 0 ili nije.
3 AVR CPU arhitektura
Arhitektura AVR familije mikrokontrolera je prikazana na slici 11.
U cilju maksimizovanja performansi i povecanja paralelizma, AVR familija mikrokontrolera
koristi Harvard arhitekturu, sa odvojenim memorijskim prostorom i magistralama za programsku
i memoriju podataka. Instrukcije iz programske memorije se izvrsavaju u protocnoj obradi prvog
nivoa: dok se jedna instrukcija izvrsava, naredna instrukcija se prihvata iz programske memorije.
Ovaj koncept omogucava da se u svakom taktu izvrsi jedna instrukcija. Programska memorija je
realizovana kao fles memorija koja moze da se reprogramira direktno u sistemu (eng.
In-System-Programmable).
32 8-bitna registra opste namene sa brzim pristupom omogucavaju pristup podacima u jednom
ciklusu sistemskog takta. Ovo omogucava aritmeticko-logickoj jedinici izvrsavanje takode u jednom
taktu. ALU tipicno preuzima dva operanda iz registara opste namene, izvrsava potrebnu operaciju
i rezultat smesta nazad u registre opste namene, sve u jednom taktu. ALU, osim toga, omogucava
aritmeticke i logicke operacije izmedu registara ili izmedu registra i konstante. Takode, operacije sa
14
jednim registrom se mogu izvrsiti od strane aritmeticko-logicke jedinice. Nakon svake aritmeticke
operacije, statusni registar se azurira kako bi adekvatno prikazao informacije u vezi sa rezultatom
operacije.
Tokom prekidnih rutina i poziva pod-procedura, povratna adresa programskog brojaca (PC) se
smesta na stek. Stek se nalazi u okviru SRAM memorije za podatke, te je samim tim njegov
kapacitet ogranicen samo kapacitetom SRAM memorije. Svi korisnicki programi moraju
inicijalizovati pokazivac steka (SP) tokom reset rutine (pre nego sto se prva pod-procedura ili
prekidna rutina izvrse).
Statusni registar sadrzi informacije u vezi sa rezultatom poslednje izvrsene aritmeticke
instrukcije. Ova informacija se moze iskoristiti da promeni tok programa koriscenjem
kondicionalnih operacija. Sadrzaj statusnog registra se ne cuva automatski prilikom ulaska u
prekidnu rutinu (niti se restaurira nakon zavrsetka iste), te ovo mora da se obavlja iz korisnickog
programa. Statusni biti koji sacinjavaju statusni registar u AVR arhitekturi su:
• I - Bit za globalnu dozvolu prekida (eng. Global Interrupt Enable bit). Ovaj statusni bit se
koristi da zabrani/dozvoli sve prekide
• T - Bit Copy Storage se koristi za operacije sa bitima (prilikom kopiranja bita, kao izvoriste
i odrediste)
• H - Indikator polu-prenosa (eng. Half Carry bit) se koristi u nekim aritmetickim
instrukcijama, a posebno je koristan u BCD aritmetici
• S - Indikator znaka (eng. Sign bit) je u svakom trenutku jednak N ⊕ V (gde je ⊕ simbol za
operaciju Ekskluzivno ILI)
• V - Indikator prekoracenja komplementa dvojke (eng. Two’s Complement Overflow Flag)
omogucava aritmetiku sa komplementom dvojke
• N - Indikator negativnog (eng. Negative Flag) se koristi da signalizira negativan rezultat
aritmeticke ili logicke operacije
• Z - Indikator nule (eng. Zero Flag) signalizira da je rezultat poslednje aritmeticke ili logicke
operacije nula
• C - Indikator prenosa (eng. Carry Flag) se koristi kao prenos u aritmetickim i logickim
operacijama.
15