Jak uczyć się systemów embedded?

ucgosu.pl 5 lat temu

Po ostatnim artykule, gdzie opisałem, co trzeba umieć do pierwszej pracy, dostałem od Was pytania jak zdobyć wymaganą wiedzę. Z jakich kursów korzystać? Jakie książki czytać? Jakie projekty robić? Od czego zacząć? W tym wpisie znajdziesz odpowiedź na powyższe pytania.

Dla kompletnie zielonych – podstawy elektroniki i Arduino

Na sam początek polecam spróbować swoich sił z Arduino, oraz poeksperymentować z prostymi układami elektronicznymi. Pomogą nam w tym dwa kursy z Forbota:

Podstawy elektroniki pozwolą Ci zdobyć podstawową wiedzę o rezystorach, kondensatorach, diodach itp. Nauczysz się także korzystać z miernika, ta wiedza przyda Ci się później przy debugowaniu, bo w ten sposób zobaczysz efekty działania swoich programów. Poza tym znając podstawy elektroniki zmniejszasz szansę na spalenie układów. Jednak choćby jak coś spalisz, nie przejmuj się – nie ma takiego elektronika co by nigdy nie spalił jakiegoś układu.

Kurs Arduino natomiast jest zarówno dobrym wstępem do programowania dla osoby, która nigdy nie miała z tym styczności, jak i dla osób przychodząch z języków wyższego poziomu (chociaż dla nich niektóre rzeczy okażą się oczywiste).

Do nauki będziemy potrzebować jakiegoś hardware’u. Do powyższych kursów są gotowe do kupienia zestawy i łączny koszt obu to poniżej 250 zł. Po tych dwóch kursach możesz stwierdzić, czy programowanie embedded jest dla Ciebie. jeżeli nie – zestawy zawsze możesz odsprzedać.

Procesory AVR w języku C

Po opanowaniu podstaw dzięki Arduino pora nauczyć się języka C. To w nim powstaje około 70% projektów embedded, a jego dobre opanowanie zapewni również zrozumienie działania procesora, zarządzania pamięcią i innych niskopoziomowych procedur. Nauczysz się pracy z IDE, programatorami sprzętowymi, podstaw kompilacji i linkowania projektów. Nauczysz się również korzystać z dokumentacji procesora i układów, z którymi ma współpracować.

Na co zwracać uwagę ucząc się C? W embedded szczególnie przydadzą się takie zagadnienia jak:

Przed przejściem do mikrokontrolerów, możemy najpierw chcieć nauczyć się zwykłego C pisząc programy na komputer. W takim wypadku polecam klasykę – „Język ANSI C” nazywana często K&R od nazwisk autorów – Briana Kernighana i Denisa Ritchie, czyli twórców języka C. Książka może być dosyć trudna w odbiorze, ale posiadając pewną wstępną wiedzę np. z Arduino jest spokojnie do przyswojenia.

Dobrą alternatywą jest książka Mirosława Kardasia „Mikrokontrolery AVR Język C Podstawy programowania„, która nauczy nas zarówno języka C jak i procesorów AVR. Opis składni C jest tam bardzo dobry i wszystko wytłumaczono na chłopski rozum. W porównaniu do K&R opisy są krótsze i mniej teoretyczne. Książka Mirosława Kardasia zawiera również opis architektury AVR i wszystkich peryferiów. Po części teoretycznej mamy również dużo przykładowych programów. Na początek są proste programy mające pokazać działanie pojedynczych peryferiów, a następnie przechodzimy do rozbudowanych projektów realizujących wiele zadań na raz. Zadania są pisane pod specjalną płytkę ewaluacyjną która jest dosyć droga (około 300 zł), z resztą sama książka również jest droga (120 zł). Dlatego po przeczytaniu części teoretycznej i doświadczeniach z Arduino polecam pobawić się na płytce Arduino.

Książka zawiera trochę złych praktyk, choćby mieszanie w kodzie polskiego i angielskiego żeby daleko nie szukać. Jednak nie są one zbyt szkodliwe, bo książka ma na celu nauczenie podstaw. Potem jak nabierzesz więcej wiedzy dowiesz się dlaczego niektórych rzeczy unikać.

Większy projekt – własny robot

Samo uczenie się teorii i działania podzespołów na jakiś prostych programach po jakimś czasie staje się nużące. Największą zaletą systemów embedded jest to, iż możemy zrobić urządzenia wchodzące w interakcję ze światem – świecące, jeżdżące, wydające dźwięki. Idealnym przykładem takiego urządzenia jest robot mobilny. Radocha z takiego projektu jest o wiele większa niż z jakiś cyferek pojawiających się na konsoli. Dobrym wprowadzeniem do tematu robotów mobilnych jest kurs z Forbota.

Procesory ARM – STM32

Mając już doświadczenie z AVRami, możemy przejść do STM32. Jest to znacznie ułatwione dzięki tanim płytkom Discovery i Nucleo od ST – najtańsze można dostać już za 60 zł. Jednak sam procesor jest dużo bardziej złożony – posiada specjalną procedurę startupową, którą sami musimy zaimplementować (często generuje ją za nas IDE, albo używamy gotowego szablonu), procesor może być taktowany na wiele sposobów, zegar sami musimy skonfigurować. Sygnał zegarowy jest później rozprowadzany po różnych peryferiach, które trzeba oddzielnie aktywować. Same peryferia mają dużo więcej rejestrów. Gdybyśmy zaczynali od STMów moglibyśmy się gwałtownie zniechęcić. Jednak mając doświadczenie z AVRami nauka będzie nieco łatwiejsza dzięki porównywaniu z tym co już znamy.

Na początku proponuję wykorzystywać biblioteki od ST do obsługi peryferiów – HAL i Cube,. Dzięki temu mamy dostęp do wielu przykładów gotowego kodu, możemy użyć automatycznego generowania kodu i po prostu szybciej się wdrożymy. Tutaj po raz kolejny polecam kurs z Forbota.

Jednak od poznania rejestrów procesora raczej nie uciekniemy, o ile chcemy zawodowo pisać systemy embedded – będą nam potrzebne choćby podczas debugowania, do pisania własnych driverów sprzętowych, albo kiedy projekt nie zezwala na użycie tych bibliotek. Tutaj nauka jest już o wiele trudniejsza. Jako źródło wiedzy i przykładów kodu polecam Elektrodę. Jednak większość informacji o poszczególnych rejestrach, bitach i trybach pracy peryferiów będziemy czerpać po prostu z dokumentacji od ST. Tutaj naszym najlepszym przyjacielem będzie Reference Manual odpowiedni dla naszego procesora. Pomagać możemy sobie również uruchamiając projekty na HAL, czy przeglądając ich kod, i sprawdzając jak ustawiają konkretne rejestry.

Co dalej?

Mając już za sobą te wszystkie kroki jesteśmy gotowi robić samodzielnie bardziej zaawansowane projekty, wybierać potrzebne układy elektroniczne i zbierać coraz więcej doświadczenia. Przy okazji różnych napotykanych problemów będziemy mieli okazję poznać meandry programowania systemów embedded. Swoją wiedzę warto wtedy uzupełniać czytając książki i poznając różne toole przyspieszające pracę. o ile chodzi o książki o embedded, to polecam „The Art of Embedded System Design” autorstwa Jacka Ganssle, przy okazji polecam jego artykuły dostępne w dużych ilościach w internecie (tylko nie przeraźcie się przedpotopowym designem strony).

Warto również poczytać o clean code – tutaj polecam klasykę, czyli Wujka Boba. Książka jest pisana z myślą o programowaniu obiektowym, jednak część porad spokojnie można zaaplikować również do embedded.

Inną niezbędną umiejętnością jest też obsługa systemów kontroli wersji. Tutaj polecam kurs gita od Macieja Aniserowicza. Dzięki temu kursowi nauczycie się nie tylko składni komend gita, ale przede wszystkim dobrych praktyk – robić małe commity z dobrymi nazwami, jak pracować na gałęziach, jak pracować w zespole itp.

W miarę rozwoju możemy dodawać nowe techniki do naszego arsenału, jak np. Test Driven Development, czy statyczna analiza kodu. Warto również dowiedzieć się co nieco o procesie wytwarzania systemu i pracy w zespole. Na początek warto wiedzieć co to Waterfall i Agile. Warto również nadrobić podstawową wiedzę z teorii programowania, czyli podstawy algorytmów i struktur danych.

Podsumowanie

Gdy zaczynałem się uczyć programować systemy embedded nie było takiego dostępu do sprzętu i materiałów jak teraz. Dziś mamy do dyspozycji dużo wysokiej jakości materiałów dla początkujących także w języku polskim. Ja zaczynałem od płytki stykowej, Atmegi8 i garści drobnicy. Wszystkie połączenia składałem samemu. Nie była to najefektywniejsza forma nauki, ale na pewno nieźle hartowała. W każdym razie dzisiaj możecie się nauczyć tego samego dużo szybciej i przyjemniej. Nic, tylko korzystać.

A jak wyglądała Twoja nauka embedded? Na jakim poziomie aktualnie jesteś? Z jakich materiałów korzystasz? Koniecznie napisz o tym w komentarzach!

Idź do oryginalnego materiału