|
|
|
| Software projekti | |
|
C++ 8051 - ARB 8051 BIBLIOTEKA KLASA I FUNKCIJA - I DEO Postoji li šansa da izradu programa za mikrokontrolere vršimo iz nekog višeg programskog jezika a da opet stvaramo optimalan izvršni kod, da možemo da izvučemo maksimum iz našeg mikrokontrolera, da koristimo sve njegove resurse? Možemo li generisati kod za mikrokontroler bez asemblera ili specijalizovanog kros-kompajlera koristeći sopstvenu notaciju ili onu koja je prilagođena konkretnom problemu? Odgovori na ova pitanja nalaze se u seriji članaka o programskoj biblioteci ARB 8051. Osnovna ideja koja je vodila tvorca ove biblioteke klasa i funkcija bila je upravo u tome da potvrdno odgovori na oba postavljena pitanja. Jedno od prvih pitanja koje se postavilo tom prilikom jeste pitanje izbora programskog jezika. Jezik koji je ispunjavao sve postavljene uslove i koji je bio idealno programsko okruženje za ostvarenje posta-vljenog zadatka bio je i ostao C++. Bez namere da se šire upuštamo u filozofiju ovog programskog jezika, neophodno je navesti neka njegova svojstva. Kao i svaki objektno orijentisani jezik podržava mehanizme nasleđivanja, realizacije konstruktorskih i destruktorskih funkcija a ono što ga čini posebno pogodnim za ovu priliku jeste mogućnost da novoformiranim objektima dodelimo ( gotovo ista ) svojstva koja imaju standardni tipovi podataka, a preklapanje operatora prvenstveno to obezbeđuje. To znači da umesto mnemoničke oznake add a,r1 pišemo a+r1, umesto mov a,r1 bilo bi a=r1, činila je ovu ideju još privlačnijom. Svakako, to nije jedini razlog zbog kojeg smatramo primenu programske biblioteke ARB poželjnom u odnosu na druge programske alate. Drugi važan razlog je blokovska organizacija programa realizovanog pomoću ove programske biblioteke. To je okolnost koja dodatno olakšava (dosta neugodan) postupak programiranja. Najviše radi toga, biblioteka ARB 8051 se u ranijim predstavljanjima pojavljivala pod svojim radnim imenom - Blok51. ARB 8051 je uspešno testiran na sledećim C/C++ kompajlerima: Borland C/C++ 3.1; 4.5 i 5.0. Pre nego što pređemo na konkretne primere, važno je ukazati na sličnosti i razlike između programiranja uz pomoć ARB 8051 i drugih oblika programiranja, asemblera i viših programskih jezika. Najvažnija sličnost sa asemblerom jeste u tome što se svaka linija programa može prevesti na odgovarajuću asemblersku instrukciju, u našem slučaju na jednu iz seta instrukcija Intel-ovog mikrokontrolera 8051. Drugim rečima korišćenjem biblioteke klasa i funkcija ARB 8051 možemo realizovati optimalne izvršne kodove kao da smo program stvarali u nekom od kros-asemblera. Na drugoj strani zahvaljujući ogromnoj snazi jezika C/C++ dolazimo do mogućnosti da realizujemo sopstvene klase i funkcije i tako formiramo programsku notaciju sličnu onoj iz viših programskih jezika. Time konačno dajemo potvrdan odgovor na pitanja postavljena u uvodu ovog članka. Osim toga, ista ili slična notacija može da se primeni na više različitih mikrokontrolera pa ARB postaje univerzalno programsko oruđe u poslovima programiranja mikrokontrolera. Za sada će biti predstavljena biblioteka ARB za već pomenutu Intel-ovu familiju mikrokontrolera 8051 (i druge kompatibilne mikrokontrolere na nivou procesora kao što je mikrokontroler firme ATMEL na primer) ali u perspektivi možemo računati na pojavljivanje istovetne softverske podrške i za druge popularne mikrokontrolere. Primer koji će, nadamo se, uspešno demonstrirati snagu metoda ARB (listing 1 i 2) treba isključivo posmatrati kao jedno-stavnu prezentaciju onoga što je do sada rečeno. Uporedni prikazi programskih sekvenci izvornih kodova u asembleru i ARB-u imaju za cilj da bez mnogo reči ilustruju većinu svojstava programske bi-blioteke ARB.
Potpuno ekvivalentan deo primenom biblioteke klasa i funkcija u ARB 8051 je predstavljen na listingu 2. zahvaljujući već pomenutom svojstvu ove biblioteke da se svaka instrukcija mikrokontrolera 8051 može jednoznačno prevesti na odgovarajuću programsku liniju C++ programa. Šta nam zapravo donosi ARB? Umesto imena pojedinih instukcija, tj. skraćenih opisa akcija pojedinih instrukcija , koristimo operatorsku notaciju koja je, mora se to priznati, mnogo prihvatljivija i za iskusne korisnike pojedinih mikrokontrolera. Drugo, delovi programa su organizovani u blokove što dodatno olakšava proces programiranja. Treće, mnogobrojne instrukcije relativnog skoka zamenjene su sa tri osnovne blokovske funkcije ( napusti(), opet(), proboj() ) i jednom samostalnom funkcijom skok(). Blokovske funkcije napusti() i opet() podsećaju na C naredbe break i continue, a funkcija proboj() u kombinaciji sa funkcijom osim() na izvestan način simulira postojanje standardne naredbe if…else. Samostalna funkcija skok() odražava potrebu za postojanjem naredbe tipa goto , koja je ipak nezamenljiva kada je u pitanju sistemsko programiranje, u kakvo svakako spada i programiranje za mikrokontrolere. Treba naglasiti (što se inače ne vidi iz datih primera) da postoje imenovani i neimenovani blokovi, da se blokovi mogu razbijati u segmente, da je moguće uskakati iz segmenta u segment itd. Pozivanje samostalne funkcije skok()
je vezano upravo za tzv. imenovane blokove što znači da je reč o instrukciji
skoka na početak bloka čija je deklaracija : blok ImeBloka(IDENTIFIKATOR) gde je
IDENTIFIKATOR celobrojna konstanta čija se de-klaracija mora oba-viti na po-četku
programa. Osim toga metod ARB omogućava i vrlo fleksibilno korišćenje instrukcija
poziva potprograma, instrukcije dugog skoka, instrukcije rotacije sadržaja akumulatora
kao i specifične instrukcije kao što je međuregistarska razmena sadržaja, rotacija
niblova, decimalno podešavanje itd. Kada je u pitanju pozivanje programskih rutina treba
uočiti da ARB podržava pozivanje procedura predajom vrednosti identifikatora bloka
procedure kao i predajom imena procedure čime se dolazi do značajne mogućnosti
formiranja sopstvenih biblioteka potprograma. Sve ovo potkrepićemo jednim konkretnim
primerom iz prakse kao što je komunikacija između računara i mikrokontrolerskog
uređaja. Biće predstavljen program koji je u potpunosti realizovan u ARB-u i koji je
potvrđen u praksi a radi se o transferu niza znakova iz računara u uređaj i obrnuto.
Izvršenje programa čiji je izvorni kod smešten u datoteci string.cpp treba da obezbedi
prijem niza čiji prvi i poslednji znaci ( 0x04 i 0x05 ) treba da mirokontroleru
signaliziraju startovanje odnosno okončavanje procesa prijema niza. Funkcijaizbor“string.a01”,INTEL_HEX) obavlja specificiranje “izvršnog” fajla u kome se nalazi kod odgovarajućeg formata, određen drugim parametrom ove funkcije. Ukoliko se ova funkcija izostavi krajnji proizvod prevođenja , povezivanja i izvršenja programa string biće sadržan u datoteci aout.a01. Ukoliko je izabrana opcija INTEL_HEX dobijamo kao krajnji produkt tekstualnu datoteku istoimenog formata koja je veoma pogodna za kasniju obradu. Pored ovoga, postoji i mogućnost generisanja odgovarajuće binarne datoteke. Programskom linijom LB=0, smeštamo izvršni kod od lokacije 0h a deklaracijom blokovske promenljive Start i kasnijom definicijom pomoću funkcije oblik() odlučujemo se za “razbijeni” (razlomljeni) memorijski blok koji se izvršava prilikom resetovanja mikrokontrolera kao i u slučaju dešavanja interapta. U prvom slučaju program se
izvršava od linije : blok GlavniProgram(MAIN) a u drugom u zavisnosti od vrednosti bitova
ri odnosno ti. U glavnom programu obavlja se neophodno konfigurisanje mikrokontrolera (
funkcija Inic() ), dodeljivanje adrese stringa ( u našem slučaju r0 koji ukazuje na
internu memoriju ) da bi na kraju program upao u mrtvu petlju. U prekidnim rutinama, kao
što je već rečeno, mikrokontroler komunicira sa glavnim računarom.
Daljim razmišljanjem dolazi se do najmanje dve ideje:
O ovim i drugim mogućnostima ove programske biblioteke biće više reči u narednim brojevima časopisa.
|
|
C o p y r i g h t 1998 mikroElektronika. All Right Reserved. Za sva pitanja obratite se redakciji |