Como se tornar um desenvolvedor de software incorporado?

22

Gostaria de receber algumas dicas para quem deseja se tornar um bom desenvolvedor de software incorporado ou deseja melhorar nessa área.

O que preciso aprender sobre hardware, software?

Quais livros são mais recomendados? Blogs?

No final, como eu poderia passar de um hobby para iniciantes a um excelente profissional?

Daniel Grillo
fonte

Respostas:

39

Todas as respostas foram boas até agora, mas eu vou jogar meus dois centavos.

Aqui está uma repetição de algumas dicas com um toque e algumas extra:

  • Aprenda C: a linguagem fundamental do hardware que ainda é portátil (até certo ponto). Não apenas aprenda, mas torne-se um especialista em todos os seus recursos, como volátil e por que é importante para escrever drivers de dispositivo.
  • Comece com um bom kit de desenvolvimento como o Arduino, mas, como dito anteriormente, aprenda outras arquiteturas depois de ter uma boa idéia dele. Felizmente, existem algumas placas compatíveis com Arduino construídas com outros processadores. Dessa forma, você pode reescrever o mesmo design em um uC diferente e não atrapalhar todo o seu design enquanto experimenta algo novo.
  • No estágio de aprendizado, fique à vontade para reinventar a roda em drivers de dispositivo ou em outros trechos de código. Não basta colocar o código de driver de outra pessoa lá. É importante reinventar a roda quando você está aprendendo.
  • Desafie-se a reescrever seu código com mais eficiência em termos de velocidade e uso de memória.
  • Familiarizando-se com diferentes estilos de arquiteturas de software de sistemas embarcados. Comece com o processamento básico de loop orientado a interrupções / segundo plano, depois vá para agendadores em segundo plano e sistemas operacionais em tempo real.
  • Obtenha um bom controle de fonte! Eu prefiro o Mercurial .
  • Mesmo se inscreva em sites de hospedagem de controle de fonte gratuitos, como Sourceforge.net ou Bitbucket.org, para hospedar seu projeto, mesmo que você seja o único a trabalhar nele. Eles farão o backup do seu código, para que você não precise se preocupar com a falha ocasional do disco rígido que está destruindo tudo! O uso de um VCS distribuído é útil, pois você pode verificar as alterações no disco rígido e fazer o upload no site host quando estiver pronto.
  • Aprenda bem suas ferramentas para qualquer chip em que estiver trabalhando! É essencial saber como o compilador cria montagem. Você precisa ter uma idéia de quão eficiente é o código, porque pode ser necessário reescrever no assembly. Saber como usar o arquivo vinculador e interpretar a saída do mapa de memória também é essencial! De que outra forma você vai saber se essa rotina que você acabou de escrever é a culpada de consumir muita ROM / Flash!
  • Aprenda novas técnicas e experimente-as em seus projetos!
  • Não assuma nada ao depurar. Verifique!
  • Aprenda a programar defensivamente para detectar erros e verificar suposições (como usar assert)
  • Crie informações de depuração no seu código, onde você pode, como gerar o consumo de memória ou criar um perfil de código com temporizadores ou usar pinos sobressalentes no uC para alternar e medir a latência de interrupção em um escopo O.

Aqui estão alguns livros:

Aqui estão alguns sites:

  • Gurus incorporados
  • Grupo Ganssle Jack Ganssle tem algumas histórias históricas maravilhosas para contar. Leia os artigos. Ele fica um pouco pregador sobre algumas coisas.
  • Embedded.com Boas informações para obter as técnicas e dicas mais recentes de Ganssle, Barr e outros especialistas do setor.
Jay Atkinson
fonte
1
@ Adam: Eu amo esse livro! Programador pragmático! Não acredito que esqueci!
Jay Atkinson
1
+1 para Mercurial. Gosto, embora tenha a sensação de que a proficiência em git seria mais valiosa. Conhecer o básico do SVN é bastante importante se você deseja contribuir ou extrair de outros projetos, pois é isso que muitos deles usam.
tyblu
17
  • Lembre-se: "Não há bala de prata" , não caia na armadilha de acreditar que existe uma ferramenta, metodologia, linguagem ou sistema que pode resolver todos os problemas
  • Torne-se um especialista em C
    • Aprenda a conviver sem malloc () e POSIX
  • Não fique preso em uma arquitetura, é fácil se tornar um fanboy do PIC ou AVR ou ARM por acidente
  • Construa coisas, depure, faça funcionar. A prática leva à perfeição
  • Aprenda pelo menos um sistema de controle de origem (SVN / git / etc) e use-o
  • Esteja sempre preparado para testar suas suposições. O erro geralmente está no que você está assumindo que funciona
  • Não fique muito dependente de depuradores, eles são diferentes em todos os sistemas e com confiabilidade variada
  • Pense frugalmente. Ao resolver problemas, pense na pegada do código, na RAM e no custo de hardware

Para livros, recomendo pesquisar na história. A maioria das técnicas de software embarcadas de hoje vem da ponta sangrenta do passado.

Como qualquer coisa, pratique diariamente.

Toby Jaffey
fonte
5
De todas as coisas que aprendi, o controle de versão (atualmente uso o subversion) é a coisa mais valiosa para a minha produtividade. Tínhamos o sourceafe seguro pela Microsoft quando comecei aqui, então usei uma solução ruim e depois uma boa.
21810 Kortuk
Não consigo imaginar minha vida sem um sistema de controle de fontes. Também uso o SVN atualmente. Não sei como as coisas funcionaram antes de conhecer o SVN.
Daniel Grillo
1
+1 para "O erro geralmente está no que você está supondo que funciona"
JustJeff
"Aprenda a conviver sem malloc" - Por quê? Para minimizar o risco de colisão de pilha / pilha?
23412 rzetterberg
@rzetterberg Muitos sistemas embarcados evitam o uso de alocação dinâmica de memória, pois pode levar à fragmentação e indeterminismo de heap
Toby Jaffey
8

As outras respostas são ótimas, mas a maior diferença entre um hobby e um profissional deve ser uma mentalidade de qualidade. Portanto, faça seu projeto avançar, não pare quando terminar 80% de um projeto. Leve-o até o fim, prove que está funcionando e documente-o corretamente.

Verifique se o seu código é legível e pode ser mantido.

E não se esqueça de se divertir também :)

Johan
fonte
7

Além do óbvio, como aprender C e começar com alguma placa de desenvolvedor, você deve aprender a ler as folhas de dados do microcontrolador .
Os fabricantes adicionam cada vez mais recursos aos microcontroladores, que, portanto, tornam-se cada vez mais complexos. A folha de dados não fornece apenas características elétricas (o que é mais interessante para o engenheiro eletrônico do que o desenvolvedor de software), mas também uma descrição detalhada de registros, mapas de memória etc.
Na primeira leitura, uma folha de dados pode parecer assustadora, mas não os compreende. pode causar uma dor de cabeça mais grave na fase de depuração.

stevenvh
fonte
3

'Incorporado' é um termo meio carregado.

Em alguns aspectos, qualquer sistema dedicado à execução de um único aplicativo pode ser chamado de sistema incorporado, desde que haja algum hardware a ser controlado. É possível chamar um PPC604 de 400 MHz com 2 GB de RAM executando um aplicativo java no Linux como um sistema incorporado, se estiver controlando um processo por meio de módulos de E / S locais. Por outro lado, um arduino apenas executando algum tipo de aplicativo de rede mínimo não seria muito um sistema incorporado. Mas provavelmente "incorporado" faz com que a maioria das pessoas pense em controladores baseados em flash com apenas algumas centenas de bytes de RAM, sem sistema operacional para falar e uma infinidade de periféricos no chip.

Dito isto, provavelmente os dois maiores obstáculos que os programadores não incorporados geralmente enfrentam nos sistemas embarcados de aprendizado são os registros e interrupções de E / S.

As interrupções podem, na verdade, ser o mais fácil dos dois conceitos para os programadores não incorporados lidarem, uma vez que os principais problemas com esses programas, concorrência e programação orientada a eventos, são frequentemente encontrados em aplicativos comuns. O que torna as interrupções um problema é perceber a extrema sensibilidade de um sistema à qualidade de seu manuseio de interrupções e os meandros de lidar com o hardware para limpar a condição de interrupção e configurar o próximo. Com uma GUI, um impasse mata apenas o aplicativo. Com um manipulador de interrupções, um impasse faz com que todo o sistema seja bloqueado.

Os dispositivos de E / S parecem ser a área que causa mais dificuldade. Para os não iniciados, pode ser uma surpresa descobrir que a leitura desse registro aqui afeta esse registro ali . Escrevendo 1 para limpar bits. Bits de status que se limpam quando você lê um registro de dados, etc. Há tantas possibilidades com o hardware de E / S que não há regra geral para lidar com ele, exceto para aprender a encontrar e interpretar as folhas de dados do dispositivo. Escrever um driver de dispositivo para uma porta serial lhe ensinará muito sobre programação de E / S de baixo nível.

Realmente, não há substituto para aprender essas coisas do que arregaçar as mangas e programar alguma linguagem C e / ou assembly reta no metal puro. Mesmo o sistema embarcado baseado em java mencionado, eventualmente, precisa de um driver de dispositivo para a E / S, e isso significa, finalmente, lidar com alguns C. A experiência é o melhor professor. Escolha um microcontrolador, seja MSP430, TMS320, AVR, ARM, PIC, 68HC11, qualquer que seja, encontre um kit de avaliação e construa alguns sistemas.

JustJeff
fonte
3

$50.to$ Arduino pro minimas você precisa soldar para o pro mini. Eu não sou fã da família PIC, mas você pode querer obter algo como uma lição de história, o mesmo vale para o 8051, ambas as famílias ainda são populares e estão em uso, mas não muito eficientes e foram ignoradas por outras arquiteturas. Aprenda absolutamente ARM e polegar, talvez MIPS (que é uma foto 32, para não confundir com a arquitetura PIC original mais antiga). O ARMmite Pro é um bom quadro ARM de nível de entrada, embora o Stellaris também possa ser.

O que você deseja aprender aqui é o assembler para várias plataformas. C. Interação C e assembler. Diferentes ferramentas GCC e não GCC. Como ler uma referência de folha de dados / programadores (e perceber que todos eles têm alguns erros ou podem ser enganosos, nunca confie neles, o hardware vence os documentos) e como ler ou usar um esquema. Esses esquemas não são complicados normalmente. Várias placas são boas para a interface em projetos, o que significa que elas não têm lixo na placa, apenas acesso direto aos pinos de E / S. Mas isso não é o melhor para aprender. Algo como um StellarisO quadro que é doloroso para os projetos tem muitas coisas divertidas para aprender a incorporar e aprender a emprestar / usar drivers ou escrever suas próprias folhas de dados. A borboleta Atmel AVR também é uma boa placa, se ainda estiver disponível, pode precisar ser soldada em sua própria porta serial para programá-la ou apenas congestionar alguns fios nos orifícios. O que ele oferece é alguns periféricos que você pode aprender a programar.

Mesmo que você acabe fazendo um trabalho incorporado que envolva a gravação de aplicativos usando chamadas SDK ou API no linux ou em um RTOS (nunca tocando em hardware ou lendo folhas de dados), o conhecimento acima ainda o colocará à frente do resto.

Daniel Grillo
fonte
3

Este artigo (traduzido automaticamente do português para o inglês) tem uma boa visão geral do desenvolvimento de uma carreira como desenvolvedor de software incorporado. Nota: O original está aqui .

Começa descrevendo as esferas do conhecimento que você deve desenvolver:

  1. Conhecimento: você deve conhecer a teoria envolvida em sistemas embarcados. Isso significa hardware e software. É impossível ser um desenvolvedor competente de software incorporado sem conhecer a arquitetura de hardware que está funcionando.

  2. Habilidade: Você precisa obter experiência na área. Precisa de prática. Você pode decorar todos os mnemônicos do assembler PIC, mas não adianta se você não puder conduzir um LED com esse conhecimento.

  3. Atitude: Acima de tudo, você precisa de atitudes que o farão crescer nesta área. É muito dinâmico, com mudanças e desenvolvimentos frequentes. Você precisa sempre estar motivado (a) ser autodidata, gostar de aprender, "ajustar" e entender como as coisas funcionam. Sem essas atitudes, em breve. Como nesta área, você precisa ser muito, muito persistente.

Em seguida, fornece as seguintes dicas para dominar essas áreas (e as desenvolve com mais texto, estes são apenas os títulos):

  1. O que você precisa aprender sobre hardware (pelo menos)
  2. O que você precisa para aprender o software (pelo menos)
  3. Além disso, estude sistemas operacionais
  4. Você precisa de um treinamento
  5. Não pare, continue aprendendo e desenvolvendo sua rede!
Kevin Vermeer
fonte
1
Obrigado pelo link! A tradução do Google parece indicar que é um ajuste perfeito para esta pergunta. No entanto, preferimos que (1) o texto esteja em inglês (somos uma comunidade de língua inglesa , mesmo que muitos de nós sejam pelo menos bilíngues) - Traduza automaticamente apenas se você precisar (2) a resposta incluir um resumo do artigo, caso o link fique inoperante. Editei sua postagem para seguir essas diretrizes e dei um voto positivo por ela!
Kevin Vermeer
2

Pense duas vezes antes de se tornar um engenheiro de software incorporado. Eu tive fases na minha carreira. Desenvolvi software nos primeiros 5 anos, depois da mudança para vendas / marketing, fiz isso por 15 anos, gerenciei um negócio de mais de 100 milhões de dólares e agora estou de volta ao software.

Quando volto ao software após 15 anos, lembro por que saí em primeiro lugar. É difícil. Ele precisa de concentração, várias centenas de linhas de código se tocando e todos vocês precisam mantê-lo na memória. Incorporado é particularmente difícil.

Você também precisa se entender. Se você é geralmente um cara inteligente, meticuloso e paciente, você seria um grande engenheiro. Se estiver faltando algum desses, você terá uma média na melhor das hipóteses. Pense sobre isso. Se você é ultra inteligente e não paciente, não vale muito porque, por mais inteligente que seja, uma boa engenharia exige paciência e atenção aos detalhes.

Você também precisa se sentir confortável observando as horas de código por vez sem falar. Observo que pessoas com boas habilidades sociais acham isso insuportável.

Se tudo isso der certo, leia todos esses ótimos livros, faça os exercícios e você será um grande engenheiro. Boa sorte

Frank
fonte
1

Todo mundo diz grandes coisas. Então, eu vou lhe dar conselhos gerais: leia leia leia leia leia leia leia leia!

Leia todos os artigos em http://embeddedgurus.com Se você não entende alguma coisa, pesquise. Se, na explicação dessas coisas, você encontrar algo que não entende, leia mais. Estou prestes a entrar em uma posição de software embarcado e minha experiência é um punhado de projetos profissionais nos últimos anos e muita leitura. A experiência permite que você tente as coisas, mas a leitura permite saber se as coisas que você tentou já foram feitas antes, talvez melhores do que você. Ele apresenta conceitos com os quais você pode trabalhar em qualquer circunstância.

Apenas leia!

AngryEE
fonte
0

Torne-se um especialista em C Compreenda os temporizadores e as comunicações seriais. Você deve sujar as mãos com isso. Entenda os protocolos de RF, ajuste-os às suas necessidades. Não tente cegamente combinações de código durante a depuração. O código faz exatamente o que você pede. Leia o manual do usuário e a folha de dados e faça uma alteração se algo não funcionar. Tudo o que foi dito e feito, a única maneira real de se tornar um especialista é praticar. Continue construindo aplicativos. Em breve, isso se tornará uma segunda natureza.

Dominic Pritham
fonte