A programação incorporada está mais próxima da engenharia elétrica ou do desenvolvimento de software? [fechadas]

34

Estou sendo abordado com um trabalho para escrever C incorporado em micro controladores. No começo, eu pensaria que a incorporação de programação é muito baixa na pilha de software para mim, mas talvez eu esteja pensando errado.

Normalmente, eu teria descartado a oportunidade de escrever código incorporado, pois não me considero um engenheiro elétrico. Esta é uma suposição ruim? Sou capaz de escrever um software interessante e útil para sistemas embarcados ou me chutarei por cair muito baixo na pilha de software?

Fui para a escola de ciência da computação e realmente gostei de escrever um compilador, pensando em algoritmos simultâneos, projetando estruturas de dados e desenvolvendo estruturas. No entanto, atualmente estou empregado como desenvolvedor web, o que não grita as coisas interessantes que acabei de descrever. (Atualmente, lido com questões como: "essa caixa de seleção precisa ter 4 pixels à esquerda" e "esta data está formatada incorretamente".)

Agradeço a contribuição de todos. Eu sei que tenho que tomar a decisão por mim mesmo, gostaria apenas de alguns esclarecimentos sobre o que significa ser um programador incorporado e se ele se encaixa no que eu acho interessante.

Jeremy Heiler
fonte

Respostas:

33

Se você quer ser bom em trabalhar em sistemas embarcados, sim, precisa pensar como um EE algumas vezes. Geralmente, você está escrevendo um código para fazer interface com os vários periféricos (barramentos seriais como UART, SPI, I2C ou USB), temporizadores de 8 e 16 bits, geradores de clock e ADCs e DACs. As "planilhas de dados" para microcontroladores costumam chegar às centenas de páginas, pois descrevem cada pedaço de cada registro. Ajuda a ler um esquema, para que você possa testar uma placa com um osciloscópio ou analisador lógico.

Em outros momentos, é apenas escrever software. Mas sob restrições rígidas: geralmente você não terá um sistema operacional formal ou outra estrutura e poderá ter apenas alguns KB de RAM e talvez 64 KB de memória de programa. (Esses limites pressupõem que você esteja programando em micros menores de 8 ou 16 bits; se estiver trabalhando com Linux incorporado em um processador de 32 bits, você não terá as mesmas restrições de memória, mas ainda precisará lidar com qualquer problema personalizado. hardware periférico que sua distribuição Linux não fornece drivers.)

Eu tenho experiência em EE e CS, então gosto dos dois lados da moeda. Também faço programação na Web (principalmente PHP) e aplicativos de desktop (C # e Delphi), mas sempre gostei de trabalhar em projetos incorporados.

tcrosley
fonte
Obrigado pela sua resposta. As restrições realmente não me incomodam. Apenas me considero um cara de software, e não um engenheiro elétrico. Você diria que "programação de baixo nível" é o mesmo que "engenharia elétrica de alto nível"?
precisa
+1 nas observações de 32 bits e Linux - eu trabalhava em telecomunicações e o hardware do switch era como codificar uma versão simplificada de um Amiga (processador Motorla 68k). Tivemos momentos muito felizes - às vezes sinto falta.
Gary Rowe
3
@ Jeremy, sim, quando você está tentando descobrir as configurações de um periférico complicado ou olhando para um fluxo de bits serial em um escopo, às vezes parece que você está fazendo uma programação de baixo nível e às vezes está pensando em algo alto EE de nível superior. Você pode gastar muito tempo olhando o conteúdo do registro nas janelas do depurador de um IDE. Nesse nível, você está olhando diretamente para o hardware.
tcrosley
20

A resposta de @crosley é excelente. Você não precisa ser um engenheiro elétrico, mas conhecer o básico ajuda.

Eu não acho que você precise temer estar "muito baixo na pilha de software". Eu tive que resolver muitos problemas muito interessantes como engenheiro incorporado. Você menciona uma lista de tarefas que você gostou:

  • Algoritmos simultâneos - Lidar com interrupções assíncronas no nível do hardware tem tantos desafios interessantes quanto o uso de um modelo de encadeamento do SO.

  • Projetando estruturas de dados - Verifique. Design para compacidade e acesso eficiente.

  • Estruturas em desenvolvimento - Verifique. Em sistemas bare bones, você pode acabar criando um mini-OS.

  • Gravando um compilador - talvez não, mas você pode acabar otimizando o código de baixo nível semelhante à etapa de geração de montagem de um compilador.

Eu escolheria trabalhar em sistemas embarcados em vez de codificar UI's qualquer dia. Você nunca esquecerá a primeira vez que assistir a uma máquina começar a se mover da maneira como a programou. É muito mais gratificante do que empurrar pixels.

AShelly
fonte
Obrigado pelos mapeamentos 1 para 1 do AShelly. Não sabendo realmente nada sobre o ambiente de trabalho incorporado, é bom saber disso.
precisa
6

Como programador incorporado, meu trabalho é fazer o hardware personalizado funcionar. Normalmente, desenvolvi vários softwares em uma placa de desenvolvimento ou em uma versão anterior do hardware. Quando a nova placa entra, meu trabalho é colocar meu software na placa e demonstrar que tudo funciona.

Como quase sempre há algum problema de algum tipo, as habilidades de depuração são essenciais. Se o periférico externo não funcionar, é um chip com defeito, conexão incorreta com o chip, código de buggy ou uso incorreto do periférico no chip? A única maneira de saber é com a depuração extensiva. Isso significa estar confortável com osciloscópios, analisadores de rede, analisadores lógicos e depuradores de destino. O processo de depuração se torna quase científico. Desenvolvo uma hipótese, desenvolvo um experimento para fornecer evidências a favor ou contra minha hipótese e testei.

Ao avaliar estagiários ou novos engenheiros incorporados, essa habilidade é a mais crítica. Todo software tem problemas, mas, quando você começa a interagir com o mundo físico, a variedade desses problemas aumenta exponencialmente. A essência do meu trabalho é resolver a longa série de problemas entre conceito e realidade.

Ben Gartner
fonte
É verdade que a depuração é uma habilidade essencial para um programador incorporado individual - particularmente o tipo de depuração que envolve observar a exibição de um escopo de armazenamento anexado às faixas em um PCB para diagnosticar um problema com o software incorporado. :-) - No entanto, uma virtude maior em uma equipe de engenheiros de software embarcados é a capacidade de detectar erros automaticamente por meio de técnicas avançadas de teste e controle de qualidade.
William Payne
5

Na minha experiência, obtém-se melhores resultados no desenvolvimento de software de sistema embarcado com um chapéu de "desenvolvedor de software" em vez de um chapéu de "engenheiro eletrônico". (práticas como TDD e CI são menos comuns em engenharia de hardware)

Por outro lado, acho que a experiência de desenvolvimento para um sistema embarcado melhora o desempenho; desenvolvedor de software mais completo.

William Payne
fonte
2
Exatamente, como desenvolvedores incorporados aqui, o setor precisa de mais pessoas cs aqui, como o software está ficando muito mais complicado, somos muito ruins em boas práticas de qualidade de software.
Bjarke Freund-Hansen
Acho que o pessoal da CS também gostaria disso, pois escrever software incorporado é um dos trabalhos mais gratificantes (intelectualmente, se não financeiramente) que um desenvolvedor de software pode realizar.
William Payne
3

Eu estava em uma situação semelhante há cerca de 8 anos. Eu tinha naquele momento 7 anos de desenvolvimento de software em ambientes de aplicativos e servidores. Minha única experiência em lidar com hardware de baixo nível antes era escrever no Z80 assembler quando adolescente em um espectro ZX.

Certamente foi um desafio. Achei muito agradável lidar com os chipsets no assembler e certamente aprendi muito sobre hardware. Uma parte substancial da minha função foi testar o hardware usando software, aprendendo a lidar com a programação e reconhecendo que o bug do software é realmente um bug do hardware. Na verdade, às vezes, pode ser necessário bastante trabalho das pessoas de software e hardware para identificar se um bug é hardware ou software.

Um aspecto que não consegui entregar foi o trabalho do driver de dispositivo. Eu realmente nunca entendi isso, que é uma coisa que eu e o diretor da empresa nunca entendemos o porquê. Apenas se tornou um fato aceito.

Familiarizar-se com um occiloscópio e um íon de solda será essencial. lembrando que quando um técnico diz o número 26, SEMPRE significa que 0x26 é útil. Perceber que os engenheiros de hardware acham muito frustrante lidar com software, mas, em seguida, um projeto de hardware que não envolve software é chamado de cabo.

Permaneci nesse papel por 4 anos e só fui embora porque fui perseguido por uma oportunidade realmente fantástica.

Michael Shaw
fonte
Obrigado por compartilhar sua experiência Ptolomeu. Eu agradeço.
precisa
Hoje em dia muitos cabos também possuem microprocessadores. :-)
William Payne
2

Como tudo, requer uma abordagem equilibrada. Adoro trabalhar com sistemas embarcados no meu trabalho diário. Eles me fazem melhor em engenharia elétrica. A computação física e a automação são muito empolgantes. Por outro lado, criar aplicativos da Web e mexer com a computação em nuvem é incrível.

Se você fizer isso da maneira certa, o seu lado do software procurará maneiras de fazer as coisas de maneira mais inteligente e melhor. O seu lado de hardware o manterá atento aos recursos e super eficiente.

mcotton
fonte
Obrigado pela sua resposta. Eu vejo como sendo capaz de mudar um pouco os campos, se não for o caso, para aprender os níveis mais baixos e depois voltar um pouco para a pilha.
precisa
2

Não sou engenheiro elétrico, mas fiz uma pequena quantidade de desenvolvimento de software incorporado. O maior problema que encontrei é que tenho um conhecimento muito mais básico em matemática e, portanto, não sei como dividir facilmente uma série complexa de algoritmos matemáticos avançados em código sem muita ajuda.

Para todas as coisas em que eu precisei brincar com sinalização, ler valores de entradas, enviar dados para saídas e todo esse tipo de coisa, achei um pouco diferente conceitualmente o que faço no dia a dia como um bom desenvolvedor de software antiquado. Escrever software é realmente o que é. É quando você precisa ir além do software real que eu acho que as coisas estão ficando complicadas porque não tenho o conhecimento necessário para mexer diretamente com o hardware. Isso geralmente acontece ao tentar depurar ou testar o código. Se você tem uma cadeia de ferramentas realmente excelente, pode ter um ambiente de depuração e simulação integrado para eliminar a maior parte da dor, mas mesmo com tudo isso para ajudá-lo, às vezes você precisa voltar ao básico e testar seu código contra algum tipo de analisador, e a realidade é que a maioria das plataformas embarcadas não

Nesta perspectiva, não acho que ser engenheiro elétrico seja essencial para a programação incorporada se as tarefas forem simples e os requisitos específicos de hardware reais forem mínimos. Além disso, acho que ser um EE tornaria a vida muito mais fácil quando se trabalha em um ambiente incorporado, particularmente quando é necessária ciência real para descobrir onde estão os problemas.

S.Robins
fonte
"Ouija-Board da EE" - brilhante, eu conheço bem
Martin Beckett
2

Não desenvolvi nenhuma programação incorporada em nível de negócios, mas meu bacharelado era principalmente sobre sistemas embarcados, dos quais tenho alguns anos de experiência real. Usamos C no Atmel AVR e tocamos alguns chips da Texas Instruments com VHDL, e tivemos algumas coisas teóricas no ARM.

No que tínhamos, eram aproximadamente de 50 a 60% de programação (C), 20% de planejamento / projeto (UML), e o restante eram eletrônicos físicos (solda, medição, fiação, fabricação de cabos etc.). Também concordo que foi muito interessante e divertido de fazer e, na verdade, gostaria de ter também uma carreira em sistemas embarcados. Infelizmente, com um mercado muito pequeno de sistemas embarcados, tive que recorrer ao antigo Java EE.

Mas eu discordo; Eu diria que as porcentagens acima mencionadas são bastante próximas dos empregos no mundo real, uma vez que nossos professores têm empresas próprias e também mencionaram que tentarão torná-lo o mais realista possível. Até tivemos curvas aleatórias de 180 graus nos requisitos no meio do projeto, heh heh.

Quanto à pilha. O conhecimento da programação incorporada lhe dará grandes chances de criar produtos de hardware próprios e muito reais que você poderia fabricar em fábricas reais na Ásia e montá-los em suas instalações (seja em casa ou em sua própria empresa). É muito interessante! Você também pode fazer muitos aparelhos que serão úteis em casa, como faróis com movimento controlado, cronômetro para uma máquina de café para preparar automaticamente o seu café da manhã e assim por diante. Coisas emocionantes, de fato!

Juha Untinen
fonte