Linguaggi di programmazione per ingegneri elettronici


22

Sono uno studente di ingegneria elettronica e delle comunicazioni, prima di andare al college, mi sono interessato alla programmazione e alle applicazioni informatiche. Mi ero concentrato sulla progettazione di applicazioni Windows e sull'apprendimento delle sue tecniche, ma ora sento che questo è inutile nel mio campo ... Non devo imparare tutto sull'informatica e sullo sviluppo di software! (Ho ragione su questo?)

Conosco VB .Net, C # e C ++. Ho un sacco di tempo durante le mie vacanze, quindi voglio approfondire a livello di programmazione nel "campo dell'elettronica". Quindi cosa consiglieresti di imparare o di concentrarti?

Voglio quei linguaggi usati nella programmazione di microcontrollori e altri circuiti integrati. C ++ è sufficiente o dovrei padroneggiare anche C? Dimmi i tuoi pensieri per favore.


3
"Saldatura" O, più seriamente, la semplice C è abbastanza tradizionale per gli strumenti di supporto, sebbene al momento Python sia un po 'alla moda.
Chris Stratton,

Risposte:


29

Sì, è quasi sicuramente una buona mossa imparare a usare il C nel miglior modo possibile (C ++ ti fornirà un utile punto di partenza, anche se come da note a sinistra , ci saranno ancora molte cose da raccogliere, in particolare le differenze tra la codifica per piccoli sistemi embedded rispetto alla scrittura per qualcosa di simile a Windows) data la sua ubiquità.

La maggior parte dei microcontrollori al di sotto di una determinata dimensione (ad es. PIC, AVR, MSP430, ecc.) Usa C (o assemblatore) in quanto esistono molte versioni di alta qualità (gratuite e $$ - ad es. Molti compilatori commerciali si basano sul compilatore GCC gratuito) Compilatori C disponibili .
Ottieni altre lingue come l'eccellente JAL per PIC (l'autore originale Wouter Van Ooijen che è un membro qui), le varianti PICBASIC, Ada, ma a causa della sua popolarità e del numero di compilatori disponibili, direi che C è la lingua scelta per la maggior parte. Anche se questo certamente non significa che sia la lingua migliore, l'utilizzo della lingua più popolare comporta ovvi vantaggi (documentazione, supporto, portabilità, collaborazione, ecc.)
Per i micro più complessi e più grandi a 32 bit come molte varianti ARM, ci sono anche C ++ e altri compilatori disponibili.

Vorrei saltare subito dentro e prendere alcune schede di sviluppo e ottenere la codifica. Potresti scegliere un micro a 8 bit di fascia bassa come il PIC16F (molti kit di partenza su Microchip Direct)
Un micro a 16 bit di fascia media come il PIC24, e anche un ARM Linux C / C ++ / embedded di qualche tipo - lo STM32F4 ARM Cortex M4 Discovery è una scheda di sviluppo molto economica che potrebbe valere la pena afferrare.
Sul lato della logica programmabile e del linguaggio descrittivo dell'hardware (HDL - i due più grandi sono Verilog e VHDL), può anche valere la pena acquisire una scheda di sviluppo FPGA o CPLD da Diglent o simili.

Se non vuoi aspettare una scheda di sviluppo, puoi scaricare MPLAB o MPLABX e utilizzare l'eccellente simulatore per provare a sviluppare PIC. Lo stesso vale anche per altri strumenti, ad esempio è possibile scaricare Xilinx ISE Webpack gratuitamente e provare HDL e progettazione logica programmabile.


9
I PIC possono essere economici, ma a rischio di iniziare una guerra di fiamma, direi che l'uso di un PIC come strumento di apprendimento ti insegna a programmare PIC piuttosto che insegnarti a programmare un microcontrollore per scopi generali. Per questo MSP, AVR (Arduino), ARM Cortex di fascia bassa o persino i venerabili processori 8051 fornirebbero competenze più facilmente trasferibili.
uɐɪ

Grazie mille ... è stato molto utile. Ma per riassumere la tua risposta: quello di cui ho bisogno in questo momento è continuare a lavorare su C ++ e padroneggiare C, imparare Verilog o VHDL o entrambi, e afferrare alcune schede di sviluppo per esercitarmi o semplicemente usare quei simulatori come inizio.
Siraj Muhammad,

1
@SirajMuhammad - Sì, questo è tutto, a parte l'apprendimento di Verilog e VHDL probabilmente non è necessario, dal momento che di solito possono essere usati insieme in un design (quindi ad esempio puoi usare un processore soft core progettato da qualcun altro in VHDL, in il tuo design Verilog e funzionerà bene) quindi scegline uno.
Oli Glaser,

4
@Ian - Non sto suggerendo che debba essere un PIC, questo è solo un esempio (quindi il "like a PIC") In ogni caso, se stai programmando in C, non penso che ci sia molto di un totale differenza tra i piccoli micro là fuori. Ovviamente conoscere veramente un micro dentro e fuori (assemblaggio e tutto) è utile, ma per iniziare a un livello più alto le cose dovrebbero apparire più o meno le stesse, solo gli strumenti sono diversi. Penso che valga la pena provarne alcuni prima di impegnarsi in qualsiasi cosa.
Oli Glaser,

2
"non dovrebbe essere troppo difficile se conosci già il C ++"? Non sarei d'accordo su questo, qualcuno che conosce "VB .Net, C C e C ++" probabilmente usa quest'ultimo in uno stile RAII piuttosto orientato agli oggetti e potrebbe aver bisogno di un po 'di tempo per afferrare correttamente il manuale gestione della memoria.
leftaroundabout

23

Impara C e ottieni una scheda di sviluppo per microcontrollori economica, come un MSP430 o ARM Cortex, e almeno scrivi e carica alcuni programmi C.

Ho una laurea in informatica e un background di sviluppo software, principalmente programmazione C ++ per giochi e ora giochi e app iOS, ma il mio ultimo lavoro è stato un concerto EE semi-pro che è iniziato con un sacco di programmazione firmware per un sistema ARM Cortex M3 , e poi ho finito per imparare come fare un po 'di progettazione di circuiti e layout di scheda e progettare un paio di semplici schede. Quindi, fondamentalmente, ho dovuto affrontare il problema dell'utilizzo del miglior linguaggio di programmazione per colmare la progettazione hardware / software come qualcuno che era responsabile di entrambe le estremità.

C è assolutamente la lingua che devi conoscere. È facile per le persone che programmano in C ++ e in realtà non devono mai limitarsi al set di funzionalità di C per dire "è la stessa cosa" ma non lo è. Soprattutto il modo in cui C ++ ha evoluto e raccolto le funzionalità, e il modo in cui i programmatori C ++ mainstream utilizzano queste funzionalità, è davvero una cosa molto diversa lavorare su un'applicazione C abbastanza grande rispetto a un'applicazione C ++. L'SDK del firmware sarà un gruppo di librerie C, qualsiasi altra cosa che si adatterà su una MCU sarà una libreria C, qualsiasi sistema operativo che abbia senso su una MCU sarà scritto in C, ecc. Ecc.

Detto questo, poiché molte delle toolchain MCU là fuori finiscono per usare GCC come loro compilatore, quasi sicuramente avrai un compilatore C ++ disponibile se stai usando una famiglia MCU decente. Ma devi stare molto attento alle funzionalità che usi, in particolare le cose dalla libreria standard, poiché è molto facile finire con un binario che è troppo grande per adattarsi al tuo dispositivo. Penso che ci sia un buon caso da fare per usare C ++ su dispositivi embedded, C ++ ha alcune belle caratteristiche che hanno rifiuti o nessuna penalità di dimensioni o velocità, devi solo sapere cosa stai facendo e scrivere il codice che è il modo più avanti sull'estremità dello spettro di tipo C rispetto all'estremità STL dello spettro in termini di uso intelligente delle funzionalità.

Non prestare troppa attenzione alle persone che dicono che puoi usare Lua o Python su un MCU con l'interprete integrato giusto blah, blah. È vero, l'ho fatto ed è divertente, ma al momento è più per progetti di giocattoli e cose che appaiono su Hack a Day. Penso che vedremo più cose del genere poiché la Legge di Moore viene applicata incessantemente anche ai più piccoli processori, questo è qualcosa che è successo con i giochi in cui c'era un sacco di assemblaggio, quindi hanno resistito più a lungo con C e C ++ rispetto a tutti gli altri, e ora tutto è così veloce, e la produttività degli sviluppatori è così importante che molto sviluppo è fatto con linguaggi di livello superiore incorporati o in un linguaggio di alto livello. Anche così, ci vorranno alcuni anni prima che tu veda le aziende assumere programmatori di firmware con sfondi Python e Lua.

Non dedicare troppo tempo all'assemblaggio. Non è male avere familiarità con i concetti, ma è improbabile che ti ritrovi a fare molto, se qualsiasi programmazione di assemblaggio. C'è come questa saggezza convenzionale con i giochi e l'incorporamento che è un assemblaggio "buono a sapersi", spesso ripetuto da persone che in realtà non lavorano in quei campi. Ma in realtà è molto improbabile che tu scriva qualsiasi assembly, mai, e se lo fai probabilmente saranno solo poche righe per l'ottimizzazione o qualcosa con l'hardware per cui non hai un'API (ma lo farai dopo aver scritto uno che avvolge alcune righe di assemblaggio). Ho lavorato su diversi giochi e quel progetto di progettazione di schede / firmware e il numero totale di linee di assemblaggio che ho scritto per progetti commerciali è probabilmente negli anni bassi. E'


1
Vale la pena dire che le tue poche linee di assemblaggio saranno probabilmente nelle istruzioni di assemblaggio in linea ( asm()), ben integrate nel tuo codice C. Questa è una combinazione vincente in ogni modo. Alto livello ma compatto con cadute occasionali nell'assemblaggio quando, ad esempio, i tempi devono essere giusti. La avr-gcctoolchain lo fa già molto con le macro C, quindi non te ne accorgi mai.
Alessio,

9
È probabilmente più importante poter leggere l'assembly piuttosto che doverlo scrivere. Questo ti permette di capire cosa dice il compilatore al micro e, in casi molto rari, di essere in grado di individuare quando il compilatore sbaglia. È inoltre necessario avere una certa comprensione dell'assemblaggio per ottenere il massimo dagli strumenti di debug e utilizzare la funzionalità a singolo passaggio fornita.
uɐɪ

1
Sono assolutamente d'accordo. Penso che uno dei migliori esercizi per un aspirante programmatore sia quello di scrivere un compilatore di linguaggio giocattolo e un generatore di codice che gestisca almeno funzioni, matrici e strutture per imparare che aspetto ha un frame di stack e quali sono gli elementi di base di un linguaggio di programmazione nell'assembly .
Suboptimus,

3
@Ian - Essere in grado di leggere assemblatore è inutile se non sai come scriverlo. Devi leggerlo e confrontarlo con quello che avresti fatto se l'avessi scritto.
Rocketmagnet,

2
@Rocketmagnet: non sei certo di verificare che il compilatore abbia generato l'implementazione dell'assemblaggio più efficiente. Il requisito è che si abbia la capacità di leggere l'assemblatore generato e verificare che la logica del codice implementato corrisponda alle proprie intenzioni. È lo stesso che usare altre lingue umane. Riesco a leggere e comprendere molto più il francese, il tedesco e il latino di quanto non sappia parlare o scrivere.
uɐɪ

10

Concordo con tutti gli altri sulla necessità di essere molto competenti in C.

Consiglierei anche di imparare almeno una lingua di assemblaggio. Fare questo ti renderà un programmatore C molto migliore. Devi sapere cosa sta succedendo sotto il cofano, e questo è molto più vero nel mondo incorporato che nel mondo dei PC.

Comprendere l'assemblatore che la tua C sta generando ti permetterà di scrivere una C più ottimale in termini di velocità e compattezza. Codice più veloce significa:

  • puoi usare un MCU più lento ed economico e tagliare un concorrente.
  • è possibile ridurre la frequenza di clock per una migliore conformità EMC.
  • in un'applicazione a bassa potenza l'MCU può trascorrere più tempo nel sonno, portando direttamente ad una maggiore durata della batteria.

Codice più compatto significa che è possibile utilizzare un MCU più economico con meno memoria. O hai spazio per più funzionalità.


L'altra lingua che potresti prendere in considerazione per l'apprendimento è Verilog . Questo è un linguaggio di descrizione hardware, ed è molto diverso da C, non solo per l'aspetto, ma anche per la sua funzionalità. Verilog aprirà la strada per sfruttare chip molto potenti come Cypress PSoC3 e 5 . È un microcontrollore con hardware riprogrammabile analogico e digitale, che ti consente di fare cose incredibili che sono molto difficili da fare con qualsiasi altro MCU. Sarai anche in grado di fare il design FPGA .


Cosa intendi con "un linguaggio assembly"? So che esiste una lingua chiamata Assembly, ha rami o qualcosa del genere? Puoi nominarne qualcuno per favore? E grazie mille per la tua risposta.
Siraj Muhammad,

4
Ogni tipo di CPU o MCU ha il proprio linguaggio assembly con istruzioni diverse. Sono tutti abbastanza simili, ma con differenze importanti. Impara il linguaggio assembly per qualsiasi MCU che stai utilizzando.
Rocketmagnet,

1
Stavo per dire esattamente questo. C e Assembly sono i più utilizzati nell'ingegneria elettronica, perché di solito hai a che fare con cose di basso livello. Orientato agli oggetti non è poi così ben utilizzato, il tipo di pensiero di basso livello che proviene da C / Assembly si applicherà anche a qualsiasi altra cosa con cui lavori.
Muz,

9

Come MSEE che lavora nel settore della difesa da 8 anni, posso dirti che capire come programmare bene in LabVIEW (un linguaggio di flusso di dati grafico, tipicamente rigoroso) significa che non sarai mai a corto di lavoro.

LabVIEW è iniziato come un linguaggio di programmazione per ingegneri hardware, questo è evidente dal fatto che il codice assomiglia molto a uno schema elettrico. Tuttavia, negli ultimi 25 anni LabVIEW è diventato un linguaggio completo e ricco di funzionalità con supporto per l'orientamento agli oggetti e il multi-threading. In effetti, direi che non esiste un altro linguaggio di programmazione, basato su testo o altro, che sia più facile programmare un'applicazione multi-thread in LabVIEW; questo è in gran parte dovuto al suo paradigma del flusso di dati. Man mano che il numero di core della CPU continua ad aumentare, LabVIEW diventerà sempre più rilevante come linguaggio generico.

Un altro vantaggio di sapere LabVIEW è che sei solo a un passo dalla programmazione di FPGA usando il modulo LabGA FPGA che prende il tuo codice LabVIEW e lo converte in VHDL dietro le quinte prima che lo passi al compilatore Xilinx. Puoi anche usare le tue abilità di LabVIEW per passare alla programmazione del codice in tempo reale tramite il modulo LabVIEW in tempo reale che utilizza VxWorks o Phar Lap.

Nota: sono uno sviluppatore LabVIEW certificato.

inserisci qui la descrizione dell'immagine


5
Tutta la produzione LabVIEW che ho visto assomiglia di più a questo: thedailywtf.com/Articles/Labview-Spaghetti.aspx Non dubito che ci sia un forte mercato del lavoro per coloro che sono disposti a mantenere tale codice.
Markrages

@markrages Mi è stato chiesto di mantenere e / o espandere il codice che era quasi altrettanto cattivo forse peggio di quanto ci fossero anche chiamate VI globali e globali. Questo problema è la spada a doppio taglio che è LabVIEW. Da un lato lo commercializzano come un linguaggio in cui qualsiasi ingegnere può programmare, tuttavia senza una solida base nell'architettura software, si ottiene il codice proprio in questo modo. Per fortuna, NI ha sufficientemente affrontato questo problema con LabVIEW 2012 fornendo modelli ben scritti e commentati per architetture che iniziano con la semplice macchina a stati al complesso framework di attori basato su OOP.
SiegeX,

@markrages Il problema è duplice. Primo, la direzione offre agli ingegneri la formazione sufficiente per essere pericolosi. Direi che i programmatori LabVIEW 9/10 che ho incontrato nella mia azienda e che hanno seguito la formazione hanno seguito solo i primi due corsi di base che essenzialmente ti insegnano solo la sintassi. In secondo luogo, LabVIEW è diventato un linguaggio ricco di funzionalità che oggi rivaleggia con qualsiasi linguaggio moderno perché la sua gestione grafica pensa che debba essere facile. Managemnt non incaricherebbe mai un ingegnere del software di progettare un circuito medio-complesso, ma non ha problemi a lanciare un EE a un problema software complesso se "conoscono LabVIEW"
SiegeX,

@markrages: proprio quando mi è stato ricordato perché mi piaceva LabVIEW, ho visto il tuo commento e ho ricordato perché l'ho odiato. Oh, le ore di frustrazione sono tornate tutte in una volta.
Jonny B,

6

Se vuoi fare una programmazione a basso livello di microcontrollori, allora dovresti essere a tuo agio con la programmazione assembly-langauge (più architetture diverse meglio è) e sì, userai C molto più di quanto usi C ++.

Per lavori di ingegneria generale, linguaggi orientati alla matematica come Matlab (anche Scilab e GNU Octave) saranno comunemente usati per la modellazione e la prototipazione.

Inoltre, molti IDE per software e hardware sono eseguibili tramite script, in genere utilizzando TCL o LUA, quindi sarebbe utile avere una certa familiarità con i linguaggi di scripting in generale (anche Perl, Python, PHP, Javascript, ecc.).

Per la progettazione hardware, avrai bisogno delle competenze di Verilog e / o VHDL.


6

C ++ è abbastanza? Può essere.

Ricorda che C è usato in qualcosa come il 90-99% di tutti i mcu: s là fuori, quindi C è un must per il tuo curriculum.

Ma dal momento che sei un ragazzo di alto livello potresti iniziare a giocare con Arduino: s poiché sono programmati con un C ++ ridimensionato, e questo darebbe un'idea approssimativa di ciò che il C ++ può fare nel mondo MCU in questo momento.


3

Per i microcontrollori (e mi occuperò solo dei microcontrollori), penso che C sia un linguaggio di immissione molto migliore rispetto a C ++. L'assemblaggio sarebbe il passo successivo, fantastico per aiutarti a capire come il tuo compilatore C ti stia rovinando, creando bug, rubando i battiti dell'orologio, ecc. E sfruttando al massimo le prestazioni della tua piattaforma. Tutto questo presuppone che tu stia parlando di un microcontrollore, non di un arduino, BASIC Stamp o di qualsiasi altra piattaforma che coinvolge un microcontrollore avvolto.

Difficile dire cosa sia utile per "il tuo campo" - e suggerire che come studente potresti non sapere davvero quale sia il tuo campo !! - ma penso che il tuo set di lingue sembri abbastanza ragionevole e ti ritroverai ad usarlo ancora e ancora. Per lo meno, avere una buona conoscenza di un linguaggio strutturato rende il prossimo molto più semplice, ma penso che troverai sempre le tue capacità di programmazione di Windows belle da avere in tasca.


2

Potresti imparare C e il tipo di codice assembler che viene generato dalle istruzioni C se lavori con i processori, ma dovresti anche insegnarti come usare una shell della riga di comando Unix come bash e gli strumenti che ne derivano come sed, ed, awk, vim / vi, find, tar, gzip, ... così come Python che puoi usare su molte piattaforme ed è un buon modo per "fare le cose".


2

Devi imparare C se vuoi essere uno sviluppatore embedded serio. Dovresti anche conoscere l'assemblatore anche se probabilmente lo userai molto raramente.


0

Definirò prima l'ingegnere elettronico per indicare qualcuno coinvolto nella progettazione hardware dal firmware alla progettazione della scheda e alla progettazione del chip. In alcuni casi eseguirai il firmware, come indicato sopra avrai bisogno di "C". Il software più approfondito diventa semplicemente uno strumento, la comprensione di alcuni concetti di scienze nei linguaggi complementari da C / C ++ a Lisp come le lingue sarà più importante delle specifiche. Avrai bisogno di software per supportare i tuoi sforzi di progettazione, ma ciò non ha la precedenza sulla comprensione dei limiti fondamentali di ciò che può essere fatto in un'implementazione fisica. Il design digitale NON è Verilog / VHDL anche se il design è espresso in quelle lingue. Nel design completamente personalizzato e in silico vedrai Lisp come linguaggi e linguaggi C - funzionali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.