Języki programowania dla inżynierów elektroników

22

Jestem studentem elektroniki i inżynierii komunikacji, zanim dostałem się na studia, interesowałem się programowaniem i aplikacjami komputerowymi. Skoncentrowałem się na projektowaniu aplikacji Windows i nauce ich technik, ale teraz czuję, że jest to bezużyteczne w mojej dziedzinie ... Nie muszę się uczyć wszystkiego o informatyce i programowaniu! (Czy mam rację?)

Znam VB .Net, C # i C ++. Mam dużo czasu na wakacjach, więc chcę zagłębić się głębiej programowo w „dziedzinie elektroniki”. Na czym więc poleciłbyś się uczyć lub na czym się skupić?

Chcę, aby te języki były używane do programowania mikrokontrolerów i innych układów scalonych. Czy C ++ wystarcza, czy też powinienem opanować C? Powiedz mi, proszę, co myślisz.

Siraj Muhammad
źródło
3
„Lut” lub, mówiąc poważniej, zwykły C jest dość tradycyjny w przypadku narzędzi pomocniczych, choć Python jest obecnie nieco modny.
Chris Stratton,

Odpowiedzi:

29

Tak, prawie na pewno dobrym posunięciem jest nauczenie się korzystania z C tak dobrze, jak to możliwe (C ++ da ci pomocny punkt wyjścia, chociaż jako uwagi po lewej stronie nadal będzie wiele do zrobienia , zwłaszcza różnice między kodowaniem dla małych systemów osadzonych w porównaniu do pisania dla czegoś takiego jak Windows), biorąc pod uwagę jego wszechobecność.

Większość mikrokontrolerów poniżej określonego rozmiaru (np. PIC, AVR, MSP430 itp.) Używa C (lub asemblera), ponieważ istnieje wiele wysokiej jakości wersji (darmowa i $$ - np. Wiele komercyjnych kompilatorów opartych na darmowym kompilatorze GCC) Dostępne są kompilatory C .
Dostajesz inne języki, takie jak doskonały JAL dla PIC (oryginalny autor Wouter Van Ooijen, który jest tutaj członkiem), PICBASIC, warianty Ada, ale ze względu na popularność i liczbę dostępnych kompilatorów powiedziałbym, że C jest językiem wyboru dla większości. Chociaż z pewnością nie oznacza to, że jest to najlepszy język, korzystanie z najpopularniejszego języka ma oczywiste zalety (dokumentacja, wsparcie, przenośność, współpraca itp.)
W przypadku bardziej złożonych i większych 32-bitowych mikr, takich jak wiele wariantów ARM, istnieją również Dostępne C ++ i inne kompilatory.

Wskoczyłbym od razu i wziął kilka płyt programistycznych i zacząłem kodować. Możesz wybrać 8-bitową mikroprocesor niskiej jakości, taki jak PIC16F (wiele zestawów startowych w Microchip Direct).
Środek 16-bitowej mikro, taki jak PIC24, a także pewnego rodzaju ARM linux C / C ++ / wbudowany - STM32F4 ARM Cortex M4 Discovery to bardzo tania płyta deweloperska, którą warto wziąć.
Po stronie programowalnego języka logiki i opisu sprzętu (HDL - duże dwa to Verilog i VHDL), może być również warte zdobycia płyty deweloperskiej FPGA lub CPLD od Diglent lub podobnej.

Jeśli nie chcesz czekać na płytę programistyczną, możesz pobrać MPLAB lub MPLABX i skorzystać z doskonałego symulatora, aby spróbować swoich sił w tworzeniu PIC. To samo dotyczy innych narzędzi, na przykład możesz pobrać Xilinx ISE Webpack za darmo i wypróbować HDL i programowalny układ logiczny.

Oli Glaser
źródło
9
PIC mogą być tanie, ale ryzykując rozpoczęcie wojny z płomieniami, twierdziłbym, że użycie PIC jako narzędzia do nauki uczy programowania PIC, a nie programowania mikrokontrolera ogólnego przeznaczenia. W tym celu MSP, AVR (Arduino), Low end ARM Cortex, a nawet czcigodny procesor 8051 zapewniłyby łatwiejsze do przenoszenia umiejętności.
uɐɪ
Dziękuję bardzo ... to było bardzo przydatne. Ale podsumowując twoją odpowiedź: potrzebuję teraz pracy nad C ++ i opanowania C, nauki Verilog lub VHDL lub obu tych rzeczy, a także zdobycia kilku tablic deweloperskich do ćwiczenia lub korzystania z tych symulatorów na początku.
Siraj Muhammad,
1
@ SirajMuhammad - Tak, to wszystko, oprócz nauki zarówno Verilog, jak i VHDL, prawdopodobnie nie jest to konieczne, ponieważ zwykle można ich używać razem w projekcie (na przykład można użyć procesora miękkiego rdzenia zaprojektowanego przez kogoś innego w VHDL, w Twój projekt Verilog i będzie działał dobrze), więc wybierz jeden.
Oli Glaser,
4
@Ian - nie sugeruję, że to musi być PIC, to tylko przykład (stąd „jak PIC”) W każdym razie, jeśli programujesz w C, nie sądzę, żeby było dużo różnica między dowolnymi małymi mikrami. Oczywiście, aby naprawdę poznać jedną mikro na lewą stronę (montaż i wszystko) jest przydatne, ale na początek na wyższym poziomie rzeczy powinny wyglądać tak samo, tylko narzędzia są inne. Myślę, że warto wypróbować kilka, zanim coś zrobisz.
Oli Glaser,
2
„nie powinno być zbyt trudne, jeśli znasz już C ++”? Nie zgodziłbym się z tym, ktoś, kto zna „VB .Net, C♯ i C ++” prawdopodobnie używa tego drugiego w raczej zorientowanym obiektowo stylu RAII i może potrzebować trochę czasu, aby właściwie opanować instrukcję zarządzanie pamięcią.
leftaroundabout
23

Naucz się C i zdobądź tanią płytę programistyczną mikrokontrolera, taką jak MSP430 lub ARM Cortex, i przynajmniej napisz i załaduj kilka programów C.

Mam wykształcenie informatyczne i doświadczenie w tworzeniu oprogramowania, głównie programowanie w C ++ do gier, a teraz gry i aplikacje na iOS, ale moją ostatnią pracą był półprofesjonalny koncert EE, który zaczął się od programowania oprogramowania dla systemu ARM Cortex M3 , a potem skończyłem ze mną, ucząc się, jak wykonać podstawowy projekt obwodu i układ płytki oraz zaprojektować kilka prostych kart. Zasadniczo musiałem więc zmierzyć się z problemem użycia najlepszego języka programowania do pomostu projektowania sprzętu / oprogramowania jako osoby odpowiedzialnej za oba jego końce.

C jest absolutnie językiem, który musisz znać. Jest to łatwe dla ludzi, którzy programują w C ++ i nigdy nie muszą ograniczać się do zestawu funkcji C, aby powiedzieć „to to samo”, ale tak nie jest. Zwłaszcza sposób, w jaki C ++ ewoluował i gromadził funkcje, oraz sposób, w jaki programiści C ++ używają tych funkcji, to naprawdę zupełnie inna rzecz, aby pracować na dość dużej aplikacji C, w przeciwieństwie do aplikacji C ++. Twój SDK oprogramowania układowego będzie zbiorem bibliotek C, wszystko inne, co zmieści się na MCU, będzie biblioteką C, każdy system operacyjny, który ma sens na MCU, zostanie napisany w C itp. Itd.

To powiedziawszy, ponieważ ponieważ wiele dostępnych tam zestawów narzędzi MCU używa GCC jako kompilatora, prawie na pewno będzie dostępny kompilator C ++, jeśli używasz porządnej rodziny MCU. Trzeba jednak bardzo uważać na używane funkcje, zwłaszcza ze standardowej biblioteki, ponieważ bardzo łatwo jest uzyskać plik binarny, który jest zbyt duży, aby zmieścił się na twoim urządzeniu. Wydaje mi się, że istnieje dobry powód do używania C ++ na urządzeniach wbudowanych, C ++ ma całkiem sporo fajnych funkcji, które mają śmieci lub nie mają rozmiaru lub ograniczenia prędkości, po prostu musisz wiedzieć, co robisz i pisać kod w odpowiedni sposób dalej na końcu spektrum w stylu C niż na końcu spektrum STL pod względem sprytnego wykorzystania funkcji.

Nie zwracaj zbytniej uwagi na ludzi, którzy twierdzą, że możesz używać Lua lub Pythona na MCU z odpowiednim osadzonym tłumaczem bla, bla. To prawda, zrobiłem to i jest fajnie, ale w tej chwili jest to więcej w przypadku projektów zabawek i rzeczy, które pojawiają się w Hack a Day. Myślę, że zobaczymy więcej tego rodzaju rzeczy, ponieważ prawo Moore'a jest bezwzględnie stosowane nawet do najmniejszych procesorów, coś takiego zdarzyło się w grach, w których było dużo montażu, a potem utrzymywały się z C i C ++ dłużej niż wszyscy inni, a teraz wszystko jest tak szybkie, a produktywność programistów jest tak ważna, że ​​wiele prac rozwojowych odbywa się za pomocą wbudowanych języków wyższego poziomu lub bezpośrednio w języku wysokiego poziomu. Mimo to minie kilka lat, zanim firmy zatrudnią programistów oprogramowania układowego w środowiskach Python i Lua.

Nie spędzaj też zbyt wiele czasu na montażu. Znajomość pojęć nie jest zła, ale jest mało prawdopodobne, abyś robił dużo, jeśli w ogóle programował w asemblerze. Jest taka konwencjonalna mądrość z grami i osadzonymi, że jest to „dobrze wiedzieć” asembler, często powtarzany przez ludzi, którzy tak naprawdę nie pracują w tych dziedzinach. Ale w rzeczywistości jest bardzo mało prawdopodobne, aby napisać jakiś zestaw, w ogóle, a jeśli to zrobisz, prawdopodobnie będzie to tylko kilka wierszy do optymalizacji lub coś ze sprzętem, dla którego po prostu nie masz interfejsu API (ale będziesz po napisaniu jednego, który zawija kilka wierszy asemblera). Pracowałem nad kilkoma grami, nad tym projektem płyty / oprogramowania układowego, a łączna liczba linii montażowych, które napisałem dla projektów komercyjnych, jest prawdopodobnie niewielka. To'

Suboptimus
źródło
1
Warto powiedzieć, że kilka wierszy asemblera prawdopodobnie będzie zawierać wbudowane instrukcje asemblera ( asm()), ładnie osadzone w kodzie C. To zwycięska kombinacja pod każdym względem. Wysoki poziom, ale kompaktowy z okazjonalnymi spadkami w montażu, gdy na przykład czas musi być odpowiedni. avr-gccToolchain już robi to wiele z makrami C, więc nigdy zawiadomienie.
Alexios,
9
Prawdopodobnie ważniejsze jest, aby móc CZYTAĆ zespół, niż pisać. Pozwala to zrozumieć, co kompilator mówi mikro, a w bardzo rzadkich przypadkach jest w stanie wykryć, kiedy kompilator pomyli się. Musisz także mieć wiedzę na temat asemblera, aby maksymalnie wykorzystać narzędzia do debugowania i korzystać z zapewnianej przez nie funkcji krokowej.
uɐɪ
1
Zdecydowanie się z tym zgadzam. Myślę, że jednym z najlepszych ćwiczeń dla początkującego programisty jest napisanie kompilatora i generatora kodu zabawkowego, który przynajmniej obsługuje funkcje, tablice i struktury, aby dowiedzieć się, jak wygląda rama stosu i jak wyglądają podstawowe elementy języka programowania w asemblerze .
Suboptimus,
3
@Ian - Umiejętność czytania asemblera jest bezużyteczna, jeśli nie wiesz, jak go napisać. Musisz go przeczytać i porównać z tym, co zrobiłbyś, gdybyś go napisał.
Magnes rakietowy
2
@Rocketmagnet - Nie masz zamiaru sprawdzać, czy kompilator wygenerował najbardziej wydajną implementację zestawu. Wymagane jest, abyś mógł odczytać wygenerowany asembler i sprawdzić, czy logika zaimplementowanego kodu jest zgodna z twoją intencją. Jest to to samo, co używanie innych języków ludzkich. Potrafię czytać i rozumieć o wiele więcej francuskiego, niemieckiego i łaciny niż potrafię mówić lub pisać.
uɐɪ
10

Zgadzam się ze wszystkimi, że musisz być bardzo kompetentny w C.

Polecam również naukę co najmniej jednego języka asemblera. Dzięki temu będziesz znacznie lepszym programistą C. Musisz wiedzieć, co dzieje się pod maską, a jest to o wiele bardziej prawdziwe w świecie osadzonym niż w świecie komputerów.

Zrozumienie asemblera generowanego przez C pozwoli Ci pisać bardziej optymalne C pod względem szybkości i zwartości. Szybszy kod oznacza:

  • możesz użyć wolniejszego tańszego MCU i podciąć konkurenta.
  • możesz zmniejszyć częstotliwość taktowania, aby poprawić zgodność z EMC.
  • w aplikacjach o niskim poborze mocy MCU może spędzać więcej czasu w trybie uśpienia, co bezpośrednio prowadzi do wydłużenia żywotności baterii.

Bardziej kompaktowy kod oznacza, że ​​możesz używać tańszego MCU z mniejszą pamięcią. Lub mieć miejsce na więcej funkcji.


Innym językiem, który możesz rozważyć nauce, jest Verilog . Jest to język opisu sprzętu, który naprawdę różni się od języka C nie tylko wyglądem, ale także funkcjonalnością. Verilog otworzy drogę do korzystania z bardzo potężnych układów, takich jak Cypress PSoC3 i 5 . Jest to mikrokontroler z analogowym i cyfrowym programowalnym sprzętem, który pozwala robić niesamowite rzeczy, które są bardzo trudne w przypadku innych MCU. Będziesz także mógł zaprojektować układ FPGA .

Rocketmagnet
źródło
Co rozumiesz przez „jeden język asemblera”? Wiem, że istnieje język o nazwie Zgromadzenie, czy ma oddziały, czy coś takiego? Czy możesz podać jakieś nazwiska? I wielkie dzięki za odpowiedź.
Siraj Muhammad,
4
Każdy typ CPU lub MCU ma swój własny język asemblera z różnymi instrukcjami. Wszystkie są dość podobne, ale z ważnymi różnicami. Naucz się języka asemblera dla dowolnego MCU, którego używasz.
Rocketmagnet
1
Miał dokładnie to powiedzieć. C i montaż są najczęściej używane w inżynierii elektronicznej, ponieważ zwykle masz do czynienia z rzeczami niskiego poziomu. Object Oriented nie jest tak dobrze wykorzystywany, rodzaj niskiego poziomu myślenia, który pochodzi z C / Assembly, będzie miał również zastosowanie do wszystkiego, z czym pracujesz.
Muz.
9

Jako MSEE, który pracuje w branży obronnej od 8 lat, mogę powiedzieć, że zrozumienie, jak dobrze programować w LabVIEW (graficzny, ściśle wpisany język przepływu danych) oznacza, że ​​nigdy nie zabraknie ci pracy.

LabVIEW powstał jako język programowania dla inżynierów sprzętu, widać to po tym, że kod wygląda bardzo podobnie do schematu obwodu. Jednak w ciągu ostatnich 25 lat LabVIEW stał się pełnoprawnym, bogatym w funkcje językiem z obsługą Object Orientation i wielowątkowością. W rzeczywistości argumentowałbym, że nie ma innego języka programowania, opartego na tekście lub innym, który byłby łatwiejszy do zaprogramowania aplikacji wielowątkowej niż LabVIEW; jest to w dużej mierze spowodowane paradygmatem przepływu danych. W miarę wzrostu liczby rdzeni procesora LabVIEW będzie coraz bardziej odpowiedni jako język ogólnego przeznaczenia.

Kolejną korzyścią ze znajomości LabVIEW jest to, że jesteś o rzut kamieniem od programowania FPGA za pomocą modułu LabVIEW FPGA, który pobiera kod LabVIEW i konwertuje go do VHDL za kulisami, zanim przekaże go do kompilatora Xilinx. Możesz także wykorzystać swoje umiejętności LabVIEW, aby przejść do programowania kodu w czasie rzeczywistym za pośrednictwem modułu LabVIEW Real-Time, który używa VxWorks lub Phar Lap.

Uwaga: Jestem certyfikowanym programistą LabVIEW.

wprowadź opis zdjęcia tutaj

SiegeX
źródło
5
Cała produkcja LabVIEW, którą widziałem, wygląda mniej więcej tak: thedailywtf.com/Articles/Labview-Spaghetti.aspx Nie wątpię, że istnieje silny rynek pracy dla tych, którzy chcą utrzymać taki kod.
markrages
@markrages Zostałem poproszony o utrzymanie i / lub rozwinięcie kodu, który był prawie tak zły, być może gorszy, niż dynamiczne wywołania VI i globals. Ten problem to obosieczny miecz LabVIEW. Z jednej strony reklamują go jako język, w którym każdy inżynier może programować, jednak bez solidnych podstaw w architekturze oprogramowania, tak się dzieje. Na szczęście NI w wystarczający sposób rozwiązało ten problem za pomocą LabVIEW 2012, zapewniając dobrze napisane i skomentowane szablony dla architektur, zaczynając od prostej maszyny stanów po złożoną strukturę aktorów opartą na OOP.
SiegeX,
@markrages Problem jest dwojaki. Po pierwsze, kierownictwo zapewnia inżynierom wystarczające szkolenie, aby być niebezpiecznym. Powiedziałbym, że 9/10 programistów LabVIEW, których spotkałem w mojej firmie, którzy przeszli szkolenie, wzięło tylko dwa pierwsze podstawowe kursy, które w zasadzie uczą tylko składni. Po drugie, LabVIEW stał się bogatym w funkcje językiem, który dziś rywalizuje z każdym współczesnym językiem, ponieważ jego zarządzanie graficzne uważa, że ​​musi być łatwe. Managemnt nigdy nie zleciłby inzynierowi oprogramowania zaprojektowania obwodu od średniego do złożonego, ale nie mieliby problemu z rzuceniem EE na skomplikowany problem z oprogramowaniem, gdyby „znali LabVIEW”
SiegeX
@markrages: Właśnie wtedy, gdy przypomniano mi, dlaczego lubię LabVIEW, zobaczyłem twój komentarz i przypomniałem sobie, dlaczego go nienawidzę. Och, godziny frustracji wróciły naraz.
Jonny B Good
6

Jeśli chcesz programować mikrokontrolery na niskim poziomie, powinieneś czuć się komfortowo z programowaniem w języku montażowym (im więcej różnych architektur, tym lepiej), i tak, będziesz używać C dużo więcej niż używasz C ++.

Do ogólnych prac inżynieryjnych do modelowania i prototypowania będą powszechnie używane języki matematyczne, takie jak Matlab (również Scilab i GNU Octave).

Ponadto wiele IDE dla oprogramowania i sprzętu można skryptować, zwykle przy użyciu TCL lub LUA, więc przydatna byłaby znajomość języków skryptowych w ogóle (także Perl, Python, PHP, JavaScript itp.).

Do projektowania sprzętu będziesz potrzebować umiejętności Verilog i / lub VHDL.

Dave Tweed
źródło
6

Czy C ++ wystarczy? Może.

Pamiętaj, że C jest używany w około 90-99% wszystkich dostępnych mcu: s, więc C jest koniecznością w twoim CV.

Ale ponieważ jesteś facetem na wysokim poziomie, możesz zacząć grać z Arduino: s, ponieważ są one zaprogramowane w zmniejszonym C ++, a to dałoby przybliżone wyobrażenie o tym, co C ++ może teraz zrobić w świecie mcu.

Johan
źródło
3

W przypadku mikrokontrolerów (i zajmę się tylko mikrokontrolerami) uważam, że C jest znacznie lepszym językiem wejściowym niż C ++. Montaż byłby kolejnym krokiem, fantastycznym, aby pomóc Ci zrozumieć, w jaki sposób kompilator C Cię spieprzy, tworząc błędy, kradnąc tyknięcia zegara itp. Oraz wyciskając największą wydajność z Twojej platformy. Wszystko to przy założeniu, że mówisz o mikrokontrolerze - a nie o arduino, BASIC Stamp lub jakiejkolwiek innej platformie z zamkniętym mikrokontrolerem.

Trudno powiedzieć, co jest przydatne dla „twojej dziedziny” - i zasugerować, że jako student możesz naprawdę nie wiedzieć, czym jest twoja dziedzina !! - ale myślę, że twój zestaw językowy wydaje się całkiem rozsądny i będziesz go używać w kółko. Przynajmniej dobra znajomość jednego języka strukturalnego sprawia, że ​​następny jest o wiele łatwiejszy, ale myślę, że zawsze znajdziesz umiejętności programowania w systemie Windows w kieszeni.

Scott Seidman
źródło
2

Możesz nauczyć się C i rodzaju kodu asemblera, który jest generowany przez instrukcje C, jeśli pracujesz z procesorami, ale powinieneś także nauczyć się, jak używać uniksowej powłoki wiersza poleceń, takiej jak bash, oraz związanych z nią narzędzi, takich jak sed, ed, awk, vim / vi, find, tar, gzip, ... a także Python, którego można używać na wielu platformach i jest dobrym sposobem na „załatwienie sprawy”.

Paddy3118
źródło
2

Musisz nauczyć się języka C, jeśli chcesz być poważnym programistą osadzonym. Powinieneś także znać asemblera, nawet jeśli prawdopodobnie będziesz go bardzo rzadko używać.

mjh2007
źródło
0

Najpierw zdefiniuję inżyniera elektronika, aby miał na myśli osobę zajmującą się projektowaniem sprzętu, od oprogramowania układowego, poprzez projektowanie płytki i układy scalone. W niektórych przypadkach będziesz robić oprogramowanie układowe, jak wspomniano powyżej, potrzebujesz „C”. Głębsze oprogramowanie staje się po prostu narzędziem, zrozumienie niektórych pojęć z zakresu komplementarności języków od C / C ++ do języków podobnych do Lisp będzie ważniejsze niż specyfika. Będziesz potrzebował oprogramowania do wsparcia swoich wysiłków projektowych, ale to nie ma pierwszeństwa w zrozumieniu podstawowych ograniczeń tego, co można zrobić w fizycznej realizacji. Projekt cyfrowy NIE jest Verilog / VHDL, nawet jeśli projekt jest wyrażony w tych językach. W całkowicie niestandardowym i in-silico stylu zobaczysz języki podobne do Lisp i języki C - funkcjonalne.

symbol zastępczy
źródło