We wtorek 5 grudnia w Sztuce Wyboru w Gdańsku mieliśmy kolejną, siedemnastą już odsłonę Gdańsk Embedded Meetup. Jako organizator nie zawsze mam możliwość uważnie śledzić prezentacje, ale tym razem się udało i dzięki temu mogę teraz napisać całkiem długą relację. A przy okazji dobrze się składa, bo długo nic nie pisałem na bloga, a ten meetup dał wiele ciekawych tematów, które rozwinę jeszcze w kolejnych wpisach. Tutaj skupię się jednak na relacji, bo mieliśmy dwie bardzo ciekawe prezentacje.

Krzysztof Mazur i Mariusz Różycki – „A może by tak DOOM pod choinkę na choince?”

Na początek Krzysztof Mazur i Mariusz Różycki wystąpili z prezentacją „A może by tak DOOM pod choinkę na choince?” Gdzie opowiadali o swoim projekcie – Rustmas (koniecznie zobacz projekt na GitHubie!)

Czym jest Rustmas?

To aplikacja kontrolująca lampki choinkowe. Pozwala kontrolować każdą pojedynczą lapkę. Rustmas zna położenie każdej lampki w przestrzeni, dzięki czemu może wyświetlać animacje.

Od strony sprzętowej znajdziemy tam programowalne LEDy WS2811/12, RPi Pico i komputer albo np. zwykłe Raspberry Pi na którym działa główna aplikacja. Jest również aplikacja na telefon pozwalająca sterować animacjami, kolorami, jasnością itp. Do kalibracji jest potrzebna kamera. Jak sama nazwa wskazuje – całość została napisana w Ruscie. Projekt wykorzystuje też OpenCV.

Bez odpowiedniego kontekstu może to brzmieć absurdalnie, ale setup choinki jest dosyć skomplikowany. Kiedy godzinę przed startem przyszliśmy przygotowywać salę – chłopaki już tam byli. Zastaliśmy ciemność rozświetloną tylko jedną lampką choinkową. Lampka szybko gasła, a po niej zapała się kolejna. Trwała kalibracja choinki. Czyli kamera zczytywała pozycję każdej lampki w przestrzeni. Procedurę musieli powtórzyć 4 razy, żeby określić pozycję ze wszystkich stron.

Aplikacja jest też ciekawa z punktu widzenia programisty. Po pierwsze sam fakt użycia Rusta. Po drugie dobrze przemyślana architektura składająca się z niezależnych modułów umożliwiająca niezależną pracę nad poszczególnymi elementami, podmianę fizycznej choinki na symulację, czy łatwe dodawanie nowych animacji czy obsługi eventów np. od MIDI.

Oczywiście to w telegraficznym skrócie. Szczegóły znajdziecie na nagraniu z prezentacji:

Efekt na żywo jest niesamowity. Na nagraniu cały czas widać choinkę, więc możecie sami zobaczyć.

Nic dziwnego, że prezentacja spodobała się uczestnikom. W ankiecie dostała najwyższą ocenę w historii naszego meetupu!

Po przeczytaniu tego wszystkiego pewnie Twoja pierwsza myśl to “Jak mogę użyć Rustmas na swojej choince?”. I tutaj niestety wychodzi pewna wada, bo to nie są tanie rzeczy. Trzeba liczyć się z wydatkiem rzędu 1000 zł. Głównie to koszt LEDów.

Mateusz Przybyła – Co C++ może zaoferować branży embedded?”

Po przerwie na pizzę przyszła pora na kolejną prezentację. Mateusz Przybyła przyjechał do nas z tematem „Co C++ może zaoferować branży embedded?”

Mateusz tą prezentacją wyszedł na prowadzenie – wystąpił na naszym meetupie już po raz trzeci. A przy okazji uratował nas w ostatniej chwili zgłaszając się w ostatniej chwili. Początkowo miała odbyć się inna prezentacja, ale nie wyszło i Mateusz nas uratował. Dzięki!

C++ na naszym meetupie to bardzo chodliwy temat. W ostatnim czasie mieliśmy prezentacje o optymalizacjach w C++ od Pawła Rapkiewicza (nie mamy nagrania z meetupu, ale Paweł miał ten sam temat na Bitconfie ), o narzędziach do statycznej analizy od Mateusza Patyka, czy o przydatnych funkcjonalnościach modern C++ od Arka Jędrzejewskiego.

Mateusz natomiast postanowił pokazać elementy nowoczesnego C++ szczególnie przydatne w embedded. A także te nieprzydatne czy nawet szkodliwe, których lepiej unikać. A wszystko to z punktu widzenia praktyka i w nawiązaniu do swoich własnych sytuacji w projektach.

Dyskusja o C++ na mikrokontrolerach trwa już od lat (znajdziecie coś na ten temat również na moim blogu). W niektórych kwestiach udało się wypracować konsensus inne natomiast nadal rozpalają emocje. Czego doświadczyliśmy również w trakcie tej prezentacji. Wywołała ona ciekawą dyskusję poruszającą różne tematy. Ale po kolei…

Mateusz zaczął od omówienia elementów, których nie warto używać na mikrokontrolerach:

  • exceptiony
  • RTTI – runtime type information
  • dynamiczna alokacja pamięci
  • STL (bo używa alokacji)
  • dziedziczenie i klasy wirtualne

No właśnie, dziedziczenie? Klasy wirtualne, czyli interfejsy? Jak to? Ja akurat jestem fanem interfejsów i trochę się zdziwiłem. Z resztą nie byłem w tym odosobniony.

Mateusz argumentuje, że dziedziczenie dodaje do struktur i klas vtable. Przez to nie możemy wnioskować o ich rozmiarze i ułożeniu w pamięci. Dochodzi do tego negatywny wpływ na wydajność i cache. Te problemy potęguje dodatkowo dziedziczenie po kilku klasach, czy zagnieżdżanie dziedziczenia. A dodatkowo kod jest wtedy zaciemniony. A my otrzymujemy zarówno słabą czytelność jak i słabą wydajność.

Na potwierdzenie mogliśmy zobaczyć przykłady dziedziczenia i RTTI, gdzie za pomocą dynamic casta z powrotem dochodzimy do ukrytych szczegółów implementacyjnych. Jak słusznie zauważył jeden z widzów – pokazany przykład był antywzorcem i można pokazać kontrprzykład, gdzie interfejsy są przydatne. A taki kod jest symptomem błędnych decyzji projektowych i trzeba rozwiązać je na poziomie architektury. Ale z drugiej strony zwykle nie możemy przebudować całej architektury i musimy pragmatycznie podchodzić do zadań w projekcie.

Mateusz jest zwolennikiem popularnej w ostatnim czasie szkoły promowanej przez Casey’a Muratori w viralowym filmie „Clean Code Horrible Performance”, gdzie autor krytykuje szkołę Uncle Boba i pokazuje jak wiele wydajności tracimy próbując pisać “czysty kod”, ostatecznie nawet nie osiągając celu.

Przy okazji w powyższym zdaniu można doszukać się parafrazy słynnego cytatu o optymalizacji:

More computing sins are committed in the name of efficiency (without necessarily achieving it) than for any other single reason — including blind stupidity

William wulf

Oryginalnie to był argument za czytelnością, a przeciw optymalizacji. To niezła ironia, że w dzisiejszych czasach równie dobrze może być stosowany w drugą stronę.

Był to wstęp do ciekawej dyskusji po prezentacji dotykającej co najmniej kilku tematów takich jak:

  • Dziedziczenie i interfejsy – w C++ i ogólnie w Embedded
  • Czystość kodu vs wydajność np. czy duplikacja kodu może być dobra
  • Kompromisy między idealnym rozwiązaniem a rzeczywistością projektową.

Oczywiście mam swoje zdanie na każdy z tych tematów. Ale rozwinę je bardziej w innych wpisach. Tutaj skupię się na relacji z meetupu.

Tak więc wracając do samej prezentacji – jakie elementy C++ warto stosować?

Jest ich cała masa. Mędzy innymi:

  • Aliasy zamiast define,
  • Enum class,
  • Namespace,
  • Ranged for,
  • Const Expression,
  • Ttemplate’y,
  • RAII – Resource Allocation as Initialization,
  • Placement new, aby alokować obiekty na konkretne adresy.

Po szczegóły oczywiście odsyłam do nagrania z prezentacji:

Mateusz słusznie zauważa, że nie trzeba wprowadzać wszystkich fajerwerków z nowoczesnego C++, aby odnieść korzyści. Już kilka małych rzeczy daje duży komfort pracy w porównaniu z C.

No ale właśnie trzeba pamiętać, że C++ to puszka Pandory. Razem z dobrymi elementami dostajemy całą masę złych. O tym, co może pójść nie tak nie było zbyt wiele. A to może być dobry temat na oddzielną prezentację. Dlatego moim zdaniem przy C++ w embedded szczególnie ważny jest dobry Coding Standard razem z wymuszaniem ich narzędziami do analizy kodu i code review. Bez tego nie zapanujemy nad dziwnymi konstrukcjami, które mogą przenikać do kodu.

Inne atrakcje

Centralnym wydarzeniem naszego meetupu jest oczywiście część techniczna. Ale tradycyjnie nie zabrakło również innych atrakcji. W przerwie między prezentacjami wjechała pizza. Po meetupie zostały pizze wegetariańskie. Ten trend się powtarza od samego początku naszych meetupów. Wychodzi, że programiści są fanami nie tylko mięsa technicznego, ale również mięsa na pizzy. W sumie nic dziwnego 🙂

Na koniec było również losowanie nagród od naszych sponsorów:

  • Ambient System
  • Solwit
  • ST Microelectronics

Tym razem do wygrania były eval boardy i multitoole.

Podsumowanie

Tak było na grudniowym meetupie (link do wydarzenia). Kolejny już 9 stycznia w Sztuce Wyboru. Aby nie przegapić – najlepiej zapisz się do naszej społeczności na Meetup.com. Będziemy tam wrzucać kolejne wydarzenia. Info znajdziesz również na profilu Gdańsk Embedded Meetup na Facebooku.

Daj znać w komentarzu jak podobały Ci się prezentacje, recenzja i cały meetup. Zachęcam również do włączenia się do dyskusji na tematy dotyczące C++ w embedded i interfejsów. Sam te tematy będę rozwijać w kolejnych wpisach.