|
Programiranje v zbirniku z naborom ukazov arhitekture ARM Besedilo vaje: Izdelajte program, ki bo glede na stanje tipk T0, T1, T2 in T3 krmilil diode LED LD0, LD1, LD2 in LD3. Svetijo naj tiste diode LED, katerih pripadajoče tipke so trenutno pritisnjene. Programirajte v zbirnem jeziku. Razlaga: Program napišete v razvojnem okolju, ki teče na osebnem računalniku. Pripravljen delovni prostor (angl. workspace) z vsemi pripadajočimi datotekami najdete tukaj. V njem se poleg nastavitev projekta nahajata dve datoteki z zbirniško izvorno kodo, in sicer crt0.s in main.s. Datoteko crt0.s poznamo z laboratorijskih vaj pri predmetu Računalniško načrtovanje vezij II in vsebuje zagonsko kodo mikrokrmilnika. Zagonski kodi je dodana inicializacija mikrokrmilnika, ki je tokrat v celoti napisana v zbirniku. Mikrokrmilnik je inicializiran z naslednjimi nastavitvami: fclk = 12MHz, fVPB = 3MHz, vhodni pini so p0.0 do p0.3 in p0.8 do p0.15, ter izhodni pini so p0.4 do p0.7. Izhodni pini so vnaprej nastavljeni na nizek nivo. Za osvežitev spomina naj povemo, da smo inicializacijo mikrokrmilnika na laboratorijskih vajah pri predmetu Računalniško načrtovanje vezij II izvedli s pomočjo funkcije init(), ki je bila napisana v programskem jeziku C. Zbirniška zagonska koda v datoteki crt0.s se začne izvrševati ob zagonu programa. Najprej prepiše strojno kodo programa iz pomnilnika flash v pomnilnik RAM. Nato postavi kazalce skladov in inicializira mikrokrmilnik z zgoraj omenjenimi nastavitvami. Z zadnjim ukazom skoči na naslov main, ki se nahaja v datoteki main.s. Tukaj boste dodali zbirniško kodo, ki jo zahteva ta vaja. Vaja je dokaj preprosta. V neskončni zanki ponavljamo branje vhodnih pinov tipk, ter stanje ves čas preslikavamo na izhodne pine diod LED. Tipke T0, T1, T2 in T3 se nahajajo na pinih p0.12, p0.13, p0.14 in p0.15, ki so med inicializacijo že nastavljeni kot vhodni. Diode LED LD0, LD1, LD2 in LD3 pa so na pinih p0.4, p0.5, p0.6 in p0.7. Tudi ti pini so že pravilno inicializirani kot izhodni. Algoritem vaje podaja spodnja slika.
Stanje vseh pinov 32-bitnih vrat port0 preberemo iz registra IO0PIN, ki se nahaja na naslovu 0xe0028000. Izhodne pine vrat port0 postavljamo s pisanjem v register IO0SET na naslovu 0xe0028004. Oziroma z drugimi besedami, posamezen izhodni pin se postavi v visoko stanje ob vpisu enice na pripadajoč bit v registru IO0SET. Vpis enice na bit, ki pripada vhodnemu pinu, nima vpliva. Ničle v registru IO0SET prav tako nimajo vpliva in izhodnih bitov ne postavljajo v nizko stanje. Če hočemo izhodni pin postaviti v nizko stanje, moramo enico vpisati na pripadajoč bit v registru IO0CLR, ki se nahaja na naslovu 0xe002800c. Vpis enice na bit, ki pripada vhodnemu pinu, zopet nima vpliva. Enako velja za ničle v registru IO0CLR, ki stanja izhodnih bitov ne spreminjajo. Kratek pregled in opis posameznih zbirniških ukazov arhitekture ARM najdete v skripti. | |