Często można spotkać wielkie banery, napisy lub nawet tytuły kursów i książek: “C dla AVR”, “Kurs C dla STM32”. Może to powodować takie wrażenie, że ten język C jest dla każdego mikrokontrolera inny. Tym bardziej już dla komputera, prawda?
Zastanówmy się w takim razie czym się różni język C dla mikrokontrolerów od języka C dla PCtów?
Podział na PC i MCU – czy to ma sens?
Po pierwsze wypadałoby się zastanowić czy taki podział w ogóle istnieje.
Według mnie taki podział nie jest do końca na miejscu. Język C to język C. Kropka. Zawiera on kilkadziesiąt słów kluczowych opisujących różne instrukcje, typy danych, specyfikatory itd. Dokładnie tych samych używamy pisząc programy na PCta i takie same pisząc programy na mikrokontrolery.
To gdzie jest różnica?
Różnice o jakich powinniśmy rozmawiać są na poziomie korzystania z tego języka. Trochę inaczej będziemy pisali programy na MCU, trochę inaczej na PC. Mamy dostępne te same instrukcje, ale z jednych będziemy korzystali częściej, a z drugich rzadziej. To o to tutaj chodzi.
Operacje bitowe to codzienność
Operacje bitowe są na porządku dziennym kiedy piszemy kod dla mikrokontrolera. Serio.
Na studiach podczas nauki programowania w języku C uczyliśmy się na PCtach. Nie pamiętam, abym przy okazji pisania różnych algorytmów sortowania, przeszukiwania drzew, Djikstry itd. potrzebował operacji bitowych. Wszystko robiło się na “całych” bajtach.
Inaczej jest na mikrokontrolerze. Przy dostępie do rejestrów, gdy chcesz ustawić jakiś parametr to dostęp bitowy jest obowiązkowy. Dlaczego? Bo w jednym rejestrze każdy bit może odpowiadać za inną rzecz. W układach scalonych oszczędza się na krzemie, więc wszystko jest mocno upakowane.
Więc jeśli chcesz coś zmienić w tak upakowanych danych to musisz wykonać kilka operacji bitowych. Na przykład zamaskować inne wartości, które Cię nie interesują, aby ich nie ruszyć przypadkiem.
Wskaźniki, wszędzie wskaźniki
W mikrokontrolerze wszędzie są wskaźniki. Jeśli kiedykolwiek będziesz programował bezpośrednio na rejestrach, to wpisanie do rejestru jest właśnie wpisem pod konkretny adres w pamięci mikrokontrolera.
Siłą rzeczy musisz traktować takie wpisanie do rejestru jako wpis pod wskaźnik lub ściślej mówiąc wpis wartości w miejsce, gdzie pokazuje wskaźnik.
Idąc dalej. Jest takie stwierdzenie, że jeśli chcesz pisać wydajny kod w C to musisz unikać kopiowania danych z miejsca na miejsce. W tym właśnie pomagają wskaźniki. Przekazujesz adres to miejsca, gdzie bezpośrednio interesujące Cię dane się znajdują i… działasz na oryginale bez potrzeby kopiowania.
Biblioteka standardowa
Nie wszyscy sobie zdają z tego sprawę, ale biblioteka standardowa dla C na PCtach różni się od tej dla mikrokontrolerów. Tylko nie na poziomie czy funkcja istnieje, czy nie. Chociaż kiedyś się zdziwiłem, że brakowało mi funkcji itoa() w avr-gcc…
Chodzi o to, że implementacja bibliotek standardowych jest inna. Przecież trzeba użyć innych instrukcji procesora, aby uzyskać ten sam efekt. Inaczej podejść do niektórych zagadnień.
Implementacje dla mikrokontrolerów niestety nie są rewelacyjne. Dołączając takiego printa dołączasz również masę innych bibliotek. Takie coś zaczyna dużo ważyć. Kod po prostu nam puchnie i zajmuje sporo miejsca w pamięci mikrokontrolera.
Kolejnym przykładem jest dynamiczna alokacja pamięci przy użyciu, chociażby funkcji malloc. Standard, a tym bardziej implementacja nie jest jasno zdefiniowana. Nie możemy na niej polegać, bo jest nieprzewidywalna. Na mikrokontrolerze nie możemy mieć takiej dużej niepewności. Tym bardziej jeśli budujemy systemy powiązane z bezpieczeństwem człowieka.
Gdzie uczyć się języka C dla mikrokontrolerów?
Stworzyłem kurs dedykowany mikrokontrolerom. Uczę w nim języka C od podstaw.
Zebrałem swoje doświadczenie z kilku lat programowania embedded i chcę przekazać Ci jak najlepszą wiedzę. Uczestniczyłem w różnych projektach: samodzielnie, start-up, średnia firma i olbrzymia korporacja.
Oprócz podstaw i składni przekazuję masę dobrych praktyk. Wplatam to między tłumaczenie kolejnych aspektów języka C.
Dodatkowym atutem jest również to, że pokazuję jak można dobrze prowadzić projekt. Pokażę Ci jak radzić sobie z budowaniem warstw abstrakcji. Skorzystamy przy tym ze struktur, wskaźników i callbacków. No i oczywiście podział na pliki. To wiele pomaga.
Takie odseparowane warstwy dużo łatwiej dają się przenosić między projektami, a nawet między różnymi rodzinami mikrokontrolerów.
Jak dołączyć do kursu? Zobacz pełną ofertę na https://cdlamikrokontrolerow.pl.
Nie zwlekaj, bo oferta jest ważna do piątku 29 października 2021 do godziny 20:00.
Mam nadzieję, że widzimy się w kursie!
P.S. Daj znać w komentarzu czy taka lżejsza tematyka na blogu jest ciekawa!
0 komentarzy