Jak zostać programistą oprogramowania wbudowanego?

22

Chciałbym uzyskać wskazówki dla tych, którzy chcą zostać dobrym programistą oprogramowania wbudowanego lub chcą ulepszyć tę dziedzinę.

Czego powinienem nauczyć się o sprzęcie, oprogramowaniu?

Które książki są najbardziej polecane? Blogi?

W końcu, jak mogłem przejść od początkującego hobbysty do doskonałego profesjonalisty?

Daniel Grillo
źródło

Odpowiedzi:

39

Wszystkie odpowiedzi były jak dotąd dobre, ale wrzucę moje dwa centy.

Oto powtórzenie kilku wskazówek z niespodzianką i kilkoma dodatkowymi:

  • Naucz się C: podstawowy język sprzętu, który jest nadal przenośny (w pewnym stopniu). Nie tylko się go ucz, ale zostań ekspertem od wszystkich jego funkcji, takich jak zmienność i dlaczego jest to ważne przy pisaniu sterowników urządzeń.
  • Zacznij od dobrego zestawu programistycznego, takiego jak Arduino, ale jak powiedziano wcześniej, naucz się innych architektur, gdy tylko dobrze się z tym poczujesz. Na szczęście istnieje kilka płyt kompatybilnych z Arduino zbudowanych z innymi procesorami, w ten sposób możesz przepisać ten sam projekt na innym komputerze, aby nie zepsuć całego projektu, a jednocześnie poczuć coś nowego.
  • Na etapie nauki możesz wymyślić koło na sterownikach urządzeń lub innych elementach kodu. Nie umieszczaj tam kodu sterownika innej osoby. Podczas uczenia się warto ponownie wynaleźć koło.
  • Rzuć sobie wyzwanie, aby napisać kod bardziej efektywnie pod względem szybkości i zużycia pamięci.
  • Zapoznanie się z różnymi stylami architektury oprogramowania systemów wbudowanych. Zacznij od podstawowego przetwarzania sterowanego przerwaniami / pętli tła, następnie przejdź do harmonogramów tła, a następnie systemów operacyjnych w czasie rzeczywistym.
  • Uzyskaj dobrą kontrolę źródła! Sam wolę Mercurial .
  • Zarejestruj się nawet w niektórych darmowych witrynach hostujących kontrolę źródła, takich jak Sourceforge.net lub Bitbucket.org, aby hostować swój projekt, nawet jeśli tylko ty nad nim pracujesz. Utworzą kopię zapasową kodu, więc nie musisz się martwić, że czasami awaria dysku twardego zniszczy wszystko! Przydaje się korzystanie z rozproszonego VCS, ponieważ możesz sprawdzić zmiany na dysku twardym, a następnie przesłać je na stronę hosta, gdy będzie ono gotowe.
  • Naucz się dobrze swoich narzędzi do każdego układu, nad którym pracujesz! Niezbędna jest wiedza o tym, jak kompilator tworzy zestaw. Musisz sprawdzić, jak wydajny jest kod, ponieważ może być konieczne przepisanie w asemblerze. Niezbędna jest również wiedza o tym, jak korzystać z pliku linkera i interpretacja danych wyjściowych mapy pamięci! Jak inaczej dowiesz się, czy ta rutyna, którą właśnie napisałeś, jest winowajcą zbyt dużej ilości pamięci ROM / Flash!
  • Naucz się nowych technik i eksperymentuj z nimi w swoich projektach!
  • Nie zakładaj niczego podczas debugowania. Sprawdź to!
  • Dowiedz się, jak programować defensywnie, aby wychwytywać błędy i weryfikować założenia (np. Używając assert)
  • Zbuduj informacje o debugowaniu w kodzie, w których możesz na przykład wyprowadzać zużycie pamięci lub profilować kod za pomocą timerów lub używać zapasowych pinów na PC, aby przełączać i mierzyć opóźnienia przerwań w zakresie O.

Oto kilka książek:

Oto niektóre strony internetowe:

  • Osadzeni guru
  • Grupa Ganssle Jack Ganssle ma wspaniałe historie do opowiedzenia. Przeczytaj artykuły. Jednak dostaje trochę kazań na temat niektórych rzeczy.
  • Embedded.com Dobre informacje o najnowszych technikach i wskazówkach od Ganssle, Barr i innych ekspertów branżowych.
Jay Atkinson
źródło
1
@Adam: Kocham tę książkę! Pragmatyczny programista! Nie mogę uwierzyć, że zapomniałem!
Jay Atkinson
1
+1 dla Mercurial. Podoba mi się, choć mam wrażenie, że znajomość git byłaby cenniejsza. Zapoznanie się z podstawami SVN jest dość ważne, jeśli chcesz wnosić wkład lub czerpać z innych projektów, ponieważ z tego korzysta wiele z nich.
tyblu,
17
  • Pamiętaj: „Nie ma srebrnej kuli” , nie wpadnij w pułapkę przekonania, że ​​istnieje jedno narzędzie, metodologia, język lub system, który może rozwiązać wszystkie problemy
  • Zostań ekspertem w C
    • Naucz się radzić sobie bez malloc () i POSIX
  • Nie rozłącz się z jedną architekturą, łatwo zostać przypadkowo fanem PIC, AVR lub ARM
  • Twórz rzeczy, debuguj je, działaj. Praktyka czyni mistrza
  • Naucz się co najmniej jednego systemu kontroli źródła (SVN / git / etc) i używaj go
  • Zawsze bądź przygotowany na przetestowanie swoich założeń. Błąd jest zwykle związany z założeniem, że działa
  • Nie polegaj zbytnio na debuggerach, są one różne w każdym systemie i mają różną niezawodność
  • Myśl oszczędnie. Podczas rozwiązywania problemów należy wziąć pod uwagę ślad kodu, rozmiar pamięci RAM i koszt sprzętu

W przypadku książek polecam przeglądanie historii. Większość współczesnych technik oprogramowania wbudowanego pochodzi z przełomowej przeszłości.

Jak wszystko, ćwicz codziennie.

Toby Jaffey
źródło
5
Ze wszystkich rzeczy, których się nauczyłem, kontrola wersji (obecnie używam subversion) jest najbardziej wartościową rzeczą dla mojej produktywności. Kiedy zaczynałem tutaj, mieliśmy źródła bezpieczne od Microsoftu, więc użyłem złego rozwiązania, a potem dobrego.
Kortuk
Nie wyobrażam sobie życia bez systemu kontroli źródła. Obecnie używam również SVN. Nie wiem, jak to działało, zanim poznałem SVN.
Daniel Grillo
1
+1 za „Błąd występuje zwykle w założeniu, że działa”
JustJeff
„Naucz się radzić sobie bez malloc” - dlaczego? Aby zminimalizować ryzyko kolizji stosu / sterty?
rzetterberg
@rzetterberg Wiele systemów wbudowanych unika dynamicznego przydzielania pamięci, ponieważ może to prowadzić do fragmentacji sterty i nieokreśloności
Toby Jaffey
8

Inne odpowiedzi są świetne, ale największą różnicą między hobbystą a profesjonalistą powinno być nastawienie na jakość. Niech więc Twój projekt zostanie ukończony, nie przestawaj, gdy skończysz w 80% projekt. Weź to na całość, udowodnij, że działa i poprawnie udokumentuj.

Upewnij się, że Twój kod jest czytelny i łatwy do utrzymania.

I nie zapomnij też dobrze się bawić :)

Johan
źródło
7

Oprócz oczywistych rzeczy, takich jak nauka języka C i rozpoczęcie pracy z płytą programistyczną, musisz nauczyć się czytać arkusze danych mikrokontrolera .
Producenci dodają coraz więcej funkcji do mikrokontrolerów, które stają się coraz bardziej złożone. Arkusz danych zawiera nie tylko charakterystykę elektryczną (co jest bardziej interesujące dla inżyniera elektroniki niż twórcy oprogramowania), ale także szczegółowy opis rejestrów, map pamięci itp.
Przy pierwszym czytaniu arkusz danych może wyglądać zniechęcająco, ale go nie rozumie może powodować silniejszy ból głowy w fazie debugowania.

rev stevenvh
źródło
3

„Embedded” to trochę załadowany termin.

Pod pewnymi względami każdy system przeznaczony do uruchamiania jednej aplikacji można nazwać systemem wbudowanym, o ile istnieje pewien sprzęt do kontrolowania. Prawdopodobnie możesz zadzwonić na PPC604 400 MHz z 2 GB pamięci RAM, na której działa aplikacja java na Linuksie, w systemie osadzonym, jeśli zdarza się, że kontroluje proces za pośrednictwem lokalnych modułów I / O. Z drugiej strony, arduino z uruchomioną jakąś minimalną aplikacją sieciową nie byłoby zbytnio systemem osadzonym. Ale prawdopodobnie „wbudowane” sprawia, że ​​większość ludzi myśli o kontrolerach opartych na pamięci flash z zaledwie kilkuset bajtami pamięci RAM, bez systemu operacyjnego, o których mowa, i mnóstwem urządzeń peryferyjnych na chipie.

To powiedziawszy, prawdopodobnie dwie największe przeszkody, które nie są wbudowane w programistów, zwykle napotykają uczenie się systemów wbudowanych, to rejestry I / O i przerwania.

Przerwania mogą być łatwiejsze do opanowania z dwóch koncepcji dla niewbudowanych programistów, ponieważ główne problemy z nimi, programowanie współbieżne i oparte na zdarzeniach, często występują w aplikacjach głównego nurtu. To, co sprawia, że ​​przerwanie jest uciążliwe, to uświadomienie sobie niezwykłej wrażliwości systemu na jakość obsługi przerwań oraz zawiłości w radzeniu sobie ze sprzętem w celu usunięcia stanu przerwania i skonfigurowania go na następny. Dzięki GUI impas zabija tylko aplikację. W przypadku obsługi przerwań zakleszczenie powoduje zablokowanie całego systemu.

Urządzenia I / O wydają się być obszarem, który powoduje najwięcej trudności. Dla niewtajemniczonych może być zaskoczeniem odkrycie, że czytanie tego rejestru tutaj ma wpływ na ten rejestr tam . Zapisywanie 1 w celu wyczyszczenia bitów. Bity statusu, które same się usuwają podczas odczytywania rejestru danych itp. Sprzęt I / O ma tak wiele możliwości, że nie ma ogólnej zasady radzenia sobie z nim, z wyjątkiem uczenia się, jak znaleźć i interpretować arkusze danych urządzenia. Napisanie sterownika urządzenia dla portu szeregowego nauczy Cię wiele na temat programowania niskiego poziomu we / wy.

Naprawdę nie ma substytutu dla uczenia się tych rzeczy niż zwijanie rękawów i programowanie prostego języka C i / lub asemblera na gołym metalu. Nawet wyżej wspomniany system osadzony oparty na Javie ostatecznie potrzebuje sterownika urządzenia dla I / O, a to ostatecznie oznacza radzenie sobie z niektórymi C. Doświadczenie jest najlepszym nauczycielem. Wybierz mikrokontroler, czy to MSP430, TMS320, AVR, ARM, PIC, 68HC11, cokolwiek, znajdź zestaw ewaluacyjny i zbuduj kilka systemów.

JustJeff
źródło
3

$50to$ale musisz przylutować do pro mini. Nie jestem fanem rodziny PIC, ale możesz chcieć coś tam zdobyć jako lekcję historii, to samo dotyczy 8051, obie rodziny są nadal popularne i używane, po prostu niezbyt wydajne i zostały pominięte przez inne architektury. Absolutnie naucz się ARM i kciuka, może MIPS (czyli pic-32, nie mylić ze starszą oryginalną architekturą PIC). ARMmite Pro to dobra podstawowa płyta ARM, chociaż Stellaris może być również.

To, czego chcesz się tutaj nauczyć, to asembler dla różnych platform. C. C i interakcja asemblera. Różne narzędzia GCC i inne niż GCC. Jak czytać zestawienie danych / programistów (i zdać sobie sprawę, że wszystkie mają pewne błędy lub mogą wprowadzać w błąd, nigdy nie ufaj im, sprzęt wygrywa nad dokumentami) i jak czytać lub używać schematu. Nie są to zwykle skomplikowane schematy. Wiele kart nadaje się do współpracy w projektach, co oznacza, że ​​nie mają na sobie śmieci, tylko bezpośredni dostęp do styków we / wy. Ale to nie jest najlepsze do nauki. Coś jak StellarisNa pokładzie, który jest bolesny dla projektów, znajduje się mnóstwo zabawnych rzeczy do nauki osadzania i uczenia się pożyczania / używania sterowników lub pisania własnych z kart danych. Motyl Atmel AVR jest również dobrą płytą, jeśli nadal jest dostępny, może wymagać lutowania na własnym porcie szeregowym, aby go zaprogramować lub po prostu zablokować niektóre przewody w otworach. Daje ci to kilka urządzeń peryferyjnych, których możesz nauczyć się programować.

Nawet jeśli zakończysz pracę osadzoną, która polega na pisaniu aplikacji przy użyciu wywołań SDK lub API w systemie Linux lub RTOS (nigdy nie dotykając sprzętu ani nie czytając kart danych), powyższa wiedza wciąż będzie Cię wyprzedzać.

Daniel Grillo
źródło
3

Ten artykuł (automatycznie przetłumaczony z portugalskiego na angielski) zawiera dobry przegląd rozwoju kariery jako programisty oprogramowania wbudowanego. Uwaga: oryginał jest tutaj .

Zaczyna się od nakreślenia obszarów wiedzy, które musisz rozwinąć:

  1. Wiedza: Musisz znać teorię związaną z systemami wbudowanymi. Oznacza to sprzęt i oprogramowanie. Nie można być kompetentnym twórcą oprogramowania wbudowanego bez znajomości działającej architektury sprzętowej.

  2. Umiejętność: Musisz zdobyć doświadczenie w okolicy. Potrzebuje praktyki. Możesz ozdobić wszystkie mnemoniki asemblera PIC, ale nie ma sensu, jeśli nie możesz prowadzić diody LED z tą wiedzą.

  3. Postawa: Przede wszystkim potrzebujesz postaw, które pozwolą ci rosnąć w tym obszarze. Jest bardzo dynamiczny z częstymi zmianami i zmianami. Musisz zawsze mieć motywację (a) być samoukiem, czerpać radość z nauki, „ulepszać” i rozumieć, jak to działa. Bez takich postaw da ci wkrótce. Ponieważ ten obszar musisz być bardzo, bardzo wytrwały.

Następnie podaje następujące wskazówki dotyczące opanowania tych obszarów (i rozwija je z dalszym tekstem, to tylko nagłówki):

  1. Czego potrzebujesz, aby nauczyć się sprzętu (przynajmniej)
  2. Czego potrzebujesz, aby nauczyć się oprogramowania (przynajmniej)
  3. Ponadto przestudiuj systemy operacyjne
  4. Potrzebujesz szkolenia
  5. Nie przestawaj, ucz się i rozwijaj sieć!
Kevin Vermeer
źródło
1
Dzięki za link! Tłumaczenie Google wydaje się wskazywać, że idealnie pasuje do tego pytania. Wolelibyśmy jednak, aby (1) tekst był w języku angielskim (jesteśmy anglojęzyczną społecznością , chociaż wielu z nas jest co najmniej dwujęzycznych) - Tłumaczenie automatyczne tylko wtedy, gdy musisz (2) odpowiedź zawiera streszczenie artykułu na wypadek, gdyby link zniknął. Zredagowałem Twój post, aby zastosować się do tych wytycznych, i dałem Ci za to głos!
Kevin Vermeer
2

Zastanów się dwa razy, zanim zostaniesz inżynierem oprogramowania wbudowanego. W swojej karierze miałem fazy. Przez pierwsze 5 lat tworzyłem oprogramowanie, potem przeniosłem się do działu sprzedaży / marketingu, robiłem to przez 15 lat, zarządzałem biznesem o wartości ponad 100 mln USD i teraz wróciłem do oprogramowania.

Kiedy wracam do oprogramowania po 15 latach, pamiętam, dlaczego w ogóle odszedłem. To jest trudne. Wymaga koncentracji, kilkuset linii kodu, które stykają się ze sobą, i wszyscy musicie zachować go w pamięci. Osadzony jest szczególnie trudny.

Musisz także zrozumieć siebie. Jeśli jesteś ogólnie mądrym facetem, skrupulatnym i cierpliwym, zrobiłbyś z tego świetnego inżyniera. Jeśli brakuje jednego z nich, będziesz w najlepszym razie średni. Pomyśl o tym. Jeśli jesteś bardzo inteligentny i nie cierpliwy, nie ma wiele, bo bez względu na to, jak jesteś inteligentny, dobra inżynieria wymaga cierpliwości i dbałości o szczegóły.

Musisz także czuć się komfortowo, patrząc na godziny kodu bez rozmowy. Zauważam, że ludzie o dobrych umiejętnościach społecznych uważają to za nie do zniesienia.

Jeśli to wszystko się sprawdzi, przeczytaj wszystkie te wspaniałe książki, zrób ćwiczenia, a staniesz się świetnym inżynierem. Powodzenia

Frank
źródło
1

Wszyscy inni mówią wspaniałe rzeczy. Więc dam ci ogólną radę: czytaj czytaj czytaj czytaj czytaj czytaj czytaj czytaj!

Przeczytaj każdy artykuł na stronie http://embeddedgurus.com. Jeśli czegoś nie rozumiesz, sprawdź to. Jeśli w wyjaśnieniu tych rzeczy znajdziesz coś, czego nie rozumiesz, przeczytaj więcej. Mam zamiar zająć pozycję oprogramowania wbudowanego, a moje doświadczenie to garść profesjonalnych projektów z ostatnich kilku lat i dużo czytania. Doświadczenie pozwala ci wypróbować różne rzeczy, ale czytanie pozwala dowiedzieć się, czy rzeczy, które próbowałeś zrobić, były wcześniej robione, może lepiej niż możesz. Wprowadza Cię w koncepcje, z którymi możesz pracować w każdych okolicznościach.

Po prostu czytaj!

AngryEE
źródło
0

Zostań ekspertem w dziedzinie Zrozumienie timerów i komunikacji szeregowej. Powinieneś go zabrudzić. Poznaj protokoły RF, dostosuj je do swoich wymagań. Nie próbuj na ślepo kombinacji kodu podczas debugowania. Kod robi dokładnie to, co mu każesz. Przeczytaj instrukcję obsługi i arkusz danych, a następnie wprowadź zmiany, jeśli coś nie działa. Wszystko, co zostało powiedziane i zrobione, jedynym prawdziwym sposobem na zostanie ekspertem jest ćwiczenie. Kontynuuj tworzenie aplikacji. Wkrótce stanie się drugą naturą.

Dominic Pritham
źródło