Kategoria: Programowanie

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

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

Generowanie headerów ze stałymi w CMake

W prawie każdym projekcie potrzebujemy przechowywać jakieś wartości, które zmieniamy w zależności od wersji projektu. Najbardziej oczywistym przykładem jest właśnie numer wersji. Ale czasem chcemy wyświetlać również commit id z gita, datę kompilacji, czy użytą wersję kompilatora. Nie muszę chyba dodawać, że aktualizacja takich danych ręcznie jest niezwykle uciążliwa, a czasem wręcz niemożliwa (jak dodać commit id bezpośrednio w kodzie bez modyfikowania bez modyfikowania go?). W większych projektach będziemy w tym celu używać dodatkowych skryptów. A CMake ma wbudowane wsparcie do tego typu operacji.

Continue reading