MCS-51
Opis rozszerzeń języka C w kompilatorze SDCC

Typy danych

Kompilator SDCC umożliwia stosowanie w programach nie tylko standardowych typów danych zdefiniowanych w standardzie ANSII C, lecz również kilku typów, które są specyficzne dla architektóry mikrokontrolerów rodziny MCS-51. Poniżej podano spis typów danych akceptowanych przez ten kompilator.

Typ danej Liczba bitów Liczba bajtów Zakres wartości
min max
bit 1 0 lub 1
char 8 1 -128 127
unsigned char 8 1 0 255
short int 16 2 -32768 32767
unsigned short int 16 2 0 65535
int 16 2 -32768 32767
unsigned int 16 2 0 65535
long int 32 4 -2147483648 2147483647
unsigned long int 32 4 0 4294967295
float 32 4 ±1.175494E-38 ±3.402823E+38
Uwaga Mikrokontrolery rodziny MCS-51 są układami 8-bitowymi, dlatego w programach należy głównie stosować 8-bitowe typy danych, gdyż wtedy do kodowania poszczególnych linii kodu kompilator stosuje bezpośrednio pojedyncze rozkazy mikrokontrolera. W przeciwnym wypadku kompilator korzysta z odpowiednich funkcji bibliotecznych, co znacznie zwiększa długość generowanego kodu.

Typ bitowy

Typ bitowy został wprowadzony w kompilatorze SDCC ze względu na fakt istnienia w mikrokontrolerach rodziny MCS-51 obszaru pamięci adresowanego bitowo. Zmienne deklarowane z użyciem słowa kluczowego bit nie różnią się od innych zmiennych oprócz faktu, że zajmują obszar pamięci równważny jednemu bitowi, a przez to mogą przyjmować tylko wartość 0 lub 1. Poniżej przedstawiono przykład deklaracji zmiennej bitowej o nazwie flaga.

bit flaga;

Wszystkie zmienne typu bit są lokowane w wewnętrznej pamięci danych mikrokontrolera adresowanej bitowo. Ponieważ przestrzeń ta ma rozmiar tylko 16 bajtów, to w zasięgu jednej deklaracji może być definiowane maksymalnie 128 zmiennych typu bit. Poniżej przedstawiono ograniczenia stosowania deklaracji zmiennych typu bit:

  • Nie można deklarować wskaźników do zmiennych typu bit, np.
    bit *wskaznik;			// NIEDOZWOLONE
  • Nie można również deklarować zmiennych tablicowych o elementach typu bit.
    bit tablica[5];			// NIEDOZWOLONE

Rejestry specjalne

Rodzina mikrokontrolerów MCS-51 posiada specjalną przestrzeń pamięci, w obszarze wewnętrznej pamięci danych adresowanej bezpośrednio, w której znajdują się rejestry specjalne (ang. Special Function Registers) umieszczone w zakresie adresów od D:0x80 do D:0xFF. Rejestry te są używane m.in. do kontroli i sterowania licznikami-czasomierzami, portem szeregowym i równoległymi portami wejścia-wyjścia. Dostęp do nich może być realizowany na poziomie bitów lub bajtów.

Wewnątrz wspomnianej rodziny mikrokontrolerów istnieje wiele klonów o rozbudowanej konfiguracji rejestrów SFR w stosunku do podstawowej wersji 8051 lub 8052. Sam kompilator SDCC nie ma predefiniowanych nazw rejestrów SFR. Ich definicje są dołączane przy pomocy plików nagłówkowych '*.h'. Kompilator umożliwia dostęp do rejestrów SFR za pomoca nazw deklarowanych przy pomocy słów kluczowych sfr i sbit.

sfr at 0x80 P0;      //port 0, adres 80h
sfr at 0x90 P1;      //port 1, adres 90h
sfr at 0x98 SCON;    //rejestr SCON, adres 98h
sfr at 0x89 TMOD;    //rejestr TMOD, adres 89h

Dzięki takim deklaracjom możliwe jest odnoszenie się do poszczególnych rejestrów w programie poprzez nazwy.

P0 = 0x00;           //zapis wartości 0x00 do portu P0
SCON = 0x52;         //zapis wartości 0x52 do rejestru SCON

W typowych aplikacjach często wymagany jest dostęp do pojedynczych bitów rejestrów specjalnych. Kompilator SDCC umożliwia taki dostęp poprzez deklarację tych bitów z wykorzystaniem słowa kluczowego sbit (dotyczy to wyłącznie rejestrów adresowanych bitowo tj. tych, które są ulokowane pod adresami podzielnymi bez reszty przez 8).

sbit at 0x82 P0_2;   //linia 2 portu P0
sbit at 0x98 RI;     //znacznik odbioru informacji przez potr szeregowy