Elektronika

Edukativni tekstovi iz sveta elektronike

Komponente

Opisi komponenata koje se koriste u elektronici

Novosti

Najnovije vesti iz elektronike i ostalih srodnih oblasti

Projekat

Projekti iz elektronike za samogradnju

Rečnik

Rečnik pojmova iz elektronike i računarstva

Početna » Programiranje

Bit instrukcije PIC mikrokontrolera

Autor | Subota, 27. Jun 2009.Nema komentara

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.