Na tej stronie zebrałem różne wpisy mogące pomóc programistom embedded na różnych stadiach rozwoju i w różnych gałęziach. Zaczynamy od opisu jak uczyć się na początku, żeby sprawdzić, czy to w ogóle jest dla nas. Potem kiedy podejmiemy decyzję, że chcemy rozwijać się w embedded – pora na zgłębienie teorii związanej z elektroniką, działaniem procesora i biegłym władaniem popularnymi językami (przede wszystkim C). Mając te umiejętności i trochę doświadczenia z pierwszymi projektami możemy zastanowić się nad projektowaniem systemów i zagadnieniami związanymi z architekturą.
Poza linkami do wpisów z bloga znajdziesz tutaj również linki do zewnętrznych artykułów, filmów na YT i polecanych książek. Lista jest co jakiś czas uzupełniana, ale jeżeli chcesz być na bieżąco z nowymi materiałami – koniecznie zapisz się na newsletter!
Dla początkujących
Publikowałem na blogu już kilka wpisów dla początkujących. Opisywałem jak zainteresować elektroniką najmłodszych, skąd brać materiały do nauki i co trzeba umieć, żeby dostać pracę w zawodzie.
Artykuły na stronie:
Jeżeli chcesz dowiedzieć się więcej czym są systemy embedded i jak wygląda praca w tej specjalizacji, polecam podcast „Ja, programista” Grzegorza Kotfisa z moim udziałem:
Polecam również artykuły, które opublikowałem na Forbocie. Są już dla trochę bardziej zaawansowanych:
- Jeżeli szkoda Wam pieniędzy na kupowanie części elektronicznych – przeczytajcie tutorial jak odzyskiwać części z niepotrzebnych aparatów, drukarek itp. (to jest również świetna forma nauki)
- Sekrety profesjonalnego programowania
- Różnice między programowaniem hobbystycznym a komercyjnym
- Komunikacja z komputerem przez USART – część 1, część 2
Skoro jesteśmy przy Forbocie to na początek jeśli chcesz zobaczyć, czy elektronika i systemy embedded są dla Ciebie – sprawdź kursy Forbota. Same kursy są darmowe, a potrzebne elementy to wydatek rzędu 100 zł.
Po zrobieniu kilku kursów i jakiś własnych próbach z Arduino, STMami, czy Raspberry Pi pora na jakiś większy projekt. Najlepiej sprawdzają się roboty mobilne, automatyka domowa i urządzenia związane z hobby np. stacja pogodowa, podlewanie roślin, licznik rowerowy, coś do samochodu. Tego typu projekty są ciekawe i przydatne.
Elektronika
Kiedy już wiesz, że chcesz poświęcić więcej czasu na systemy embedded – warto pogłębić swoją wiedzę z elektroniki. Dzięki temu nauczysz się samodzielnie projektować płytki PCB, dobierać elementy, debugować problemy z hardwarem i możesz uchronić się przed spaleniem układów.
Polecane kierunki rozwoju to:
- Zakłócenia – co je generuje i jak wpływają na działanie układów
- Obsługa sprzętu pomiarowego – miernik, analizator logiczny, oscyloskop, zasilacz laboratoryjny. Tutaj polecam tutoriale na yt jak np. ten 40 minutowy filmik omawiający wszystko co potrzebujesz żeby obsługiwać oscyloskop
- Projektowanie PCB przy pomocy darmowych narzędzi jak Eagle, czy KiCAD
- typowe połączenia, układy i sygnały – np. pull up, open drain, pwm, obsługa wielu przycisków, filtry RC, sterowanie silnikami.
Jeżeli chcesz mieć w jednym miejscu wszystkie najważniejsze informacje z dziedziny elektroniki – polecam książkę „Sztuka Elektroniki” Paula Horowitza i Winfriedla Hilla.
Działanie procesora
Drugą ważną kwestią jest wiedza jak mikrokontrolery działają pod spodem. W tym celu nieocenionym źródłem są datasheety, reference manuale i application noty od producentów procesorów. Duża część koncepcji jest wspólna dla wielu chipów. Dlatego warto na początek poznać dogłębnie jedną rodzinę np. AVR albo STM32 i potem przechodzić na następne.
Artykuły na stronie:
- Watchdog timer
- Watchdog w środowisku wielowątkowym
- Exceptiony w mikrokontrolerach
- FPU w STM32F4 – jak używać Floating Point Unit
- Integracja funkcji printf z UARTem
Kiedyś jeszcze napisałem na Forbota artykuł o działaniu mikrokontrolera na podstawie Atmegi.
Poza tym warto zgłębić również następujące tematy:
- Co się dzieje przed wejściem do funkcji main
- Peryferia
- Przerwania
- DMA
- Tryby Low-Power
- Bootloader
- Systemy operacyjne na mikrokontrolery – RTOS
Możliwe, że w przyszłości też coś na ten temat opublikuję.
Języki używane w Embedded
Kolejnym ważnym aspektem jest język jaki wybierzemy. Język C jest w dalszym ciągu wykorzystywany w ponad 70% systemów embedded i czy nam się to podoba, czy nie – powinien to być pierwszy język, który musimy opanować. Jako drugi polecam Asembler, a następnie kiedy jesteśmy już biegli w tych językach, możliwościach hardware’u i znamy typowe ograniczenia – dopiero wtedy docenimy dodatkowe możliwości jakie nam daje C++, Ada czy Rust.
C
C jest najpopularniejszym językiem w embedded, dlatego na ten temat pojawiło się tutaj dużo wpisów.
Składnia C:
Programowanie obiektowe:
Tablice:
- Jak korzystać z Lookup Table?
- Tablice przyspieszające wyszukiwanie elementów
- Maszyny stanów na tablicach
Inne:
- Konwersja typów przy operacjach arytmetycznych w C
- O wskaźnikach i rzutowaniu w C
- Maksymalne wartości zmiennych – biblioteki limits.h i stdint.h
Kiedyś też opisałem na Forbocie kilka pułapek języka C:
C++
C++ jest drugim najpopularniejszym językiem w embedded. Przejście z C może być dosyć proste, ponieważ kod w C w większości przypadków powinien się kompilować również w C++. Możemy więc stopniowo dodawać nowe możliwości języka do swojego arsenału. Poniżej kilka opublikowanych tutaj wpisów o C++:
Aby lepiej zgłębić temat i poznać przewagę jaką daje nam wykorzystanie C++ zachęcam do zapoznania się z poniższymi materiałami:
- Faebhas – implementacja rejestrów HW w C++ (całość ma 9 części)
- Faebhas – najprzydatniejsze elementy C++ dla embedded (całość ma kilka części, jest też link do PDFa z całością)
Asembler
Kiedyś umiejętność pisania w asemblerze była niezwykle ważna dla programisty embedded. W dzisiejszych czasach znaczenie tego języka maleje. Jednak w dalszym ciągu warto go znać i opłaca się go nauczyć jako drugi język po C. Wbrew pozorom asembler jest dosyć prosty do nauki, kiedy mamy już jakieś doświadczenie z programowaniem. Ja uczyłem się asemblera na AVRach i polecam tą drogę. Zestaw instrukcji jest mały i dobrze udokumentowany (w przeciwieństwie do x86). Mamy też do dyspozycji debuger i symulator, gdzie na bieżąco widzimy wszystkie rejestry procesora, co bardzo przyspiesza naukę.
Coraz rzadziej zachodzi potrzeba pisania procedur w asemblerze w celu optymalizacji. Potrzebujemy go głównie do napisania kodu specyficznego dla maszyny, którego nie da się napisać w C jak na przykład procedury startowe mikrokontrolera wywoływane przed wejściem do funkcji main. Drugim zastosowaniem jest przeglądanie disasembly, czyli kodu asemblera wygenerowanego przez kompilator języka wyższego poziomu. Tutaj z pomocą przyjdzie nam narzędzie Compiler Explorer, możemy też przeglądać pliki wynikowe kompilacji.
Do nauki asemblera polecam tutorial Azerii na ARMy.
Ada
Ada to język, gdzie szczególny nacisk położono na bezpieczeństwo, jednoznaczność i wyłapywanie błędów w czasie kompilacji. Język nie jest zbyt popularny, ale znalazł swoją niszę, znając go możemy znaleźć pracę w branży lotniczej, kosmicznej czy wojskowej.
- Ada – najlepszy język do systemów safety-critical
- Mój pierwszy program w Adzie
- Ada na STM32
- Unit testy w Adzie
- Ravenscar i ZFP – czyli profile runtime w Adzie
- Typy limited w Adzie
- Generowanie plików runtime Ady dla mikrokontrolerów
- Generowanie plików runtime Ady – część 2
Doskonałym miejscem, gdzie znajdziemy toolchain na różne platformy (w tym embedded), tutoriale, case study i wiele innych materiałów o Adzie jest Adacore.
Jeżeli chcesz znaleźć toolchain do popularnych eval boardów – sprawdź stronę Make with Ada. Przy okazji można tam wziąć udział w konkursie na najlepszy projekt w Adzie.
Polecam również slajdy z prezentacji o Adzie z Gdańsk Embedded Meetup.
Rust
Rust jest dosyć nowym językiem, ale cały czas umacnia swoją pozycję. Z jednej strony wynika to z dużego hype’u, ale z drugiej strony jest to efekt wielu rozwiązań wyłapujących błędy na poziomie kompilacji. Rust czerpie wiele z filozofii Ady, a jednocześnie składnie ma trochę bardziej zwięzłą i zbliżoną do C. Kolejnym powodem, aby zainteresować się Rustem jest bardzo aktywne community, które w szybkim tempie dodaje nowe funkcje do kompilatora, pisze świetne tutoriale i zapewnia wsparcie nawet na nowe procesory.
Na początek przygody z Rustem polecam oficjalną książkę dostępną online.
Drugą lekturą może być podobna książka o Rust Embedded.
Architektura
To, że znamy nasz procesor, otaczające go peryferia i języki programowania to dopiero połowa sukcesu. Aby skutecznie radzić sobie z dużymi projektami musimy posiąść wiedzę na temat projektowania systemów, dobrych praktyk i czystości kodu. Problem polega na tym, że zagadnienia związane z jakością są często bagatelizowane, a tajniki tworzenia dobrej architektury systemów embedded nie zostały nigdy jasno sprecyzowane.
Dlatego najlepsze co możemy zrobić to bazować na własnych doświadczeniach (dotyczących głównie tego co nie działa), jak i poradach od programistów wysokopoziomowych, którzy podobne problemy rozwiązują już od lat 90-tych i mają kilka gotowych rozwiązań.
Ten temat bardzo mnie interesuje, ale ciężko mi było zebrać sprawdzone informacje z dobrymi przykładami. Na stronie możecie znaleźć kilka wpisów w tej tematyce:
- Wzorce projektowe przydatne w systemach embedded
- Ewolucja architektury
- Podstawy architektury embedded – warstwy i moduły
- Problemy z architekturą w systemach embedded
Jednak temat na pewno będę jeszcze zgłębiał.