Wstęp do języka C na procesor 8051 (kompilator RC51)
Kompilator języka C Kompilator RC51 jest kompilatorem języka C w standardzie ANSI Ograniczeń w stosunku do ANSI jest niewiele głównie rzadkie operacje zmiennoprzecinkowe Rozszerzeń jest bardzo wiele. Wynika to między innymi z istnienia różnych instrukcji CALL i JMP istnienia różnych obszarów pamięci możliwości adresowania bitowego pamięci RAM Objawią się one w postaci nowych słów kluczowych nowych dyrektyw kompilatora nowych reguł składni
Pierwszy program w C #include <stdio.h> #include <reg51.h> void main(void) { printf ("\nhello world!"); while (1); } Gdzie zostanie wypisany łańcuch tekstowy??? Uwaga na pętlę końcową
Praktycznie każdy program C Praktycznie każdy nietrywialny program Może wymagać uzupełnienia rozbiegówki w inc/sources/8051/rc51/startup.a51 Będzie wymagał napisania podstawowych procedur we/wy putchar.a51
Słowa kluczowe
Kwalifikatory pamięci Określają rodzaj pamięci, w której mają być umieszczone zmienne data bezpośrednio adresowana wewnętrzna pamięć RAM (128B) idata pośrednio adresowana wewnętrzna pamięć RAM (128B lub 256B) xdata zewnętrzna pamięć RAM pdata zewnętrzna pamięć RAM w specjalnym trybie dla symulowanego stosu bdata bitowo adresowalna wewnętrzna pamięć RAM (128B lub 256B) np. xdata char zm1; idata char zm2;
Kwalifikatory pamięci bit Określa bit w pamięci adresowalnej bitowo Wskaźniki (pointery) nie mogą wskazywać zmiennych typu bit Operator & nie jest dopuszczalny dla tych zmiennych Funkcja może zwracać wartość typu bit np. bit Flaga0;
Kwalifikatory pamięci sfr Określa zmienną w obszarze rejestrów specjalnego przeznaczenia Wskaźniki (pointery) nie mogą wskazywać zmiennych typu sfr Operator & nie jest dopuszczalny dla tych zmiennych Możliwe są tylko kwalifikatory int i char Zastępczym typem jest char bez znaku Zmienne SFR są predefiniowane w dostarczonym zbiorze nagłówkowym np. sfr at 0x82 DPL; sfr at 0x83 DPH;
Kwalifikatory pamięci sbit Określa bit w obszarze rejestrów specjalnego przeznaczenia Konieczna jest absolutna alokacja adresu Zmienne sbit są predefiniowane w dostarczonym zbiorze nagłówkowym składnia: name = sfr_name[^bit_number] np. sbit OV = PSW^2;
Kwalifikatory pamięci generic Używany tylko przy deklaracji wskaźników Informuje, że wskaźnik może wskazywać na pamięć dowolnego typu Wskaźnik generic ma rozmiar trzech bajtów Operacje na tego typu wskaźnikach mogą być dosyć kosztowne np. char generic *ptr1;
Adresy absolutne at Za pomocą kwalifikatora at można nadać zmiennej stały adres Jego argumentem jest liczba całkowita (lub wyrażenie) Może on być stosowany dla zaadresowania funkcji np. xdata at 0xFF08 char COM1; at 20 data char Byte01; at 0xF000 char HighFunction();
Przerwania interrupt interrupt <numer> definiuje funkcję obsługującą przerwanie Jego argumentem jest liczba całkowita (lub wyrażenie) Wektor przerwania wyniesie 3 + <numer> * 8 Zachowane są rejestry ACC, B, PSW, DPH, DPL Zwykle określa się alternatywny bank rejestrów (using) np. void ft0 (void)interrupt 1 { counter++; }
Zestawy rejestrów using using <numer> definiuje bank rejestrów używany przez funkcję Zwykle bywa używany z przerwaniami np. void fct1 (void) using 1 { /*. */ ;}
Modele pamięci
Modele pamięci Model pamięci określa sposób alokacji zmiennych w pamięci oraz instrukcje CALL i JMP używane przez kompilator RC51 dopuszcza kompilowanie różnych funkcji z różnymi modelami inne kompilatory często nie Każdy model implikuje linkowanie innych bibliotek mieszane modele mogą zatem powodować powstanie dużego kodu przed niestandardowymi rozwiązaniami przeanalizuj rzecz bardzo dokładnie
Pragmy Pragmy to parametry przekazywane kompilatorowi. Dzielą się na pragmy otoczenia określają kontekst kompilacji pragmy implementacji wpływają na generowany kod Mogą być przekazane kompilatorowi poprzez parametry wywołania: RC51 raison.c LARGE PIN(C:\RC\INCLUDE) oraz w źródle programu #pragma SMALL #pragma DEBUG NOINTPROMOTE /* several controls may be combined */