Bit varijable
Bolova algebra kao osnovni jezik računara poznaje samo dve različite vrednosti: tačno i netačno. Neophodna veličina promenljivih za prikazivanje ovih podaka iznosi samo 1 bit. U ovom tekstu objasnićemo potrebu za bit promenljivima i kako je to rešeno u nekim C kompajlerima za mikrokontrolere.
Programski jezici i bit promenljive
Neki programski jezici poseduju tip podataka koji se naziva bool (C++) ili boolean(pascal) za rad sa bulovom algebrom. Vrednosti koje se mogu dodeliti ovim promenljivima simbolički su predstavljene rečima true i false.
Programski jezik C u svojoj standardnoj definiciji ne poseduje poseban tip podataka koji bi radio sa bulovom algebrom. Za rad sa bulovom algebrom koristi se tip podataka unsigned char
veličine 1 bajta. Smatra se da promenljiva unsigned char
ima vrednost netačno ukoliko sadrži vrednost 0, a vrednost tačno ukoliko sadrži vrednost različitu od nule. Vrednost promenljive je tačno bez obzira da li promenljiva sadrži broj 1 ili 17.
Potreba za bit promenljivima
U većini kompajlera, koji se koriste za mikrokontrolere, uveden je tip podataka bit, koji je dodat radi optimalnog iskorišćenja malog broja unutrašnjih registara, kao i za direktan pristup digitalnim izlazima mikrokontrolera.
Ovo ćemo probati da objasnimo na praktičnom primeru. Mikrokontroleri zasnovani na i8051 strukturi poseduju samo 128 slobodnih registara koji mogu služiti za smeštanje promenljivih. Ukoliko u programu treba kreirati 24 promenljive koje će sadržati samo podatke bulove algebre, tada imamo situaciju da kada ih predstavimo u klasičnom obliku, ove promenljive zauzimaju 18.75% memorije. U ovom slučaju se pravilno iskorištava samo jedna osmina podataka, a ostatak se ne koristi. Dakle 16.41% memorije je bespotrebno zauzeto. Rešenje ovog problema jeste da se 24 logičke promenljive spakuju u 3 registra veličine 1 bajt svaki i na ovaj način da se uštedi 21 memorijska lokacija.
Druga situacija u kojoj je neophodno imati varijablu veličine jednog bita, je kada je ta varijabla vezana za neki digitalni ulaz/izlaz mikrokontrolera. Očitavanjem stanja ulaza možemo dobiti samo vrednosti nula ili jedan, a isto prilikom ispisivanja na taj izlaz možemo ispisati samo vrednosti logičke nule ili jedinice. Ovo indicira besmislenost prosleđivanja varijable sa vrednošću različitom od ove dve na neki digitalni izlaz.
Ljudi koji projektuju mikrokontrolere vode računa o ovakvim situacijama, tako da često svi mikrokontroleri imaju ugrađenu hardversku podršku za manipulisanje bitima u okviru registara kao i povezivanje tih bita direktno sa digitalnim ulzima/izlazima mikrokontrolera. Ovo znači da postoje hardverske instrukcije koje služe za postavljanje i brisanje vrednosti određenih bita registara. Registri kod kojih je ovako nešto dozvoljeno uglavnom se nalaze u bit adresibilnoj zoni i nad ovim registrima omogućene su dodatne instrukcije koje nisu omogućene nad svim registrima. Proizvođači kompajlera vode računa da se ovakve mogućnosti iskoriste, pa iz tog razloga u svoje c kompajlere uvode podršku za bit tip podataka.
PICC kompajler i bit promenljive.
U programskom jeziku C za PIC mikrokontrolere bit varijable mogu biti deklarisane uz pomoć ključne reči bit. Bit objekat u okviru neke funkcije može se alocirati na sledeći način:
static bit neki_bit;
Ovaj objekat biće alociran u bit adresabilnoj zoni. Ukoliko napišemo sledeću deklaraciju izvan funkcija:
bit neki_bit;
taj bit biće vidljiv kao globalna promenljiva u okviru fajla.
Bit promenljive ne mogu biti korištene kao parametar funkcije, ali funkcija može kao svoj rezultat vratiti bit objekat. Da bi ovo bilo izvršeno potrebno je postaviti ključnu reč bit u prototipu funkcije na uobičajeni način. Povratna vrednost funkcije biće vraćena preko carry flag-a u statusnom registru.
Bit varijable se u PICC kompajleru ponašaju kao klasične unsigned char
promenljive, ali one mogu imati samo vrednost 1 ili 0.
Operacije nad bit promenljivama se izvršavaju preko instrukcija bsf i bcf, gde god je to moguće. Kod koji se generiše na ovakav način je veoma efikasan.
Napomena:
- Nije moguće kreirati pokazivače na bit promenljive, niti statički ih inicijalizovati.
- Ukoliko se definiše flag –STRICT, korišćenje ključne reči bit nije moguće.
KEIL Cx51 kompajler i bit promenljive
Cx51 kompajler obezbeđuje tip podataka bit koji može biti korišten za deklarisanje promenljivih, kao argument u funkcijama i kao povratna vrednost funkcija. Bit promenljiva se deklariše kao i svaka druga C promenljiva. Na primer:
static bit done_flag = 0; /* bit promenljiva */
bit testfunc ( /* bit funkcija */
bit flag1, /* bit argumenti */
bit flag2)
{
.
.
.
return (0); /* bit povrtna vrednost */
}
Sve promenljive tipa bit su smeštene u internoj oblasti memorije 8051 mikrokontrolera. Ova oblast je veličine 16 bajtova i u njoj se može deklarisati maksimalno 128 različitih bit promenljivih.
Ograničenja pri korišćenju bit tipa podataka
U deklarisanju bit promenljivih dozvoljeno je korišćenje isključivo data i idata oznaka za memoriju. Bit varijable ne mogu biti smeštene u drugim memorijama (eeprom, code, xdata…) i pokušaj smeštanja u njih izazvaće grešku prilikom kompajliranja. Deklarisanje pokazivača na bit varijablu nije dozvoljeno, a takođe ni kreiranje niza bitova.
bit xdata b; /* invalid */
bit *ptr; /* invalid */
bit ware [5]; /* invalid */
sbit tip podataka
Često se dešava da je potrebno pri razvoju aplikacije za i8051 mikrokontrolere, pristupiti individualnom bitu u nekom registru koji se nalazi u okviru SFR oblasti. Cx51 kompajler omogućava ovu operaciju preko sbit tipa podataka. Na primer:
sbit EA = 0xAF;
Ova deklaracija definiše EA promenljivu koja se nalazi u SFR zoni na adresi 0xAF. U i8051 mikrokontroleru ovo predstavlja bit enable all u registru za omogućavanje interapta.
U deklaraciji sbit promenljive može se upotrebiti bilo koje ime kao i za svaku drugu promenljivu. Izraz sa desne strane od znaka jednakosti predstavlja apsolutnu adresu bita koju označava dodeljeno ime.
Postoje tri varijante za dodelu adrese simboličkom imenu promenljive tipa sbit.
Varijanta 1.
sbit name = sfr-name^bit-position;
Oznaka sfr-name
predstavlja osnovnu adresu promenljive tipa sbit. Mora biti deljiva sa 8. Druga oznaka bit-position
, mora biti broj u intervalu od 0-7, koja sledi iza simbola ^ predstavlja poziciju bita kojem se pristupa. Primer.
sfr PSW = 0xD0;
sfr IE = 0xA8;
sbit OV = PSW^2;
sbit CY = PSW^7;
sbit EA = IE^7;
Varijanta 2.
sbit name = sfr-address^bit-position;
Osnovna adresa sbit promenljive određena je konstantom sfr-address
, koja mora biti deljiva sa 8. . Druga oznaka bit-position
, mora biti broj u intervalu od 0-7, koja sledi iza simbola ^ predstavlja poziciju bita kojem se pristupa. Primer.
sbit OV = 0xD0^2;
sbit CY = 0xD0^7;
sbit EA = 0xA8^7;
Varijanta 3.
sbit name = sbit-address;
Adresa je predstavljena konstantom sbit-address
. Ova konstanta mora imati vrednost u intervalu 0x80
do 0xFF
. Primer:
sbit OV = 0xD2;
sbit CY = 0xD7;
sbit EA = 0xAF;
Napomene:
- SFR je skraćenica od engleskih reči special function registar, što u prevodu znači registri specijalne namene.
- Nisu svi registri posebne namene bit adresabilni. Samo one lokacije čija je adresa deljiva sa 8 su bit adresabilne. Na primer
0xB8
jeste bit adresabilan registar, dok0xA9
nije. Adresa nekog bita se dobija tako što se na adresu bajta koji ga sadrži doda pozicija bita u okviru njega. Dakle da bi smo pristupili 4 bitu registra na adresi 0xC8 u SFR oblasti treba mu pristupiti preko adrese0xCC (0xC8 + 4)
. - Sbit tip podataka može biti korišten za pristup individualnim bitima promenljivih deklarisanih sa bdata memorijskom oznakom.
- Sbit promenljive se ne mogu deklarisati unutar funkcija. One moraju biti deklarisane izvan tela funkcija.
Leave your response!
You must be logged in to post a comment.