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

Adresowanie układów we/wy

Bardzo często systemy mikroprocesorowe projektowane są w taki sposób, aby układy peryferyjne, jak przetworniki A/C i C/A lub sterowniki wyświetlaczy LCD i LED, były 'widziane' przez mikrokontroler jako komórki zewnętrznej pamięci danych. Każdy z takich układów zajmuje przeważnie obszar nie większy niż kilka bajtów, a bardzo często ogranicza się nawet do 1 bajta. Dzięki takiemu podejściu dostęp do tych układów może odbywać się z wykorzystaniem instrukcji zapisu i odczytu zewnętrznej pamięci danych, ale odwołując się tylko pod określone adresy. Dlatego w takim wypadku przy pisaniu programów odnoszących się do takich układów wygodnie jest zastosować podejście przedstawione w punkcie Alokacja zmiennej pod określonym adresem. Mianowicie, należy zadeklarować zmienną umieszczając ją pod określonym adresem, pod którym 'widziany' jest dany układ.

volatile xdata at 0xF800 unsigned char CA;

Słowo kluczowe volatile informuje kompilator, że dostęp do danej zmiennej nie powinien być poddawany optymalizacjom. Kompilator nie może więc zakładać, że w jakimś fragmencie kodu, w którym istnieją odwołania do tej zmiennej, jej wartość nie uległa zmianie i przez to usuwać te odwołania.

Przy takiej deklaracji odczyt wartości z przetwornika C/A do jakiejś zmiennej wymaga napisania następującej linii kodu.

wynik = CA;

Przy założeniu, że przetwornik C/A jest 8-bitowy i unipolarny, zmienna wynik powinna być typu unsigned char.

W przypadku, gdy dany układ zajmuje obszar kilku bajtów, można do dostępu do niego wykorzystać tablice. Dla przykładu, jeśli układem zewnętrznym jest 8-kanałowy przetwornik A/C, a jego poszczególne kanały są widoczne jako kolejne komórki zewnętrznej pamięci danych począwszy od adresu 0xFC00, to poniższa deklaracja

volatile xdata at 0xFC00 unsigned char KANALY_AC[8];

umożliwia łatwy dostęp do tychże kanałów.

KANALY_AC[0] = 0xFF;
KANALY_AC[3] = 127;

Dwie powyższe instrukcje zapisują odpowiednie wartości odpowiednio do zerowego i trzeciego kanału przetwornika. Oczywiście przy adresowaniu komórek tablicy można również posługiwać się zmiennymi, tzn. dopuszczalny jest następujący kod programu

unsigned char kanal;
...
...
kanal = 1;
...
...
KANALY_AC[kanal] = 127;
...