Jak stać się lepszym programistą embedded? Przyjdź na webinar i dowiedz się sam!

Czy ręcznie napiszemy kod optymalniej niż kompilator?

Istnieje taki mit, że jeżeli chcemy napisać mega optymalny kod, gdzie liczy się każda instrukcja – powinniśmy napisać go ręcznie w asemblerze. Kompilator nie poradzi sobie z tym zadaniem tak dobrze jak człowiek. Zawsze doda jakieś bezsensowne instrukcje trwoniąc w ten sposób cenny czas.

Ja się z tym całkowicie nie zgadzam i w swoich materiałach często pokazuję jak kompilator robi różne optymalizacje, a nam się nie udaje go pobić. Albo kiedy ręcznie robimy w kodzie błędy, a kompilator generuje kod poprawnie. Nie inaczej będzie tym razem, ale nie uprzedzajmy faktów.

Sam wielokrotnie łapałem się na tym, że posądzałem kompilator o bezsensowne działanie. A potem okazywało się, że nie miałem racji. Dlatego teraz staram się nie rzucać przedwcześnie oskarżeń. Z drugiej strony widzę, że nie byłem sam. Pod moimi materiałami nieraz pojawiają się dyskusje o bezsensownych optymalizacjach kompilatora. I zwykle staję wtedy w obronie maszyny.

W dzisiejszym artykule pokażę Case Study przypadku, gdzie kompilator GCC na ARM Cortex-M robi dziwne i “nieoptymalne” operacje.

Continue reading

Debugowanie Hard Faultów na STM32

Pracujemy nad naszą aplikacją, wgrywamy ją na procka, uruchamiamy i nie działa. Uruchamiamy debug i widzimy, że program wchodzi do Hard Faulta. Co teraz?

Na szczęście w STM32 mamy całkiem bogate możliwości sprawdzenia, co dokładnie się wydarzyło. Co więcej – to samo aplikuje się do dowolnych innych ARMów z rdzeniem Cortex-M. W tym artykule pokażę Ci przydatne informacje, do których możesz dotrzeć w debugu.

Skupię się na rdzeniu Cortex-M4, ale podobne mechanizmy znajdziesz w każdym innym Cortexie-M. A jako dokumentacja posłuży mi STM32 Cortex-M4 Core Programming Manual. Znajdziesz go na stronie ST.

A więc zaczynamy.

Continue reading

6 Najważniejszych zastosowań asemblera w Embedded

W poprzednich wpisach wychwalałem wartość edukacyjną asemblera i opowiadałem trochę jak wyglądała moja ścieżka nauki. Dzisiaj porozmawiamy sobie o praktycznych zastosowaniach, gdzie faktycznie musimy pisać, albo przynajmniej czytać kod pisany w asemblerze.

Opowiem o 6 głównych przypadkach, kiedy chcemy użyć asemblera. I o jednym kiedy wydaje nam się, że chcemy, ale… no właśnie – źle nam się wydaje.

Continue reading

Czy warto uczyć się asemblera w 2024 roku?

Asembler wśród programistów nie budzi zbyt wielkiej sympatii. Pewnie znasz kilka stereotypowych opinii:

  • Że jest trudny do nauki.
  • Że powstały kod jest zupełnie nieczytelny, szczególnie kiedy wracamy po pół roku.
  • Że jest przestarzały i w dzisiejszych czasach możemy się obejść bez niego.
  • Że ma inną składnię na każdą rodzinę procesorów.
  • Że poza językiem musimy mieć dużą wiedzę o architekturze danego procesora.
  • Że nie ma sensu w nim pisać całego projektu.

Co więcej – większość z tych zdań jest prawdziwa!

Ale i tak postaram się przekonać Cię, że warto nauczyć się asemblera. Oczywiście jeśli spełnimy pewne założenia. Moim zdaniem asembler nie nadaje się jako pierwszy język do nauki, ani główny język w projektach. Ale jest idealny jako uzupełnienie i tak powinieneś go traktować.

Continue reading

Jakie projekty robić, aby najlepiej rozwinąć swoje umiejętności?

Dzisiejszy temat kompletuje Świętą Trójcę największych pytań na grupach dla programistów embedded. Dwa pozostałe tematy – wybór mikrokontrolera i wybór języków omawialiśmy w poprzednich wpisach. Dzisiaj zajmiemy się wyborem tematów na własne projekty embedded. Zawęzimy temat właśnie do prywatnych projektów. Zarówno tych na początek przygody z programowaniem embedded, jak i tych na później. Nie będziemy natomiast omawiać projektów komercyjnych – to temat na oddzielną dyskusję.

Continue reading

Jakich języków uczyć się do embedded? I w jakiej kolejności?

Wybór języka programowania to kolejny obok wyboru mikrokontrolera najczęściej poruszany temat. Pytanie o język zadają nie tylko zupełnie początkujący. Często na studiach mamy trochę do czynienia z C, C++, MATLABem, FPGA, Asemblerem. Uczymy się wszystkiego po trochu i musimy się na coś zdecydować. Jeżeli siedzimy trochę w branży – słyszymy o zaletach Rusta czy modern C++. Chcemy się dobrze ustawić do wiatru i uczyć się rzeczy jednocześnie popularnych i perspektywicznych. Wybór odpowiednich języków do nauki jest tutaj kluczowy.

Continue reading

Jaki mikrokontroler wybrać na początek?

To jeden z największych dylematów osób wchodzących do branży embedded. Często zadają je również osoby, które już zaczęły pisać pierwsze programy i jakiś procesor wybrały. Nic dziwnego – możecie się zastanawiać czy to była dobra decyzja? czy mogę ją jeszcze zmienić? czy lepiej uczyć się od razu kilku rodzin?

W tym artykule dam Ci jasną odpowiedź. Oraz pokażę całą argumentację dlaczego właśnie tak. Zaznaczam tutaj od razu, że skupiam się na „deeply embedded”. Czyli ścieżce skupiającej się na systemach bare metal albo opartych na RTOSach. Linux Embedded to zupełnie inna bajka.

Continue reading

Projekt embedded od zera – nowa seria na YT!

Widzieliście już nową serię filmów na moim kanale YT? To jest coś, czego do tej pory brakowało w świecie embedded. Pokazuję w niej prawdziwy projekt. Nie tylko z ostateczną wersją kodu, ale również z całą ewolucją, decyzjami i czynnikami wpływającymi na te decyzje. A wszystko to bez zbędnego lania wody – same konkrety. Aby utrzymać zwięzłość materiału zdecydowałem się nagrać to w formie filmów, a nie live.

W tym poście napiszę więcej o samym projekcie i kulisach jego powstawania. A jeżeli chcesz od razu przejść do oglądania – poniżej znajdziesz playlistę ze wszystkimi opublikowanymi do tej pory odcinkami.

Continue reading

Architektura Systemu – Między Ideałem a Koniecznością Biznesową

Grudniowy meetup (relacja tutaj) zapoczątkował ciekawą dyskusję na temat dziedziczenia w C++, interfejsów duplikacji kodu i czy czysty kod według Uncle Boba ma zastosowanie w środowisku embedded. Zainspirowany tą debatą postanowiłem podzielić się z Wami swoimi refleksjami. We wcześniejszym wpisie odniosłem się bardziej do kwestii związanych z C++, wydajnością i czystym kodem. Dzisiaj biorę na tapet decyzje architektoniczne i kompromisy projektowe.

Zacznijmy od ważnej uwagi – opinie w takim temacie są wypadkową poglądów filozoficznych i doświadczeń we własnych projektach. Każdy programista kieruje się własnymi preferencjami, a specyfika projektów różni się diametralnie. Toteż nie szukaj tu gotowych przepisów, bo jak zwykle, odpowiedź brzmi: „To zależy”.

Continue reading