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 |
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