Elektronika

Edukativni tekstovi iz sveta elektronike

Forum

Unapredimo zajedno sadržaj sajta

Mali oglasi

Postavite besplatno vaše male oglase iz elektronike.

Projekat

Projekti iz elektronike za samogradnju

Vesti

Saznajte najnovija dešavanja iz elektronike u svetu i kod nas

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.

Popularity: 27% [?]

Leave your response!

You must be logged in to post a comment.