Rust czy C++ do Embedded

Rust czy C++ do Embedded
DN
  • Rejestracja:około 4 lata
  • Ostatnio:3 dni
  • Postów:36
0

Koduje w Embedded już od kilku lat, tylko i wyłącznie w C. Chciałbym spróbować jakiejś nowej technologii, ale wciąż związanej z Embedded. Zaszaleć i sprawdzić tego Embedded Rusta czy gra nie warta świeczki i lepiej postawić na C++?
Zawsze chciałem nauczyć się C++ już nawet nie dla samego embedded, ale jak patrzę na ten język to mam wrażenie, że żeby tam dobrze klepać to trzeba być bardzo na bieżąco, a standardy coraz to nowsze. Najzwyczajniej w świecie trochę mi się nudzi czyste C i bym się "pomocował" z innym językiem na bare-metalu na jakimś ARMowym Cortex-M w ramach odskoczni.

Chyba, że znacie jakieś inne dające mocną frajdę technologię? :D .. nie cierpię webdevu jak coś.

edytowany 1x, ostatnio: dnj
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:1493
3

Generalnie problem z językiem C++ w embedded polega na tym, że np. spora cześć STLa bazuje na alokacjach pamięci, które raczej na małych mikrokontrolerach specjalnie korzystne nie są i np. musiałbyś stosować własne implementacje czy to STLa czy alokatorów. Niemniej, kodzić się da w tym nowoczesnym C++ całkiem skutecznie, taki np. DistortOS jest żywym tego przykładem.

edytowany 1x, ostatnio: alagner
Zobacz pozostałe 2 komentarze
DN
kiedyś już się natknąłem na ten DistortOS, a to czasem nie jest jakiś sofcik polski? :^) Muszę zobaczyć.
DN
a co fajnego można porobić w tym Rust na PC? :^)
DN
Jaki ten świat mały, patrzę na contributorów na github tego DistortOSa, a tam kolega z pracy, zapytam u źródła :D
AL
Tak, rzeźbi go człowiek z Zawiercia. A co do Rusta: pobaw się, zobaczysz. Ogólnie (okiem laika także mogę tu się gdzieś mylić) to jest taki C++ z value semantics i by default wbudowanym memory sanitizerem i bez explicit konwersji.
DN
@alagner: wiesz co, jakoś się do C++ nie mogę przekonać. Spróbuję Rust najpierw.
DN
  • Rejestracja:około 4 lata
  • Ostatnio:3 dni
  • Postów:36
1

Zdaję tak trochę relację z tego Rusta w Embedded. Na razie jest trochę ciężko, ale powoli powoli oswajam się z klimatem...
Udało mi się coś już podebugować pod gdb oraz w samym VSCode z dodatkiem Cortex Debug.
Nie tylko na Nucleo, ale także na takim chipie zwykłym na PCBie.

Tak w jak w C wiem jak wszystko się "odprawia" od samego początku w mikrokontrolerach (skrypt linkera, kod startupowy, wektory przerwań i ich obsługa, diassembly...) tak tutaj trochę jeszcze tak się czuję jak bym po omacku coś pisał i nagle działa, ale spokojnie dokopię się do bebechów.

Zacząłem sobie pisać aplikację taką prostą do zapisywania jakiś notatek/zadań i nawet ciekawie się to pisze.
Na pewno cargo na tle jakichś #include'ów to jest niebo a ziemia. Komunikaty kompilatora są o niebo przejrzystsze, ale to chyba kosztem czasu kompilacji (C się o wiele szybciej kompiluje).

SL
Czy czasy kompilacji to problem w embedded? Pytam serio, bo się nie znam. W porównaniu do C/C++ (a zwłaszcza C++) zewnętrzne zależności nie wpływają aż tak bardzo na czas kompilacji (w C++ dodanie standardowego headera do projektu potrafi wydłużyć czas kompilacji jednego pliku do 2 sekund, serio), więc przy dobrej modularyzacji możesz osiągnąć całkiem dobry dev experience. No i Rust ma coś takiego jak cargo check, który odpala tylko frontend kompilacji, który przydaje się przy workflow, że robię małą zmianę i patrzę, czy kompilator nie krzyczy
DN
"Czy czasy kompilacji to problem w embedded?" W moim przypadku nie, nie wiem jak w innych projektach. A co do cargo check to fakt ułatwia o wiele szybkie sprawdzanie po napisaniu jakiegoś kawałka. Może po prostu ja jestem zwykły z C tego, że rebuilduje zazwyczaj cały projekt.
KR
W 2 sekundy to rust potrafi skompilować cały duży projekt po niewielkiej zmianie łącznie z linkowaniem a nie jeden plik. Wg mnie Rust kompiluje znacznie szybciej niż C++ i nieco wolniej od C, ale z C ciężko porównywać bo jednak kodu w C trzeba zwykle napisać sporo więcej aby to samo osiągnąć.
MD
  • Rejestracja:około 8 lat
  • Ostatnio:około miesiąc
  • Postów:43
1

Może to przyśpieszy Ci trochę czas kompilacji: https://github.com/mozilla/sccache

SL
sscache ma sens jako remote cache oraz jak kompilujesz C/C++ (bo tam nie masz normalnego build cache). Przy normalnym rustowym flow zwykły cargo build cache jest wystarczający
Marcin Marcin
  • Rejestracja:prawie 6 lat
  • Ostatnio:29 dni
  • Postów:610
1



Fan moderatora somekind
edytowany 1x, ostatnio: Marcin Marcin
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1

Wydaje się że na dzień dzisiejszy Rust będzie dużo lepszym zastępnikiem dla C niż C++ w działce embedded.

Zajrzyj na:
https://www.rust-lang.org/what/embedded
https://docs.rust-embedded.org/book/

DN
Chodzi Ci o to, że Rust zagarnie część, która jest aktualnie zajęta przez C, a C++ pozostanie bez zmian w tej działce, dobrze rozumiem?
vpiotr
Wg mnie C++ będzie eliminowany z rynku mimo tego że się rozwija - głównie był stosowany jako bardziej zaawansowane C i na tym polu jest o wiele za bardzo przekombinowany w stosunku do Rust. C++ jest dużo starsze i ma przez to dużo różnego niepotrzebnego bagażu.
DN
No jestem ciekaw. Jestem zainteresowany, ale jest wysokie wejście, przynajmniej ja tak odczuwam.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około godziny
  • Postów:8406
0

Arduino to też embedded? (tak pytam, nie znam się). W sensie czy to, co jest mówione o embedded, można zastosować do arduino? (planuję się pobawić tym w ciągu najbliższych miesięcy).


Marcin Marcin
Sprawdź STM32 choć możesz mieć problem z dostępnością.
DN
  • Rejestracja:około 4 lata
  • Ostatnio:3 dni
  • Postów:36
0

@vpiotr: A co do linków to dzięki. Znam je, już nawet trochę porobiłem na nucleo. Tylko mam wrażenie że powinienem najpierw zrobić deep dive w samego Rusta bo powoli mi idzie bo nie znam dobrze filozofii. W każdym razie Rust skomplikowany jest dość moim zdaniem. Na tle C, którego używam na co dzień.

Zobacz pozostały 1 komentarz
DN
Myślałem że potężny embeddedziarz
vpiotr
Nie, raczej mi daleko do tego. Robiłem trochę w tym w poprzednim stuleciu.
DN
To chwal się co robiłeś/robisz, no dawaj!
vpiotr
8042 (analiza kodu sterownika klawiatury), RS232C (terminal siłowni energetycznej), 74XX (różne układy hobbystyczne)
vpiotr
Bardziej mnie interesowały duże maszynki (8bit, pc) + hardware niż embedded. Ostatnio najmniejsze z czym miałem styczność to Raspberry Pi, ale w zasadzie to głównie się kurzy w magazynie. Na 8 bitach zaczynałem programowanie w C (ZX lub Atari - nie pamiętam dokładnie, na obu miałem kompilator).
DN
  • Rejestracja:około 4 lata
  • Ostatnio:3 dni
  • Postów:36
1

@LukeJL: nie wiem czy mnie ktoś zaraz nie zlinczuje, ale uważam że Arduino to się nadaje jak ktoś nie chce wchodzić właśnie w naukę embedded, a chce coś wykonać na sprzęcie elektronicznym albo jako taki pierwszy widok czym to jest. Ja na przykład nie miałem w swoim życiu ani jednego Arduino i raz tylko kumplowi pomagałem bo chcial sobie coś zbudować z tutoriala step by step i mu nie działało. Mimo to technicznie rzecz biorąc jest to embedded bo na płytce jest mikrokontoler i można go programować.

stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
1

Arduino (jako biblioteka) technicznie to taki zbior gotowych funkcji. A jako sprzet to po prostu jakas atmega, pewnie 328p (arduino uno) z wyprowadzonymi pinami na plytce. Mozesz wziac dokumentacje AVR i krok po kroku pisac odpowiednie wartosci do rejestrow albo od razu wywolac funkcje i zajac sie tym co ma robic uC. Niekoniecznie jak ma to zrobic z dokladnoscia do bita w rejestrze. Ale tak poza tym to nie masz OS, masz takie same ograniczenia pamieciowe itd.


λλλ
edytowany 4x, ostatnio: stivens
Marcin Marcin
Moim zdaniem to fajna platforma na początek.
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 3 lata
  • Postów:1493
2

Tak, to jest zdecydowanie embedded. W złym stylu często, z wieloma bibliotekami poniżej poziomu mułu, ale jak chcesz coś na szybko wychałturzyć to ma prawo to zadziałać. Tylko niejednokrotnie okazuje się, że zrobienie czegokolwiek bardziej niestandardowego i tak kończy się pisaniem wszystkiego od zera na rejestrach ;P

edytowany 1x, ostatnio: alagner
VT
No właśnie jak z poziomu Rusta pisać po rejestrach? Znam tylko podstawy Rusta i jakoś tego nie widzę... Zdaje się, że w Ruście nie ma wskaźników. Trzebaby się chyba posłużyć jakąś biblioteczką niższego poziomu pisaną w C :)
AL
Pogooglac musisz, ale w skrócie - da się.
Marcin Marcin
  • Rejestracja:prawie 6 lat
  • Ostatnio:29 dni
  • Postów:610
0

Pamiętajcie że jest arduino
https://www.arduino.cc/
oraz arduino pro
https://www.arduino.cc/pro
To drugie, dużo lepiej nadaje się do zastosowań profesjonalnych

Samo arduino w swojej historii miało być z założenia prostą platformą do prototypów


Fan moderatora somekind
JO
Rust jest drugim najbardziej ekologicznym językiem programowania zaraz po C. Może warto promować ten język i zmniejszać CO2 na świecie? https://hackaday.com/2021/11/18/c-is-the-greenest-programming-language/
WB
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 3 lata
  • Postów:5
1

Rust? Byle nie ""Rust on bare metal"! Już sama nazwa jest ostrzeżeniem.

DN
Ty dowcipasie Ty :P
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)