Od pewnego czasu obserwuję to, co się dzieje wśród początkujących programistów embedded. W zasadzie nie tylko wśród nich, bo również w tym, co przekazują materiały do nauki programowania embedded przyszłym juniorom. Mam pewne poważne zastrzeżenia.
Problemy osób początkujących
Mam kilka obserwacji. Na podstawie mojego doświadczenia wyodrębniłem 6 problemów, z jakimi zderzają się początkujące osoby. Niektóre są ewidentną winą tego, w jaki sposób przekazywana jest wiedza w ogólnodostępnych kursach i poradnikach.
Oto lista sześciu problemów, które uważam za najpoważniejsze na drodze początkującego programisty embedded. Pozwól, że opiszę Ci je i podam rozwiązanie do każdego z nich.
1. Robię według poradnika i nie działa!
Jeżeli mamy kłopoty – idziemy na jakieś forum, lub grupę dyskusyjną. Najczęściej taka prośba o pomoc wygląda tak: “Pomocy, nie działa. Robię wszystko jak tutaj *LINK* i to nie chodzi”.
Znasz to? Na pewno 🙂
Pomijam jakość wykonania instrukcji, bo często to też jest problemem. Na przykład zapomniał ktoś włączyć potrzebne przerwanie, albo jakiś kabelek źle był wpięty.
Gorzej, gdy poradnik jest nieaktualny. Może zdarzyć się tak, że biblioteki użyte w kursie są przestarzałe. Przykłady nie zadziałają z najnowszym zestawem oprogramowania.
Taki poradnik jest nieaktualny i nie powinno go być. Zdaję sobie tez sprawę z tego, że często raz napisany tutorial, ciężko jest cały czas sprawdzać i aktualizować. Zwłaszcza te darmowe – bo nie ma motywacji do robienia poprawek.
Rozwiązanie: Korzystajmy z pewnych źródeł. Takich, gdzie autor cały czas dba o to, aby kurs był aktualny. Na przykład ten kurs.
2. Nie działa mi programowanie/debugowanie!
Ten błąd widzę nadzwyczaj często, bo prowadzę sklep z elektroniką. Najczęściej pojawia się on przy chińskich płytkach, gdzie nie ma wbudowanego programatora.
Podobnie nie ma gotowych przykładów, które uwzględniałyby ten programator w kodzie. W poradnikach też się o tym nie mówi, że piny od debugowania należy odpowiednio ustawić.
Jeszcze inną kwestią są podróbki, które zdarzają się w chińskich płytkach. Na przykład w BluePill, czyli płytka z STM32F103 którą uwielbiamy, bo jest tania.
W chińskim programatorze siedzi ten sam F103, który tak samo może być podrobiony i nie działać do końca poprawnie.
Rozwiązanie: Korzystanie z oryginalnych płytek od ST. Na przykład takich: Nucleo, Discovery. Tam ST-Link jest pewniakiem. Jest też dobrze podłączony. Dodatkowo branie w CubeMX projektu na bazie Nucleo, a nie MCU zawsze poprawnie skonfiguruje piny debugowe.
3. Chciałbym robić wiele rzeczy naraz
Klasyka gatunku. Potrafimy migać jedną diodą. Problem pojawia się, gdy trzeba migać dwoma i to w różnym tempie. Jak wykonać dwa delaye naraz?
Druga sytuacja. Musimy zrobić obsługę drgania styków na przyciskach. 20-30 milisekund wystarczy. Pakujemy delay, robimy obsługę 5 przycisków i co? Coś nie za bardzo płynnie nam to działa…
Dodatkowo wciskając jeden przycisk, brakuje nam czasami reakcji na drugi. Jak żyć?
Rozwiązanie: Naucz się od razu poprawnego pisania kodu bez używania delayów! To nie może być “coś ekstra”. To jest podstawa pisania programów na mikrokontrolery. Taki prosty sposób z timerem programowym pokazałem ostatnio na LIVE.
4. …co prowadzi do “weź RTOSa”
Ktoś Ci grzecznie podpowiedział, abyś zainteresował się RTOSem. “On zrobi za Ciebie wszystko” mówi. No tak, ale…
RTOS, czyli system czasu rzeczywistego jest świetnym narzędziem, lecz bardzo skomplikowanym. Początkujący programista nie będzie w stanie tak po prostu wziąć system i dodać go do projektu. Nie ma magicznego przycisku w IDE “dodaj RTOS”.
Młody adept nie znając działania takich systemów jeszcze bardziej zniechęci się do programowania mikrokontrolerów.
Takie rady dla osoby, która nie wie jak migać dwoma diodami naraz są bardzo szkodliwe. Nie róbmy tak.
Jest jeszcze jeden problem z RTOSami. Poradniki na ich temat opierają się na printowaniu na konsolę oraz miganiu diodami. To świetnie działa w tych prostych przykładach, gdzie omawiane są pojedyncze komponenty RTOSa.
Gorzej, gdy dodasz do projektu I2C, ADC, DMA i jeszcze inne komponenty. Nagle projekt robi się skomplikowany i dostarcza masę dziwnych problemów. Okazuje się, że użycie tego RTOSa wcale nie jest takie proste jakby się wydawało.
Rozwiązanie: Jeśli chcesz faktycznie użyć RTOSa, poznaj go najpierw. I to dobrze. Najlepiej, aby ktoś pokazał Ci jak zbudować prawdziwy projekt. Poznawanie na LEDach i printowaniu to jedno, ale faktyczne użycie systemu to zupełnie inna bajka. Taką całą ścieżkę realizują moi kursanci w kursie STM32 dla Początkujących.
5. Praca z DMA
Przechodząc z AVR na ARMy dostajemy genialne narzędzie (czy może bardziej peryferium?), które nazywa się DMA – Direct Memory Access.
Jest to blok mikrokontrolera, który pozwala na pracę na pamięci bez udziału CPU.
Problem polega na tym, że ciężko nam pojąć, że coś wykonuje się “w tle” poza procesorem. Przyzwyczajeni jesteśmy do sekwencyjnego wykonywania się kodu, więc często nie wiemy jak pracować z DMA.
Do DMA jedyne co wysyłamy to “zlecenie” operacji. Nie zajmujemy się samą operacją na pamięci, więc możemy robić w tym czasie co innego, a DMA nas powiadomi o zakończonej pracy.
Pierwszy błąd, jaki widuję to czekanie w pętli na to, aż DMA skończy transfer. Na przykład zlecamy wysłanie danych do OLED i czekamy w miejscu, aż te dane się wyślą przez DMA. Tak nie robimy. Po zleceniu wysyłki idziemy robić coś innego.
Drugim błędem jest zastępowanie funkcji np. transmitującej po I2C wersją z DMA. Mamy na przykład OLED ze stronicowaniem i musimy wysłać 8 stron bufora.
Normalnie bez DMA wysyłamy jedno po drugim. CPU aktywnie wtedy bierze udział w wysyłce, więc prosta pętla for robi nam tutaj robotę.
Zastępując w takim miejscu na ślepo transmisję na transmisję po DMA psujemy program! Dlatego, że mamy 8 zleceń transferu do DMA pod rząd. W minimalnych odstępach czasu. DMA nie zdążyło wysłać pierwszej strony do OLED, a my próbowaliśmy wepchnąć już tam wszystkie 8.
CPU odbije się od DMA, bo to jest akurat zajęte i jaki mamy efekt? OLED nie działa!
Rozwiązanie: Trzeba poznać to, jak DMA pracuje i jak z nim obcować. Przestawmy się na to, że zlecamy wysyłkę i czekamy na znak-sygnał od DMA, że może przyjąć następną porcję danych.
6. Szukam biblioteki do…
Na koniec szukanie bibliotek. Jesteśmy leniwi i lubimy gotowce. Zresztą dobrze jest korzystać z czegoś, co już zostało kiedyś napisane.
Arduino przyzwyczaiło nas do tego, że tam wszystko jest gotowe. Często takie biblioteki pisane są przez amatorów i mogą zawierać ukryte delaye! Samo Arduino IDE również utrudnia zerknięcie do środka bibliotek i nie wiemy co one faktycznie robią. A mogą robić różne dziwne rzeczy!
Innym problemem jest to, że po prostu na gołego STM32 nie ma aż tylu bibliotek jak na Arduino.
No i na końcu… a co jeśli masz układ, do którego nie ma biblioteki nawet do Arduino?
Rozwiązanie: Naucz się pisać biblioteki na podstawie dokumentacji. Pozwoli Ci to na większą swobodę, oraz rozumienie gotowych bibliotek.
Po drugie – naucz się portować poprawnie biblioteki z innych mikrokontrolerów – np. Arduino. Nie zawsze trzeba pisać wszystko od nowa.
Tych dwóch sposobów na biblioteki uczę w moim kursie STM32 dla Początkujących.
Skąd się tego nauczyć?
Większość ogólnodostępnych kursów i poradników wprowadza te błędy i problemy. Z każdym kolejnym są one powielane. Skąd więc nauczyć się jak sobie z nimi radzić?
Postanowiłem, że zerwę z powielanymi błędnymi schematami i stworzę kurs, który rozwiąże wszystkie powyższe problemy. Kurs STM32 dla Początkujących pozwoli Ci nauczyć się programować w PRAWIDŁOWY sposób.
Jeśli nauczysz się poprawnie programować, to Twoje projekty będą dużo lepsze.
Zdobędziesz również pierwszą pracę, jeśli takiej szukasz. Może szukasz lepszej pracy niż masz w tej chwili?
Do piątku 19.02 go godziny 20:00 masz szansę zapisać się na kurs i odmienić swoje programowanie raz na zawsze.
Wszystkie szczegóły dotyczące kursu i uczestnictwa w nim znajdziesz na stronie kursu: https://kursstm32.pl
0 komentarzy