Fråga:
Programmeringsspråk för elektronikingenjörer
Siraj Muhammad
2012-09-06 03:12:17 UTC
view on stackexchange narkive permalink

Jag är student inom elektronik- och kommunikationsteknik innan jag kom på college har jag varit intresserad av programmering och datorprogram. Jag hade fokuserat på att designa Windows-applikationer och lära sig dess tekniker, men nu känner jag att detta är värdelöst inom mitt område ... Jag behöver inte lära mig allt om datavetenskap och utveckling av programvara! (Har jag rätt i detta?)

Jag känner till VB .Net, C # och C ++. Jag har gott om tid på semestern så jag vill gå djupare in i "elektronikfältet". Så vad skulle du rekommendera att lära dig eller att fokusera på?

Jag vill ha de språk som används vid programmering av mikrokontroller och andra integrerade kretsar. Räcker C ++ eller borde jag också behärska C? Berätta för mig dina tankar.

"Löd" Eller mer allvarligt, vanlig C är ganska traditionell för supportverktyg, även om python är lite trendigt för närvarande.
Tio svar:
Oli Glaser
2012-09-06 04:00:27 UTC
view on stackexchange narkive permalink

Ja, det är nästan säkert ett bra drag att lära sig att använda C så bra som möjligt (C ++ ger dig en bra utgångspunkt, men som leftaroundabout noterar kommer det fortfarande att finnas mycket att hämta , speciellt skillnaderna mellan kodning för små inbäddade system jämfört med att skriva för något som Windows) med tanke på att det är överallt.

De flesta mikrokontroller under en viss storlek (t.ex. PIC, AVR, MSP430, etc) använder C (eller assembler ) eftersom det finns många högkvalitativa (gratis- och $$ -versioner - t.ex. många kommersiella kompilatorer är baserade på den gratis GCC-kompilatorn) C-kompilatorer tillgängliga.
Du får andra språk som den utmärkta JAL för PIC (originalförfattare Wouter Van Ooijen som är medlem här), PICBASIC, Ada-varianter, men på grund av dess popularitet och antalet tillgängliga kompilatorer skulle jag säga att C är det språk som valts för de flesta. Detta betyder visserligen inte att det är det bästa språket, men att använda det mest populära språket kommer med uppenbara fördelar (dokumentation, support, bärbarhet, samarbete osv.)
För de mer komplexa och större 32-bitars mikro som många ARM-varianter, det finns också C ++ och andra kompilatorer tillgängliga.

Jag hoppade direkt in och tog några utvecklingskort och fick kodning. Du kan välja en låg-slut 8-bitars mikro som PIC16F (många startpaket på Microchip Direct)
En mitt i intervallet 16-bitars mikro som PIC24, och också en C / C ++ / inbäddad Linux ARM av något slag - STM32F4 ARM Cortex M4 Discovery är ett mycket billigt dev-kort som det kan vara värt att ta tag i.
På det programmerbara logik- och hårdvarubeskrivningsspråket (HDL - de två stora är Verilog och VHDL) -sidan kan det också vara värt att få tag på av ett FPGA- eller CPLD-dev-kort från Diglent eller liknande.

Om du inte vill vänta på ett dev-kort kan du ladda ner MPLAB eller MPLABX och använda den utmärkta simulatorn för att prova dig på PIC-utveckling. Samma sak gäller för andra verktyg också, till exempel kan du ladda ner Xilinx ISE Webpack gratis och prova HDL och programmerbar logisk design.

PIC: er kan vara billiga, men med risk för att starta ett flammekrig skulle jag hävda att användning av en PIC som ett inlärningsverktyg lär dig att programmera PIC: er snarare än att lära dig att programmera en mikroprocessor för allmänt ändamål. För detta skulle MSP, AVR (Arduino), Low end ARM Cortex eller till och med de vördnadsfulla 8051-processorerna ge lättare överförbara färdigheter.
Tack så mycket ... det här var mycket användbart. Men för att sammanfatta ditt svar: Vad jag behöver just nu är att fortsätta arbeta med C ++ och behärska C, lära mig Verilog eller VHDL eller båda, och ta några dev-brädor för att träna eller bara använda dessa simulatorer som en början.
@SirajMuhammad - Ja, det handlar om det, förutom att lära sig både Verilog och VHDL är förmodligen inte nödvändigt, eftersom de vanligtvis kan användas tillsammans i en design (så till exempel kan du använda en mjuk kärnprocessor designad av någon annan i VHDL, i din Verilog-design, och den kommer att fungera bra) så välj bara en.
@Ian - Jag föreslår inte att det * måste * vara en PIC, det är bara ett exempel (därav "som en PIC") Om du programmerar i C, tror jag inte att det finns mycket av en den totala skillnaden mellan någon av de små mikroerna där ute. Naturligtvis är det användbart att lära känna en mikro inifrån och ut (montering och allt), men för att börja på en högre nivå borde sakerna se ungefär likadana ut, bara verktygen är olika. Jag tycker att det är värt att prova några innan du förbinder dig till någonting.
En Cortex M3 eller M4 är en bra start. Det finns billiga kort, TI släppte precis ett $ 4,99 M4 Launchpad-kort, STMicro har ett $ 15 Discovery-kort. De har ett stort utbud av kringutrustning, ett USB-gränssnitt för att ansluta direkt till en värdmaskin för programmering och felsökning och massor av CPU (relativt sett naturligtvis). Och om du slutar med en galen projektidé, finns det drivrutinsbibliotek för PWM LED-kontroller, LCD-skärmar, pekskärmar etc. De har också IDE: er buntade så att du kan komma igång snabbt om du vill gå den vägen, och det finns arm-eabi-gcc om du vill gå Unix-rutten.
"borde inte vara för svårt om du redan känner till C ++"? Jag håller inte med om det, någon som känner till "VB .Net, C♯ och C ++" använder förmodligen den senare i en ganska hög, objektorienterad RAII-stil och kan mycket väl behöva lite tid för att få grepp om manualen minneshantering.
@leftaroundabout - rättvis punkt, kanske jag uttryckte det för kort - jag menade bara att det kommer att ge OP en bra utgångspunkt med struktur, syntax och en bekant känsla, i motsats till att starta "från grunden". Jag håller med om att det fortfarande kommer att finnas mycket att lära sig, särskilt när det gäller faktisk användning på inbyggda minnesbegränsade system.
@leftaroundabout Det är inget fel med att skriva objektorienterade program, och RAII är (när det används på rätt sätt) nollkostnad och hjälper till att undvika många dumma misstag (som är oundvikliga under inlärningen).
@Alice exakt min poäng.Bara för att någon kan skriva C ++ bra, med RAII och allt, betyder det inte att de också kommer att kunna programmera i C.
Suboptimus
2012-09-06 06:20:35 UTC
view on stackexchange narkive permalink

Lär dig C, och få ett billigt mikrokontrollerutvecklingskort, som en MSP430 eller ARM Cortex, och skriv åtminstone några C-program.

Jag har en datavetenskaplig examen och en programutvecklingsbakgrund , mestadels C ++ programmering för spel och nu iOS-spel och appar, men mitt sista jobb var en semi-pro EE-spelning som började med att göra en massa firmwareprogrammering för ett ARM Cortex M3-system, och slutade sedan med att jag lärde mig att göra några grundläggande kretskonstruktioner och kortlayout och design av ett par enkla kort. Så jag var i grund och botten tvungen att konfrontera problemet med att använda det bästa programmeringsspråket för att överbrygga hårdvaru- / mjukvarudesignen som någon som var ansvarig för båda ändarna av det.

C är absolut det språk du behöver veta. Det är enkelt för människor som programmerar i C ++ och aldrig behöver begränsa sig till C: s funktionsuppsättning för att säga "det är samma sak" men det är det inte. Speciellt hur C ++ har utvecklats och samlat in funktioner, och hur vanliga C ++ - programmerare använder dessa funktioner, är det verkligen en helt annan sak att arbeta med en ganska stor C-applikation i motsats till en C ++ - applikation. Din firmware SDK kommer att vara en massa C-bibliotek, allt annat som passar på en MCU kommer att vara ett C-bibliotek, alla operativsystem som är meningsfulla på en MCU kommer att skrivas i C, etc. etc.

Med detta sagt, eftersom många av MCU-verktygskedjorna där ute slutar använda GCC som sin kompilator, kommer du nästan säkert att ha en C ++ - kompilator tillgänglig om du använder en anständig MCU-familj. Men du måste vara mycket försiktig med de funktioner du använder, särskilt saker från standardbiblioteket, eftersom det är väldigt enkelt att sluta med en binär som är alldeles för stor för att passa på din enhet. Jag tror att det finns ett bra fall att använda C ++ på inbäddade enheter, C ++ har en hel del fina funktioner som har strö eller ingen storlek eller hastighetsstraff, du måste bara veta vad du gör och skriva kod på det sättet längre fram i C-stiländen av spektrumet än STL-änden av spektrumet när det gäller smart användning av funktioner.

Var inte uppmärksam på människor som säger att du kan använda Lua eller Python på en MCU med rätt inbäddad tolk bla, bla. Det är sant, jag har gjort det och det är kul, men just nu är det mer för leksaksprojekt och saker som dyker upp på Hack a Day. Jag tror att vi kommer att se mer av den typen av saker, eftersom Moores lag tillämpas obevekligt på även de minsta processorerna, det här är något som hände med spel där det brukade vara mycket montering, sedan höll de ut med C och C ++ längre än alla andra, och nu är allt så snabbt, och utvecklarproduktiviteten är så viktig att mycket utveckling sker med inbäddade språk på högre nivå eller i ett språk på hög nivå direkt. Ändå tar det några år innan du ser företag anställa firmwareprogrammerare med Python- och Lua-bakgrund.

Spenderar inte för mycket tid på montering heller. Det är inte dåligt att vara bekant med begreppen, men det är osannolikt att du kommer att göra mycket, om någon monteringsprogrammering. Det finns som denna konventionella visdom med spel och inbäddade att det är "bra att veta" montering, ofta upprepas av människor som inte arbetar inom dessa områden. Men i verkligheten är det mycket osannolikt att du kommer att skriva någon montering alls, någonsin, och om du gör det kommer det förmodligen bara att vara några rader för optimering eller något med hårdvaran du bara inte har ett API för (men du efter att du har skrivit en som innehåller några rader med montering). Jag har arbetat med flera spel och det här brädet / firmware-designprojektet och det totala antalet monteringslinjer jag har skrivit för kommersiella projekt är förmodligen i de låga tonåren. Det är inte produktivt, det är inte bärbart och det är inte läsbart så det används alltid som det sista möjliga alternativet.

Det är värt att säga att dina få rader av montering sannolikt kommer att vara inbyggda monteringsuttalanden (`asm ()`), snyggt inbäddade i din C-kod. Detta är en vinnande kombination på alla sätt. Hög nivå men kompakt med enstaka nedgångar i montering när till exempel timingen måste vara precis rätt. Verktygskedjan `avr-gcc` gör redan detta mycket med C-makron, så du märker aldrig det.
Det är nog viktigare att kunna LÄSA montering snarare än att behöva skriva det. Detta låter dig förstå vad kompilatorn säger till mikro att göra, och i mycket sällsynta fall kunna upptäcka när kompilatorn får fel. Du måste också ha en viss monteringsförståelse för att få ut det mesta av dina felsökningsverktyg och använda de enstegsfunktioner som de tillhandahåller.
Helt klart med det. Jag tycker att en av de bästa övningarna för en blivande programmerare är att skriva en leksakspråkkompilator och kodgenerator som åtminstone hanterar funktioner, matriser och strukturer för att lära sig hur en stackram ser ut och hur de grundläggande elementen i ett programmeringsspråk ser ut vid montering .
@Ian - Att kunna läsa assembler är värdelöst om du inte vet hur man skriver det. Du måste läsa den och jämföra den med vad du skulle ha gjort om du hade skrivit den.
@Rocketmagnet - Du är inte ute efter att kontrollera att kompilatorn har genererat den mest effektiva monteringsimplementeringen. Kravet är att du har möjlighet att läsa den genererade samlaren och kontrollera att logiken för den implementerade koden matchar din avsikt. Detta är detsamma som att använda andra mänskliga språk. Jag kan läsa och förstå mycket mer franska, tyska och latin än jag kan prata eller skriva.
@Ian - Ja det är jag. Kontroll av korrekthet och optimalitet är båda viktiga, som jag förklarade i mitt inlägg. Om din C-kompilator genererar suboptimal kod vet du bara inte det och du kommer att köpa en dyrare MCU än vad du behöver. Jag har sett det flera gånger tidigare. Även mycket skickliga C- och C ++ -kodare, som inte har någon inbäddad erfarenhet, kan skriva * fruktansvärt * slösaktig kod eftersom de inte har någon aning om hur de ska undersökas. Detta har t.ex. orsakade problem med realtidsstyrningsslingor i robotar som har varit tvungna att vänta i åldrar för att data ska komma tillbaka från dåligt kodade MCU: er.
Rocketmagnet
2012-09-06 14:11:00 UTC
view on stackexchange narkive permalink

Jag håller med alla andra om att du behöver vara väldigt kompetent i C.

Jag rekommenderar också att du lär dig minst ett monteringsspråk också. Att göra detta kommer att göra dig till en mycket bättre C-programmerare. Du måste veta vad som händer under huven, och detta är mycket mer sant i den inbäddade världen än vad det är i PC-världen.

Att förstå monteraren som din C genererar låter dig skriva mer optimalt C när det gäller hastighet och kompakthet. Snabbare kod betyder:

  • du kan använda en långsammare billigare MCU och underskrida en konkurrent.
  • Du kan sänka klockfrekvensen för förbättrad EMC-efterlevnad.
  • i en applikation med låg effekt kan MCU tillbringa mer tid i sömn, vilket direkt leder till ökad batteritid.

Mer kompakt kod innebär att du kan använda en billigare MCU med mindre minne. Eller ha plats för fler funktioner.


Det andra språket du kan tänka dig att lära dig är Verilog. Det här är ett hårdvarubeskrivningsspråk, och det skiljer sig verkligen helt från C, inte bara i hur det ser ut utan också i dess funktionalitet. Verilog kommer att öppna vägen för att dra nytta av mycket kraftfulla marker som Cypress PSoC3 och 5. Det är en mikrokontroller med analog och digital omprogrammerbar hårdvara, vilket gör att du kan göra några fantastiska saker som är mycket svåra att göra med någon annan MCU. Du kan också göra FPGA -design.

Vad menar du med "ett församlingsspråk"? Jag vet att det finns ett språk som heter Assembly, har det filialer eller något liknande? Kan du nämna några tack? Och tack så mycket för ditt svar.
Varje typ av CPU eller MCU har sitt eget monteringsspråk med olika instruktioner. De är alla ganska lika, men med viktiga skillnader. Lär dig monteringsspråket för vilken MCU du än använder.
Tänkte säga exakt detta. C och montering är de mest använda inom elektronikteknik, eftersom du vanligtvis arbetar med saker på låg nivå. Object Oriented är inte riktigt så väl utnyttjat, den typ av lågtänkande som kommer från C / Assembly kommer också att gälla vad du än jobbar med.
SiegeX
2012-09-07 09:32:19 UTC
view on stackexchange narkive permalink

Som en MSEE som har arbetat i försvarsindustrin i åtta år kan jag berätta att förståelse för hur man programmerar bra i LabVIEW (ett grafiskt, strikt typat, dataflödesspråk) innebär att du Det kommer aldrig att sakna arbete.

LabVIEW började som ett programmeringsspråk för hårdvarutekniker, du kan se detta i det faktum att koden ser väldigt ut som ett kretsschema. Under de senaste 25 åren har LabVIEW emellertid utvecklats till ett fullvärdigt, funktionsrikt språk med stöd för Object Orientation och multi-threading. I själva verket skulle jag hävda att det inte finns något annat programmeringsspråk, textbaserat eller på annat sätt, som är lättare att programmera en applikation med flera trådar än LabVIEW; detta beror till stor del på dess dataflödesparadigm. När antalet CPU-kärnor fortsätter att öka kommer LabVIEW att bli mer och mer relevant som ett allmänt språk.

En annan fördel med att känna till LabVIEW är att du bara är ett stenkast bort från att programmera FPGA med hjälp av LabVIEW FPGA-modul som tar din LabVIEW-kod och konverterar den till VHDL bakom kulisserna innan den skickas till Xilinx-kompilatorn. Du kan också använda dina LabVIEW-färdigheter för att övergå till programmering av realtidskod via LabVIEW Real-Time Module som använder antingen VxWorks eller Phar Lap.

Obs! Jag är en Certifierad LabVIEW-utvecklare.

enter image description here

All produktion LabVIEW jag har sett ser mer ut så här: http://thedailywtf.com/Articles/Labview-Spaghetti.aspx Jag tvivlar inte på att det finns en stark arbetsmarknad för dem som är villiga att behålla en sådan kod.
@markrages Jag har blivit ombedd att behålla och / eller utöka kod som var nästan lika dålig, kanske värre, eftersom det också fanns dynamiska VI-samtal och globaler. Detta problem är det tvåkantiga svärdet som är LabVIEW. Å ena sidan marknadsför de det som ett språk som ingenjör kan programmera in, men utan någon solid grund i programvaruarkitektur får du slutligen kod precis så här. Tack och lov har NI tillräckligt tagit upp problemet med LabVIEW 2012 genom att tillhandahålla välskrivna och kommenterade mallar för arkitekturer som börjar med den enkla tillståndsmaskinen till det komplexa OOP-baserade aktörsramverket.
@markrages Problemet är dubbelt. En, ledningen ger ingenjörer tillräckligt med utbildning för att vara farlig. Jag skulle säga 9/10 LabVIEW-programmerare som jag har träffat i mitt företag och som har haft utbildning bara tog de två första grundkurserna som i huvudsak lär dig bara syntaxen. För det andra har LabVIEW blivit ett funktionsrikt språk som konkurrerar med alla moderna språk idag, eftersom den grafiska hanteringen tycker att det måste vara enkelt. Managemnt skulle aldrig ge en programvarutekniker i uppdrag att utforma en medium till komplex krets, men de har inga problem att kasta en EE till ett komplext programvaruproblem om de "känner LabVIEW"
@markrages: När jag blev påmind om varför jag gillade LabVIEW såg jag din kommentar och kom ihåg varför jag hatade den. Åh, frustrationstimmarna kom tillbaka på en gång.
Dave Tweed
2012-09-06 03:41:34 UTC
view on stackexchange narkive permalink

Om du vill göra programmering av mikrokontroller på låg nivå bör du känna dig bekväm med programmeringssamlingsprogram (ju fler olika arkitekturer desto bättre), och ja, du kommer att använda C mycket mer än du använder C ++.

För allmänt ingenjörsarbete kommer matteorienterade språk som Matlab (även Scilab och GNU Octave) ofta att användas för modellering och prototyper.

Dessutom är många IDE för programvara och hårdvara skriptbart, vanligtvis med TCL eller LUA, så en viss bekantskap med skriptspråk i allmänhet (även Perl, Python, PHP, Javascript, etc.) skulle vara användbart.

För hårdvarudesign kommer du att behöva Verilog- och / eller VHDL-färdigheter.

Johan
2012-09-06 13:34:09 UTC
view on stackexchange narkive permalink

Är C ++ tillräckligt? Kanske.

Kom ihåg att C används i ungefär 90-99% av alla MCU: er där ute, så C är ett måste i ditt CV.

Men eftersom du är en kille på hög nivå som du kan börja spela med Arduino: er eftersom de är programmerade med en nedskalad C ++, och det skulle ge en grov uppfattning om vad C ++ kan göra i MCU-världen just nu.

Scott Seidman
2012-09-06 03:40:42 UTC
view on stackexchange narkive permalink

För mikrokontroller (och jag kommer bara att ta upp mikrokontroller) tycker jag att C är ett mycket bättre inmatningsspråk än C ++. Montering skulle vara nästa steg, fantastiskt för att hjälpa dig att förstå hur din C-kompilator skruvar upp dig, skapar buggar, stjäl klockor osv. Och pressar ut mest prestanda ur din plattform. Allt förutsätter att du pratar om en mikrokontroller - inte en arduino, BASIC Stamp eller någon annan plattform som involverar en inpackad mikrokontroller.

Svårt att säga vad som är användbart för "ditt fält" - och föreslå att du som student kanske inte riktigt vet vad ditt område är ännu !! - men jag tycker att din språkuppsättning verkar ganska rimlig och att du kommer att använda den om och om igen. Att ha ett bra grepp om ett strukturerat språk gör åtminstone nästa så mycket lättare, men jag tror att du alltid kommer att hitta dina Windows-programmeringskunskaper trevliga att ha i fickan.

Paddy3118
2012-09-07 01:22:46 UTC
view on stackexchange narkive permalink

Du kan lära dig C och vilken typ av samlarkod som genereras av C-satser om du arbetar med processorer, men du bör också lära dig själv hur man använder ett Unix-kommandoradsskal som bash och de verktyg som följer med det. som sed, ed, awk, vim / vi, find, tjära, gzip, ... samt Python som du kan använda på många plattformar och är ett bra sätt att "få saker gjort".

mjh2007
2012-09-07 01:36:01 UTC
view on stackexchange narkive permalink

Du måste lära dig C om du vill vara en seriös inbäddad utvecklare. Du borde också känna monteraren även om du förmodligen mycket sällan kommer att använda den.

placeholder
2012-09-07 02:59:55 UTC
view on stackexchange narkive permalink

Jag definierar först elektronikingenjören som en person som är involverad i hårdvarudesign från firmware till kortdesign och till chipdesign. I vissa fall kommer du att göra firmware, som anges ovan behöver du "C". Djupare mjukvara blir helt enkelt ett verktyg, att förstå vissa comp sci-koncept på kompletterande språk från C / C ++ till Lisp som språk kommer att vara viktigare än detaljer. Du kommer att behöva programvara för att stödja ditt designarbete men det har inte företräde för att förstå de grundläggande gränserna för vad som kan göras i en fysisk implementering. Digital design är INTE Verilog / VHDL även om designen uttrycks på dessa språk. I full anpassad och in-silico design ser du Lisp-liknande språk och C-funktionella språk. Saker trender mer mot Python för skript, men det finns många Perl / Skill / C / System C / Verilog-A / VHDL testbänkar och kontrollprogram / skript.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...