Bit instrukcije PIC mikrokontrolera
PIC mikrokontroleri imaju specifične instrukcije koje su u stanju da manipulišu sa bitima. Ove instrukcije se uglavnom svode na setovanje i brisanje određenog bita u okviru nekog bajta. Gde god je moguće Hi-Tech C će pokušati da iskoristi ove instrukcije radi optimizacije koda.
Kao primer prethodno iznetim tvrdnjama, navešćemo sledeću situaciju: kada se preko ili funkcije i određene maske pokušavaju postaviti određeni biti registra mikrokontrolera, kompajler će proveriti da li se sa instrukcijama koje operišu sa bitima može postići ista funkcionalnost i na taj način da se proizvede optimalniji kod. Sledeći primer napisan u C-u:
unsigned int foo; foo |=0x40;
kreiraće sledeću instrukciju u programu
bsf _foo,6
Da bi se obrisao ili setovao individualni bit u nekoj integer promenljivoj, mogu se kreirati sledeći makroi:
#define bitset(var, bitno) ((var) |= 1UL << (bitno)) #define bitclr(var, bitno) ((var) &= ~(1UL << (bitno)))
Izraz sa početka teksta sada se jednostavno može napisati na način da svima bude razumljiv:
bitset(foo,6);
I ovakav izraz zauzima samo jednu reč u memoriji. Pogledajmo ovo na konkretnom primeru:
#include
#define bitset(var, bitno) ((var) |= 1UL << (bitno))
#define bitclr(var, bitno) ((var) &= ~(1UL << (bitno)))
unsigned char temp;
unsigned char pos;
void main(void) {
bitset(temp,4);
pos = 4;
bitclr(temp,2);
bitclr(temp,pos);
}
Izdvojimo deo koda koji je kompajler kreirao za pozive bitclr makroa.
bitclr(temp,2);
07F0 1121 BCF 0x21, 0x2
bitclr(temp,pos);
07F1 3001 MOVLW 0x1
07F2 00F0 MOVWF 0x70
07F3 0820 MOVF 0x20, W
07F4 00F1 MOVWF 0x71
07F5 0AF1 INCF 0x71, F
07F6 2FF9 GOTO 0x7f9
07F7 1003 BCF 0x3, 0
07F8 0DF0 RLF 0x70, F
07F9 0BF1 DECFSZ 0x71, F
07FA 2FF7 GOTO 0x7f7
07FB 0970 COMF 0x70, W
07FC 05A1 ANDWF 0x21, F
Na ovom primeru se jasno vidi da ukoliko se uzme konstanta za poziciju bita koji treba obrisati kompajler kreira kod koji to radi u jednoj instrukciji. Ukoliko se za poziciju bita postavi promenljiva, tada kompajler dodaje neophodan kod veličine 12 reči. Iz navedenog primera se vidi da kompajler vodi računa o optimizaciji koda i da koristi ugrađene pogodnosti PIC mikrokontrolera.
Napomena: 1UL predstavlja broj 1 u unsigned long formatu.
Leave your response!
You must be logged in to post a comment.