xBerry Blog Od Rusta do bogactwa: czy aplikacje osadzone porzucą C++ na rzecz lepszej przyszłości?

Od Rusta do bogactwa: czy aplikacje osadzone porzucą C++ na rzecz lepszej przyszłości?

 

Odkrywając przyszłość systemów wbudowanych z Tronel i xBerry

Od Rusta do bogactwa: czy aplikacje osadzone porzucą C++ na rzecz lepszej przyszłości?

 

Witamy w inauguracyjnym wpisie naszego ekscytującego cyklu, w którym wspólnie z Partnerami odkrywamy technologie i innowacje. W tej edycji, we współpracy z Tronel, zagłębiamy się w fascynujący świat systemów wbudowanych. Dołącz do nas w podróży pełnej przewidywań i odkrywania nowych możliwości w tej dziedzinie.

 

Ze strony xBerry ekspert Adam Prochownik analizuje transformacyjną moc języka Rust i jego przewidywany wpływ na świat embedded. Jeśli interesują Cię jego spostrzeżenia, to lektura obowiązkowa!

 

Wzrost popularności Rusta w systemach wbudowanych

 

Rust, nowoczesny język programowania stworzony przez Mozillę, zdobywa imponującą popularność w ostatnich latach. Znany z wysokiej wydajności i bezpieczeństwa pamięci bez konieczności używania garbage collectora, Rust staje się atrakcyjną opcją w wielu obszarach, takich jak programowanie systemowe, tworzenie gier, a przede wszystkim systemy wbudowane. W miarę dojrzewania Rust staje się coraz stabilniejszy, oferując realną alternatywę dla tradycyjnych języków, takich jak C i C++.

 

Znacząca integracja Rusta

 

Droga Rusta do popularności nabrała ostatnio rozpędu, gdy został on zintegrowany z jednymi z najbardziej rozpoznawalnych projektów open source na świecie. Jądro Linuksa, dominujące na serwerach i w superkomputerach, zaczyna włączać Rust do swojego kodu. Celem tego działania jest wykorzystanie zasad bezpieczeństwa Rusta, co pomaga ograniczyć typowe błędy od dawna trapiące kernel napisany w C.

 

Dodatkowo, framework multimedialny GStreamer oraz silnik przeglądarki Chromium, napędzający takie przeglądarki jak Google Chrome, Microsoft Edge czy Opera, również zaczynają integrować Rust. Pokazuje to wszechstronność Rusta oraz jego potencjał do zwiększania stabilności i wydajności tych popularnych platform.

 

 

Rust jako bezpieczna alternatywa

Narodowa Agencja Bezpieczeństwa (NSA) opublikowała raport z zaleceniami unikania języków C i C++ z powodu braku wbudowanych mechanizmów bezpieczeństwa pamięci. W ślad za tym Microsoft zdecydował się promować użycie Rusta zamiast C++ w nowych projektach typu greenfield, co zapoczątkowało istotną zmianę w branży tworzenia oprogramowania. Gigant oprogramowania wybrał Rust jako preferowany język do zadań niskopoziomowych, które wymagają dużej kontroli nad zasobami systemowymi, ale nie potrzebują garbage collectora.

 

Ta decyzja jest wyrazem szerszego trendu w branży. W miarę jak bezpieczeństwo cybernetyczne staje się coraz ważniejsze, funkcje bezpieczeństwa pamięci w Ruście oraz jego nacisk na zapobieganie przekroczeniom granic pamięci i warunkom wyścigu czynią go atrakcyjnym wyborem.

 

Kwitnąca społeczność Embedded Rust

 

W ostatnich latach społeczność Rusta skoncentrowana na systemach wbudowanych dynamicznie się rozwinęła. Powstało wiele projektów, których celem jest tworzenie wydajnego i bezpiecznego kodu dla systemów bare-metal. Ten trend pokazuje potencjał Rusta w rozwoju oprogramowania embedded, gdzie ograniczenia zasobów oraz potrzeba bezpośredniego dostępu i kontroli sprzętu są kluczowe.

 

„Abstrakcje bez kosztów” w Ruście pozwalają na korzystanie ze składni na wysokim poziomie, podobnej do języków takich jak Python czy Ruby, przy jednoczesnym zachowaniu kontroli niskopoziomowej podobnej do C lub C++. To połączenie wygody i kontroli jest niezwykle ważne dla społeczności embedded, umożliwiając tworzenie wydajnego, bezpiecznego kodu, który jest łatwy do zrozumienia i utrzymania.

 

Rust dla rozwiązań IoT

 

Rozwój Internetu Rzeczy (IoT) wymaga języka programowania, który potrafi efektywnie sprostać różnorodnym wymaganiom — od niskopoziomowego dostępu do sprzętu w urządzeniach brzegowych po przetwarzanie na wysokim poziomie w chmurze. Dzięki swojej wszechstronności Rust okazuje się doskonałym wyborem do tego celu.

 

Co istotne, Rust może być używany zarówno do pisania backendu, jak i frontendu aplikacji. Taka jednolitość jest dużą zaletą w kontekście IoT, gdzie płynna integracja wielu warstw stosu technologicznego jest kluczowa. Wykorzystanie jednego języka w całym systemie IoT może usprawnić proces tworzenia oprogramowania i zwiększyć łatwość utrzymania kodu.

 

 

Rozwijający się zestaw narzędzi dla Rusta w IoT

 

Rosnąca popularność Rusta w rozwoju IoT zaowocowała powstaniem wielu narzędzi, które ułatwiają tworzenie rozwiązań IoT w tym języku. Przykłady to wsparcie no_std, pozwalające uruchamiać Rust w środowiskach bare-metal bez standardowej biblioteki, oraz cargo-embed, które służy do wgrywania i debugowania aplikacji na mikrokontrolerach.

 

Biblioteki takie jak embedded-hal abstrahują powszechne funkcje sprzętowe, natomiast RTFM (Real-Time For the Masses) dostarcza framework do budowania niezawodnych, wydajnych systemów czasu rzeczywistego.

 

Co więcej, ekosystem Rusta stale się rozwija dzięki rozwojowi WebAssembly (Wasm), umożliwiając uruchamianie aplikacji Rust w przeglądarce, co otwiera nowe możliwości w tworzeniu frontendowych rozwiązań IoT.

 

Automatyczne generowanie warstwy abstrakcji sprzętowej z SVD

 

Kolejną zaletą, jaką Rust wnosi do rozwoju systemów wbudowanych, jest możliwość automatycznego generowania warstw abstrakcji sprzętowej (HAL) z plików System View Description (SVD). Pliki SVD opisują peryferia mikrokontrolera i zazwyczaj są dostarczane przez producenta układu scalonego. Funkcja ta stanowi ogromną pomoc dla programistów, ponieważ pozwala zaoszczędzić dużo czasu, który w przeciwnym razie byłby poświęcony na ręczne definiowanie peryferiów. Co istotne, wykorzystanie plików SVD sprawiło, że Rust obsługuje szeroki wachlarz mikrokontrolerów. Jeśli dany mikrokontroler nie jest jeszcze wspierany, elastyczny proces tłumaczenia SVD na Rust pozwala użytkownikom końcowym na stosunkowo łatwe dodanie wymaganej obsługi. Poszerza to zastosowanie Rusta w obszarze systemów wbudowanych, umożliwiając realizację projektów o różnych wymaganiach sprzętowych i specyfikacjach.

 

Embassy: Async runtime dla systemów bare metal

 

Jeśli chodzi o obsługę wielu zadań w systemach wbudowanych, Rust oferuje kolejne rewolucyjne narzędzie: Embassy. Embassy to asynchroniczny runtime w języku Rust, specjalnie zaprojektowany dla systemów bare metal, który wprowadza możliwości programowania async do świata embedded.

 

Programowanie asynchroniczne może być potężną techniką do zarządzania złożonymi, współbieżnymi działaniami, które są typowe dla systemów wbudowanych, np. obsługi wielu wejść z czujników czy zarządzania interfejsami komunikacyjnymi. Jednak w językach niskopoziomowych, tradycyjnie używanych w embedded (takich jak C czy C++), implementacja async jest często trudna i podatna na błędy.

 

Historycznie, w braku programowania asynchronicznego, programiści systemów wbudowanych polegali głównie na dwóch podejściach do obsługi wielu zadań.

 

Pierwszym podejściem jest użycie systemu operacyjnego czasu rzeczywistego (RTOS) z wątkami. Każdy wątek odpowiada za jedno zadanie, działając niezależnie od pozostałych. Choć metoda ta pozwala na równoczesne wykonywanie zadań, wymaga ręcznej obsługi komunikacji między wątkami. Komunikacja ta często wiąże się z używaniem prymitywów synchronizacyjnych, takich jak semafory, blokady czy zmienne warunkowe, co zwiększa złożoność i ryzyko błędów, takich jak deadlocki czy warunki wyścigu. Ponadto podejście to wiąże się z dużym narzutem, ponieważ każdy wątek wymaga własnego stosu, a system musi zarządzać przełączaniem kontekstu, co dodatkowo zużywa zasoby.

 

Drugim podejściem jest ręczne stworzenie głównej kolejki zadań lub tzw. „superloopa”. W tym przypadku wszystkie zadania są zarządzane w jednej pętli w funkcji main, a każde zadanie jest sprawdzane i obsługiwane sekwencyjnie w każdej iteracji. Choć eliminuje to konieczność skomplikowanej synchronizacji wątków, wprowadza inne problemy. Kod staje się trudny do zarządzania wraz ze wzrostem liczby zadań, a długotrwałe zadania mogą blokować cały system, ponieważ inne nie mogą być wykonywane, dopóki obecne się nie zakończy. W rezultacie kod często staje się trudny do utrzymania i zrozumienia, zwłaszcza w bardziej złożonych systemach.

 

Embassy wykorzystuje funkcję async/await w Ruście, umożliwiając programistom pisanie nieblokującego kodu, który jest czytelny i łatwy do zrozumienia, przenosząc proces ręcznego tworzenia głównej pętli na kompilator. Dostarcza społeczności embedded rozwiązanie do pisania współbieżnego kodu w sposób prostszy i mniej podatny na błędy. To potężne połączenie programowania asynchronicznego i mechanizmów bezpieczeństwa Rusta znacząco upraszcza tworzenie zaawansowanych zachowań czasu rzeczywistego w systemach wbudowanych.

 

 

Podsumowanie

 

Rosnąca popularność Rusta, jego coraz większa stabilność oraz zainteresowanie ze strony największych graczy branży technologicznej zwiastują ekscytującą erę dla tego stosunkowo młodego języka programowania. Oznacza to istotną zmianę w branży oprogramowania w kierunku priorytetowego traktowania bezpieczeństwa, wydajności i wygody programistycznej. Dzięki tym zaletom udział Rusta w systemach wbudowanych, a szczególnie w rozwiązaniach IoT, prawdopodobnie będzie się dalej dynamicznie rozwijał w nadchodzących latach.

 

Czujesz się zainspirowany? Dołącz do nas, gdy wspólnie odkrywamy nieustannie ewoluujący świat systemów wbudowanych, otwierając nowe horyzonty i ukazując wyjątkową synergię między Tronel a xBerry. Odwiedź blog Tronel, aby przeczytać pasjonujący artykuł “Dlaczego programowanie w C++ wciąż ma się dobrze w systemach wbudowanych“, który doskonale uzupełnia temat i pomoże poszerzyć Twoją wiedzę oraz pobudzić technologiczną wyobraźnię. Wejdź na blog Tronel już teraz i rozpocznij niezwykłą podróż, która sprawi, że będziesz chciał jeszcze więcej.

Powiązane blogi

Planujesz nowy projekt?

Porozmawiajmy Arrow icon