|
Prekinitve (undefined, software, data in prefetch abort)
Besedilo vaje: Izdelajte program, ki bo izmeril velikost pomnilnika flash in pomnilnika RAM vgrajenega v mikrokrmilnik LPC21xx. Velikost obeh pomnilnikov naj se izpiše na prikazovalniku LCD. Za zaznavanje roba pomnilniškega prostora uporabite data abort prekinitev. V pomoč naj vam bo dejstvo, da se v vseh mikrokrmilnikih iz serije LPC21xx pomnilnik flash pričenja na naslovu 0x00000000, ter pomnilnik RAM na naslovu 0x40000000.
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. Opis datotek, ki se nahajajo v paketu, najdete v uvodu razlage prve vaje (samostojni zagon). Lastno kodo, ki izvaja to vajo, dodate v prazno definicijo funkcije main() v datoteki main.c. Najprej morate mikrokrmilnik inicializirati, kar naredite s klicem funkcije init() v funkciji start_up() v datoteki startup.c. Za njeno uporabo morate vključiti datoteko init.h. Opis funkcije init() prav tako najdete v razlagi prve vaje (samostojni zagon). Velikosti obeh pomnilnikov flash in RAM bomo izmerili na enak način. In sicer bomo iz obeh pomnilnikov brali podatke toliko časa, dokler ne bomo poskusili brati z neobstoječega naslova. Ob branju z neobstoječega naslova, kjer se pomnilnik flash, oziroma pomnilnik RAM že konča, mikrokrmilnik sproži data abort prekinitev. Prekinitev data abort se zgodi ob poskusu branja ali pisanja podatka na neveljaven naslov. Naj ob tej priliki poudarimo, da vektorski nadzornik prekinitev s prekinitvami te vrste nima opravka. Vektorski nadzornik prekinitev, ki smo ga spoznali v tretji (časovnik) in četrti vaji (zunanje prekinitve), skrbi le za proženje prekinitev tipa IRQ in FIQ. Več o vrstah prekinitev najdete v skripti. Algoritem vaje je preprost. Branje iz zaporednih naslovov ponovimo dvakrat. Prvič merimo velikost pomnilnika flash in beremo podatke od naslova 0x00000000 dalje. Nato z branjem od naslova 0x40000000 dalje izmerimo še velikost pomnilnika RAM. Algoritem vaje prikazuje slika spodaj.
Branje ponavljamo toliko časa, dokler je spremenljivka abort enaka nič. Na ena jo postavimo ob data abort prekinitvi, torej ob prvem poskusu branja z neveljavnega naslova. Ker do spremenljivke abort ob data abort prekinitvah dostopamo tudi izven funkcije main(), mora biti spremenljivka globalna. Ob data abort prekinitvi se požene funkcija data_abt(), katere definicija se nahaja v datoteki interrupts.c. Neskončno zanko nadomestimo z ustrezno kodo, ki spremeni vrednost abort spremenljivke. V opozorilo naj povemo, da utegne biti branje iz vseh naslovov dokaj zamudno, zato lahko merjenje velikosti pomnilnika flash, oziroma RAM traja predolgo. Čas merjenja je mogoče skrajšati, če merimo na kB natančno in tako preberemo le vsak 1024-ti byte v pomnilniku. Zbrane podatke s pomočjo gonilnika lcd_driver_1() izpišete na prikazovalnik LCD. Izvorna koda gonilnika je priložena v datoteki main.c. Gonilnik ob vsakem klicu na prikazovalnik LCD izpiše vsebino niza, na katerega kaže globalni kazalec lcd_string (glej prvo vajo - samostojni zagon). Ko sta velikosti obeh pomnilnikov izmerjeni in izpisani, je naloga opravljena. Program zaključite z neskončno zanko. Poleg prekinitev tipa IRQ in FIQ, za proženje katerih skrbi vektorski nadzornik prekinitev, poznajo mikrokrmilniki iz serije LPC21xx še pet tipov prekinitev. In sicer: reset (ob zagonu), undefined, software, prefetch abort in v naši vaji že uporabljeno data abort prekinitev. Podrobnejši opis posameznih prekinitev najdete v skripti. V datoteki interrupts.c so poleg definicije funkcije data_abt() podane tudi definicije funkcij und(), swi() in pref_abt(), ki se poženejo ob undefined, software in prefetch abort prekinitvah. Poskusite sprožiti vsako izmed naštetih prekinitev. V pripadajočih funkcijah na prikazovalnik LCD izpišite, katera prekinitev se je zgodila. Prekinitev undefined izzovete tako, da mikrokrmilnik poskusi izvesti ukaz, ki ga ne pozna (na primer: 0x07f000f0). Programsko (software) prekinitev "pokličete" z zbirniškim ukazom swi. Prekinitev prefetch abort pa se sproži ob poskusu izvajanja kode z neveljavnega naslova. To pomeni, da programski števec vsebuje naslov, ki se ne nahaja v pomnilniku flash, ali v pomnilniku RAM. Prekinitev prefetch abort najlažje izzovemo s skokom na neobstoječ naslov, oziroma z zapisom neveljavne vrednosti v programski števec. | |
![]() |
![]() |
![]() |