Linguagens de programação para engenheiros eletrônicos

22

Sou estudante de Engenharia Eletrônica e de Comunicações. Antes de entrar na faculdade, me interessei por programação e aplicativos de computador. Eu me concentrei no design de aplicativos Windows e no aprendizado de suas técnicas, mas agora sinto que isso é inútil no meu campo ... Não preciso aprender tudo sobre ciência da computação e desenvolvimento de software! (Estou certo sobre isso?)

Eu sei VB .Net, C # e C ++. Eu tenho bastante tempo nas minhas férias, então eu quero me aprofundar programaticamente no "campo da eletrônica". Então, o que você recomendaria para aprender ou focar?

Eu quero aquelas linguagens usadas na programação de microcontroladores e outros circuitos integrados. C ++ é suficiente ou devo dominar C também? Diga-me seus pensamentos, por favor.

Siraj Muhammad
fonte
3
"Solda" Ou, mais sério, o C simples é bastante tradicional para ferramentas de suporte, embora o python esteja um pouco moderno no momento.
Chris Stratton

Respostas:

29

Sim, é quase certamente uma boa maneira de aprender a usar o C da melhor maneira possível (o C ++ fornecerá um ponto de partida útil, embora, como observamos anteriormente , ainda haja muito o que aprender , especialmente as diferenças entre a codificação para pequenos sistemas embarcados comparado a escrever para algo como o Windows), dada a sua onipresença.

A maioria dos microcontroladores abaixo de um determinado tamanho (por exemplo, PIC, AVR, MSP430, etc) usa C (ou montador), pois existem muitas versões de alta qualidade (gratuitas e $$ - por exemplo, muitos compiladores comerciais são baseados no compilador GCC gratuito) .
Você obtém outros idiomas, como o excelente JAL para PIC (autor original Wouter Van Ooijen, que é membro aqui), PICBASIC, variantes Ada, mas devido à sua popularidade e número de compiladores disponíveis, eu diria que C é o idioma de escolha para a maioria. Embora isso certamente não signifique que é o melhor idioma, o uso do idioma mais popular traz vantagens óbvias (documentação, suporte, portabilidade, colaboração, etc.)
Para os micros de 32 bits mais complexos e maiores, como muitas variantes do ARM, também existem C ++ e outros compiladores disponíveis.

Eu pularia direto e pegaria algumas placas de desenvolvimento e obteria codificação. Você pode escolher um micro low end de 8 bits como o PIC16F (muitos kits iniciantes no Microchip Direct).
Um micro de 16 bits intermediário como o PIC24 e também um braço C / C ++ / linux incorporado de algum tipo - o STM32F4 O ARM Cortex M4 Discovery é uma placa de desenvolvimento muito barata que pode valer a pena ser agarrada.
No lado programável da linguagem de descrição de lógica e hardware (HDL - os dois grandes são Verilog e VHDL), também pode valer a pena procurar uma placa de desenvolvimento FPGA ou CPLD da Diglent ou similar.

Se você não quiser esperar por uma placa de desenvolvimento, faça o download do MPLAB ou MPLABX e use o excelente simulador para testar o desenvolvimento do PIC. O mesmo vale para outras ferramentas, por exemplo, você pode baixar o Xilinx ISE Webpack gratuitamente e experimentar HDLs e design lógico programável.

Oli Glaser
fonte
9
Os PICs podem ser baratos, mas com o risco de iniciar uma guerra de chamas, eu diria que o uso de um PIC como ferramenta de aprendizado ensina a programar PICs em vez de ensiná-lo a programar um microcontrolador de uso geral. Para isso, o MSP, AVR (Arduino), ARM Cortex de gama baixa ou até os veneráveis ​​processadores 8051 forneceriam habilidades mais facilmente transferíveis.
uɐɪ
Muito obrigado ... isso foi muito útil. Mas, para resumir sua resposta: o que eu preciso agora é continuar trabalhando em C ++ e dominar C, aprendendo Verilog ou VHDL ou ambos, e pegando algumas placas de desenvolvimento para praticar ou usar esses simuladores como começo.
Siraj Muhammad
1
@SirajMuhammad - Sim, é isso, além de aprender o Verilog e o VHDL provavelmente não é necessário, pois eles geralmente podem ser usados ​​juntos em um design (por exemplo, você pode usar um processador de núcleo leve projetado por outra pessoa em VHDL, em seu design Verilog, e ele funcionará bem), então escolha um.
11138 Oli Glaser
4
@Ian - Eu não estou sugerindo que tem de ser um PIC, isso é apenas um exemplo (daí o "como um PIC") Em qualquer caso, se você está programando em C, eu não acho que há muito de uma abordagem global diferença entre qualquer um dos pequenos micros por aí. É claro que conhecer realmente um micro de dentro para fora (montagem e tudo) é útil, mas para começar em um nível mais alto as coisas devem parecer iguais, apenas as ferramentas sendo diferentes. Eu acho que vale a pena tentar alguns antes de se comprometer com qualquer coisa.
Oli Glaser
2
"não deve ser muito difícil se você já conhece C ++"? Eu não concordaria com isso, alguém que conhece "VB .Net, C♯ e C ++" provavelmente usa o último em um estilo RAII orientado a objetos de alto nível e pode precisar de algum tempo para entender adequadamente o manual gerenciamento de memória.
usar o seguinte código
23

Aprenda C e obtenha uma placa de desenvolvimento de microcontrolador barata, como um MSP430 ou ARM Cortex, e pelo menos grave e carregue alguns programas em C.

Tenho um diploma em ciência da computação e um conhecimento em desenvolvimento de software, principalmente programação C ++ para jogos e agora jogos e aplicativos iOS, mas meu último trabalho foi um show semi-profissional de EE que começou com a programação de firmware de um sistema ARM Cortex M3 , e acabei aprendendo a fazer alguns projetos básicos de circuito e layout de placas, além de projetar algumas placas simples. Então, basicamente, tive que enfrentar o problema de usar a melhor linguagem de programação para conectar o design de hardware / software como alguém responsável por ambas as extremidades.

C é absolutamente o idioma que você precisa saber. É fácil para as pessoas que programam em C ++ e nunca precisam se restringir ao conjunto de recursos de C para dizer "é a mesma coisa", mas não é. Especialmente da maneira como o C ++ evoluiu e reuniu recursos, e da maneira como os programadores convencionais de C ++ usam esses recursos, é realmente muito diferente trabalhar em um aplicativo C razoavelmente grande em oposição a um aplicativo C ++. O SDK do firmware será um monte de bibliotecas C, qualquer outra coisa que caiba em uma MCU será uma biblioteca C, qualquer sistema operacional que faça sentido em uma MCU será gravado em C, etc. etc.

Dito isto, como muitas das cadeias de ferramentas do MCU por aí acabam usando o GCC como compilador, você quase certamente terá um compilador C ++ disponível se estiver usando uma família decente de MCU. Mas é preciso ter muito cuidado com os recursos que você usa, especialmente as da biblioteca padrão, pois é muito fácil acabar com um binário muito grande para caber no seu dispositivo. Eu acho que há um bom argumento a ser usado no uso do C ++ em dispositivos embarcados, o C ++ possui alguns recursos interessantes que não têm tamanho ou não têm penalidade de velocidade ou tamanho, você só precisa saber o que está fazendo e escrever um código que seja adequado mais adiante na extremidade C do estilo C do que na extremidade STL do espectro em termos de uso inteligente de recursos.

Não preste muita atenção nas pessoas que dizem que você pode usar Lua ou Python em um MCU com o intérprete incorporado certo blá, blá. É verdade, eu fiz e é divertido, mas no momento é mais para projetos de brinquedos e outras coisas que aparecem no Hack a Day. Acho que veremos mais coisas desse tipo, pois a Lei de Moore é aplicada incansavelmente até mesmo nos processadores menores, isso é algo que aconteceu com os jogos em que costumava haver muita montagem, e eles resistiram com C e C ++ por mais tempo. do que todos os outros, e agora tudo é tão rápido, e a produtividade do desenvolvedor é tão importante que muito desenvolvimento é feito com linguagens de alto nível incorporadas ou em uma linguagem de alto nível. Mesmo assim, levará alguns anos até que você veja empresas contratando programadores de firmware com experiência em Python e Lua.

Também não gaste muito tempo na montagem. Não é ruim estar familiarizado com os conceitos, mas é improvável que você se veja fazendo muito, se houver alguma programação de montagem. Existe uma sabedoria convencional com jogos incorporados que é "bom saber" montagem, muitas vezes repetida por pessoas que realmente não trabalham nessas áreas. Mas, na realidade, é muito improvável que você escreva qualquer assembly, e se o fizer, provavelmente haverá apenas algumas linhas para otimização ou algo com o hardware para o qual você não tem uma API (mas você depois de escrever um que envolva algumas linhas de montagem). Já trabalhei em vários jogos e esse projeto de design de placa / firmware e o número total de linhas de montagem que escrevi para projetos comerciais provavelmente estão na adolescência. Isto'

Suboptimus
fonte
1
Vale dizer que suas poucas linhas de montagem provavelmente estarão em instruções de montagem em linha ( asm()), bem incorporadas ao seu código C. Esta é uma combinação vencedora em todos os aspectos. Alto nível, mas compacto, com mergulhos ocasionais na montagem quando, por exemplo, o momento precisa ser o correto. A avr-gcccadeia de ferramentas já faz isso muito com macros C, para que você nunca note.
Alexios #
9
Provavelmente é mais importante LER a montagem do que precisar escrevê-la. Isso permite que você entenda o que o compilador está dizendo ao micro para fazer e, em casos muito raros, poderá detectar quando o compilador está errado. Você também precisa ter algum entendimento de montagem para aproveitar ao máximo suas ferramentas de depuração e usar a funcionalidade de etapa única que elas fornecem.
uɐɪ
1
Definitivamente concordo com isso. Eu acho que um dos melhores exercícios para um aspirante a programador é escrever um compilador de linguagem de brinquedo e gerador de código que, pelo menos, lide com funções, matrizes e estruturas para aprender como é um quadro de pilha e como são os elementos básicos de uma linguagem de programação em assembly .
Suboptimus 6/09/12
3
@Ian - Ser capaz de ler o assembler é inútil se você não souber como escrevê-lo. Você precisa lê-lo e compará-lo com o que você faria se tivesse escrito.
Rocketmagnet
2
@Rocketmagnet - Você não deve verificar se o compilador gerou a implementação de montagem mais eficiente. O requisito é que você tenha a capacidade de ler o assembler gerado e verificar se a lógica do código implementado corresponde à sua intenção. É o mesmo que usar outras linguagens humanas. Eu sei ler e entender muito mais francês, alemão e latim do que sei falar ou escrever.
uɐɪ
10

Concordo com todos que você precisa ser muito competente em C.

Também recomendo aprender pelo menos uma linguagem assembly. Fazer isso fará de você um programador C muito melhor. Você precisa saber o que está acontecendo sob o capô, e isso é muito mais verdadeiro no mundo incorporado do que no mundo dos PCs.

A compreensão do montador que seu C está gerando permitirá que você escreva um C mais ideal em termos de velocidade e compacidade. Código mais rápido significa:

  • você pode usar um MCU mais lento e mais barato e diminuir um concorrente.
  • você pode diminuir a taxa de clock para melhorar a conformidade com EMC.
  • em uma aplicação de baixa energia, o MCU pode passar mais tempo dormindo, levando diretamente ao aumento da vida útil da bateria.

Um código mais compacto significa que você pode usar um MCU mais barato com menos memória. Ou tenha espaço para mais recursos.


O outro idioma que você pode considerar aprender é o Verilog . Essa é uma linguagem de descrição de hardware, e realmente bem diferente de C, não apenas na aparência, mas também em sua funcionalidade. A Verilog abrirá o caminho para tirar proveito de chips muito poderosos como o Cypress PSoC3 e 5 . É um microcontrolador com hardware reprogramável analógico e digital, que permite fazer algumas coisas surpreendentes que são muito difíceis de fazer com qualquer outro MCU. Você também poderá fazer o design do FPGA .

Rocketmagnet
fonte
O que você quer dizer com "uma linguagem assembly"? Eu sei que existe uma linguagem chamada Assembly, ela tem ramificações ou algo assim? Você pode citar alguns, por favor? E muito obrigado pela sua resposta.
Siraj Muhammad
4
Cada tipo de CPU ou MCU possui sua própria linguagem assembly com instruções diferentes. São todos bastante parecidos, mas com diferenças importantes. Aprenda a linguagem assembly para qualquer MCU que você estiver usando.
Rocketmagnet
1
Iria dizer exatamente isso. C e Assembly são os mais usados ​​em Engenharia Eletrônica, porque geralmente você lida com coisas de baixo nível. Orientado a objetos não é tão bem utilizado, o tipo de pensamento de baixo nível que vem de C / Assembly também se aplica a qualquer outra coisa com a qual você trabalha.
Sep12
9

Como um MSEE que trabalha na indústria de defesa há 8 anos, posso dizer que entender como programar bem no LabVIEW (uma linguagem gráfica, estritamente tipificada e de fluxo de dados) significa que você nunca ficará sem trabalho.

O LabVIEW começou como uma linguagem de programação para engenheiros de hardware, você pode ver isso no fato de que o código se parece muito com um diagrama de circuitos. No entanto, nos últimos 25 anos, o LabVIEW se desenvolveu em uma linguagem completa e rica em recursos, com suporte para Orientação a Objetos e multiencadeamento. De fato, eu argumentaria que não há outra linguagem de programação, baseada em texto ou de outra forma, que seja mais fácil programar uma aplicação multiencadeada do que o LabVIEW; isso ocorre em grande parte devido ao seu paradigma de fluxo de dados. À medida que o número de núcleos de CPU continuar aumentando, o LabVIEW se tornará cada vez mais relevante como uma linguagem de uso geral.

Outro benefício de conhecer o LabVIEW é que você está a poucos passos de programar FPGAs usando o módulo LabVIEW FPGA, que pega seu código LabVIEW e o converte em VHDL nos bastidores antes de passá-lo ao compilador Xilinx. Você também pode usar suas habilidades no LabVIEW para fazer a transição para a programação do código em tempo real através do LabVIEW Real-Time Module, que usa o VxWorks ou o Phar Lap.

Nota: Eu sou um desenvolvedor certificado do LabVIEW.

insira a descrição da imagem aqui

SiegeX
fonte
5
Toda a produção do LabVIEW que eu vi se parece mais com isso: thedailywtf.com/Articles/Labview-Spaghetti.aspx Não duvido que exista um forte mercado de trabalho para aqueles que desejam manter esse código.
markrages
@markrages Me pediram para manter e / ou expandir o código que era quase tão ruim, talvez pior, pois havia chamadas VI dinâmicas e globais também. Este problema é a faca de dois gumes que é o LabVIEW. Por um lado, eles o comercializam como uma linguagem em que qualquer engenheiro pode programar, mas sem uma base sólida na arquitetura de software, você acaba obtendo código assim. Felizmente, a NI abordou suficientemente esta questão com o LabVIEW 2012, fornecendo modelos bem escritos e comentados para arquiteturas que começam com a simples máquina de estado na complexa estrutura de ator baseada em OOP.
SiegeX 19/09/12
@markrages O problema é duplo. Primeiro, a gerência oferece aos engenheiros apenas treinamento suficiente para serem perigosos. Eu diria que 9/10 programadores do LabVIEW que conheci na minha empresa que receberam treinamento fizeram apenas os dois primeiros cursos básicos, que essencialmente ensinam apenas a sintaxe. Em segundo lugar, o LabVIEW tornou-se uma linguagem rica em recursos que rivaliza com qualquer linguagem moderna hoje em dia porque sua administração gráfica acha que deve ser fácil. O Managemnt nunca encarregaria um engenheiro de software de projetar um circuito de médio a complexo, mas eles não têm problemas em lançar um EE em um problema de software complexo se "conhecerem o LabVIEW"
SiegeX
@markrages: Logo quando me lembrei do porquê de gostar do LabVIEW, vi seu comentário e lembrei por que eu odiava. Oh, todas as horas de frustração voltaram ao mesmo tempo.
Jonny B Bom
6

Se você deseja fazer uma programação de baixo nível de microcontroladores, deve se familiarizar com a programação de montagem de linguagem (quanto mais diferentes as arquiteturas, melhor) e, sim, você usará C muito mais do que C ++.

Para trabalhos gerais de engenharia, linguagens orientadas à matemática como Matlab (também Scilab e GNU Octave) serão comumente usadas para modelagem e prototipagem.

Além disso, muitos IDEs para software e hardware são programáveis, geralmente usando TCL ou LUA, portanto, alguma familiaridade com linguagens de script em geral (também Perl, Python, PHP, Javascript, etc.) seria útil.

Para o design de hardware, você precisará das habilidades de Verilog e / ou VHDL.

Dave Tweed
fonte
6

C ++ é suficiente? Talvez.

Lembre-se de que C é usado em algo como 90-99% de todos os mcu: s disponíveis, portanto, C é uma obrigação em seu currículo.

Mas como você é um cara de alto nível, pode começar a brincar com o Arduino: s, pois eles são programados com um C ++ reduzido e isso daria uma idéia aproximada do que o C ++ pode fazer no mundo do mcu agora.

Johan
fonte
3

Para microcontroladores (e abordarei apenas microcontroladores), acho que C é uma linguagem de entrada muito melhor que C ++. A montagem seria o próximo passo, fantástica para ajudar você a entender como o seu compilador C está enganando você, criando bugs, roubando tiquetaques de relógio, etc., e tirando o máximo desempenho da sua plataforma. Isso tudo pressupõe que você esteja falando de um microcontrolador - não de um arduino, do BASIC Stamp ou de qualquer outra plataforma que envolva um microcontrolador finalizado.

Difícil dizer o que é útil para "seu campo" - e sugerir que, como estudante, você talvez ainda não saiba qual é o seu campo! - mas acho que o seu conjunto de idiomas parece bastante razoável e você poderá usá-lo repetidamente. No mínimo, ter uma boa compreensão de uma linguagem estruturada torna a próxima muito mais fácil, mas acho que você sempre encontrará boas habilidades de programação do Windows em seu bolso.

Scott Seidman
fonte
2

Você pode aprender C e o tipo de código do assembler que é gerado pelas instruções C se trabalhar com processadores, mas também deve aprender a usar um shell de linha de comando Unix, como o bash, e as ferramentas que o acompanham, como sed, ed, awk, vim / vi, find, tar, gzip, ... assim como o Python, que você pode usar em muitas plataformas e é uma boa maneira de "fazer as coisas".

Paddy3118
fonte
2

Você deve aprender C se quiser ser um desenvolvedor incorporado sério. Você também deve conhecer o assembler, embora provavelmente o use muito raramente.

mjh2007
fonte
0

Primeiro, definirei engenheiro eletrônico como alguém envolvido no projeto de hardware, do firmware ao design da placa e ao design do chip. Em alguns casos, você estará executando o firmware, conforme indicado acima, você precisará de "C". Um software mais profundo torna-se simplesmente uma ferramenta, entender alguns conceitos de ciência da computação em linguagens complementares, de C / C ++ a Lisp, como linguagens, será mais importante do que específico. Você precisará de software para apoiar seus esforços de design, mas isso não tem precedência para entender os limites fundamentais do que pode ser feito em uma implementação física. O design digital NÃO é Verilog / VHDL, mesmo que o design seja expresso nesses idiomas. No design totalmente personalizado e in-silico, você verá Lisp como idiomas e C - idiomas funcionais.

espaço reservado
fonte