Kompilator języka C na procesor 8051 RC51 implementacja
Implementowane typy danych bit 1 bit char lub char signed 8 bitów char unsigned 8 bitów int lub signed int 16 bitów unsigned int 16 bitów long lub signed long 32 bity unsigned long 32 bity float 32 bity (BCD lub IEEE) double 48 bitów (tylko BCD) long double 56 bitów (tylko BCD)
Implementowane typy danych wskaźniki RC51 oferuje dwa rodzaje wskaźników:... kwalifikowane, wskazujące dane w określonym typie pamięci... generic, mogące wskazywać obiekt w dowolnym obszarze pamięci Void Example() { code char *cptr; // rozmiar 2 bajty xdata char *xptr; // rozmiar 2 bajty idata char *iptr; // rozmiar 1 bajt char generic *gptr; // rozmiar 3 bajty dptr = gptr; // błąd gptr = dptr; // poprawne xptr = dptr; // błąd xptr = (char xdata*) dptr; // poprawne }
Implementowane typy danych wskaźniki generic Wźniki generic oprócz 16 bitowego adresu... zawierają jeszcze bajt kwalifikatora przestrzeni adresowej: 0x00 null 0x01 idata 0x02 xdata 0x03 pdata 0x04 data 0x05 code 0xFF zarezerwowany dla procedur we/wy
Zmienne automatyczne i statyczne Zmienne lokalne funkcji mogą być: Automatyczne... są tworzone przy wywołaniu funkcji... oraz usuwane przy powrocie do miejsca wywołania;... zgodnie ze specyfikacją ANSI otrzymują wartość początkową 0... ale można zabronić tego działania w opcjach kompilatora RC51 Składnia: auto unsigned int MOJ_LICZNIK; Słowo kluczowe auto jest opcjonalne.
Zmienne automatyczne i statyczne Zmienne lokalne funkcji mogą być: Statyczne... są lokalne dla danej funkcji... ale ich wartość jest zachowana pomiędzy wywołaniami;... zgodnie ze specyfikacją ANSI otrzymują wartość początkową 0... ale można zabronić tego działania w opcjach kompilatora RC51 Składnia: static unsigned int MOJ_LICZNIK; (Wszystkie zmienne globalne są oczywiście statyczne)
Jeszcze o modelach pamięci model TINY Model pamięci TINY... jest przeznaczony do bardzo małych programów... kod ograniczony do 2 kb (używane rozkazy AJMP i ACALL)... pamięć danych: wewnętrzna RAM 128 B Ustawiany przez pragmę: #pragma TINY lub przy uruchomieniu kompilatora: RC51 test.c TINY NOINTPROMOTE
Jeszcze o modelach pamięci model SMALL Model pamięci SMALL... może być użyty do małych i dużych programów... stosowany gdy zależy nam na prędkości działania... pamięć danych: wewnętrzna RAM 128 B... należy unikać zbędnych zmiennych globalnych... oczywiście można używać kwalifikatorów idata (stos!) oraz xdata Ustawiany przez pragmę: #pragma SMALL lub przy uruchomieniu kompilatora: RC51 test.c SMALL
Jeszcze o modelach pamięci model COMPACT Model pamięci COMPACT... może być użyty do małych i dużych programów... stosowany gdy mamy trochę większą liczbę zmiennych... ale czas dostępu do nich nie jest krytyczny (MOVX A,@Ri)... pamięć danych: wewnętrzna RAM 128 lub 256 B, zewnętrzna do 256B... dosyć rzadko używany Ustawiany przez pragmę: #pragma COMPACT lub przy uruchomieniu kompilatora: RC51 test.c COMPACT
Jeszcze o modelach pamięci model LARGE Model pamięci LARGE... może być użyty do małych i dużych programów... stosowany gdy mamy dużą liczbę zmiennych... ale czas dostępu do nich nie jest krytyczny (MOVX A,@DPTR)... pamięć danych: wewnętrzna RAM 128 lub 256 B, zewnętrzna... ograniczony stos Ustawiany przez pragmę: #pragma LARGE lub przy uruchomieniu kompilatora: RC51 test.c LARGE
Jeszcze o modelach pamięci model HUGE Model pamięci HUGE... stosowany gdy mamy dużą liczbę zmiennych i wywołań funkcji... ale czas dostępu do nich nie jest krytyczny (MOVX A,@DPTR)... pamięć danych: wewnętrzna RAM 128 lub 256 B, zewnętrzna... stos symulowany w pamięci zewnętrznej Ustawiany przez pragmę: #pragma HUGE lub przy uruchomieniu kompilatora: RC51 test.c HUGE
Jeszcze o modelach pamięci W zależności od modelu pamięci i typu danych... linker połączy róźne biblioteki
Dodatkowe funkcje wewnętrzne Jest to rozszerzenie języka ANSI C umieszczają one bezpośrednio w kodzie... instrukcje, których kompilator nie jest w stanie wygenerować. pełna lista jest w pliku intrinis.h Przykłady: void _nop_ (void) bit _testbit_ (bit b) zwraca wartość bitu i zeruje go unsigned char _cror_ (unsigned char c, unsigned char n) obrót zmiennej c w prawo o n bitów unsigned int _iror_ (unsigned int i, unsigned char n) podobnie... unsigned long _lror_ (unsigned long l, unsigned char n) itd... unsigned char _swapnibble_ (unsigned char c)
Pragmy otoczenia Pragmy otoczenia definiują kontekst działania kompilatora. Na przykład #pragma PATHINCLUDE(path) #pragma WARNINGLEVEL(level) #pragma MAXERR(number) #pragma MAXWAR(number) #pragma DEBUG Liczne są pragmy sterujące wydrukiem z kompilacji, na przykład #pragma PRINT #pragma LISTINCLUDE #pragma SYMBOLS #pragma CODE
Pragmy otoczenia Pragma ASM umożliwia włączenie kodu w assemblerze #pragma ASM jmp $ #pragma NOASM
Pragmy implementacji Wpływają na kod tworzony przez kompilator Pragmy sterujące użyciem pamięci... definiują model pamięci #pragma SMALL... włączają automatyczne zmienne #pragma AUTO... ustalają aktualny bank rejestrów #pragma REGISTERBANK(nr)... wyłączają przerwania #pragma DISABLE... wyłączają przekazywanie parametrów poprzez rejestry #pragma REGPARMS... sterują optymalizacją