Jak uczyć się systemów embedded?

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 nawet 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śli 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, że 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ę szybko 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, jeżeli 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ę. Jeżeli 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 swój kurs Git w Embedded. Dzięki temu nauczycie się w godzinę najważniejszych komend potrzebnych na co dzień. A następnie na spokojnie poznacie składnię gita oraz dobre praktyki. Na przykład jak 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 oprogramowania 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!

8 Comments

  1. Serio? Kardaś i elektroda jako poważne podejście do tematu. Może dla raczkujacych. Ktoś kto chociaż trochę w tym siedzi wie, że to źródła informacji nieprofesjonalnej . Tak sobie mozna tworzyc urzadzenia na biurku a nie jako zaawansowane urzadzenia

    • GAndaLF

      5 marca 2019 at 19:31

      Na sam początek książka Kardasia nie jest taka zła, bo tłumaczy na chłopski rozum najważniejsze rzeczy. Potem musisz swoją dawkę profesjonalnej wiedzy przyjąć, ale na start mogę ją polecić.

      A jeżeli chodzi o elektrodę, to jak to na publicznym forum. Są tam wymiatacze od których się możesz sporo nauczyć, ale są też trolle. Poza tym elektroda od lat lansuje pisanie na STM bez bibliotek producenta i można tam znaleźć odpowiedzi na dużo początkowych problemów.

      Sam w swojej nauce wykorzystałem i Kardasia i Elektrodę. Ciężko znaleźć inne źródła po polsku. Ale jak masz jakieś lepsze propozycje, to śmiało linkuj. Po angielsku też mogą być.

  2. Ciekawy i przydatny artykuł, pozdrawiam.

  3. Moje początki…
    Kursy:
    Microcontrollers and the C Programming Language – Udemy
    C Programming Tutorial – Udemy
    Mastering Microcontroller with Embedded Drivers Development – Udemy
    Basics of Electronics – Udemy

    Książki:
    Język C dla mikrokontrolerów AVR – Tomasz Francuz
    Opus Magnum C++11 – Jerzy Grębosz
    Programista Samouk – Cory Althoff
    Zrozumieć Programowanie – Gynvael Coldwind

    Inne:
    Kursy Forbota
    Fora i poradniki internetowe

    • I jak oceniasz te wszystkie kursy na udemy ? Miały one duże przełożenie na otrzymanie pierwszej pracy w embedded?

  4. Jakub Standarski

    15 maja 2019 at 11:00

    Mam pytanie o „polecane” zagraniczne książki dotyczące Embedded?
    Co i dlaczego warto przeczytać?

    • GAndaLF

      15 maja 2019 at 23:38

      Trochę ciężko mi wskazać zagraniczne książki, bo sam uczyłem się z polskich + materiały z neta i praktyka, Nie jestem też na bieżąco ze wszystkimi tytułami. Na pewno mogę polecić Jacka Ganssle – „The art of designing Embedded Systems”.

      Z książek opisujących bardziej wąski temat – James Grenning „Test Driven Development for Embedded C”

      Dobra wydaje się też „Making Embedded Systems: Design Patterns for Great Software” – Elicia White

      Chętnie przyjmę jakieś inne rekomendacje książek o embedded

  5. Jak dla mnie, to przede wszystkim Prata (GENIALNIE o C), Francuz (AVR, świetne pomysły) i Grębosz na deser (kultowa pozycja o C++). Z książkami Francuza jest jeszcze tyle fajnie, że można podpytać autora na elektrodzie – kryje się pod nickiem „tmf”. Co do Kardasia – Miałem „Blue” i „Greenbooka”… sprzedałem. Strasznie „przegadane”, bardzo źle się czyta, w wielu miejscach niejasne. Osobiście nie polecam – przereklamowane.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *