Como se tornar um desenvolvedor de software embarcado
- por Sergio Prado
Nas últimas semanas tenho recebido alguns emails de pessoas com intenção de entrar ou se aprimorar na área de desenvolvimento de software para sistemas embarcados. Isso me motivou a escrever este post, e passar um pouco da minha experiência sobre como se desenvolver numa área tão dinâmica como a nossa.
Primeiramente, gostaria de ressaltar que não existe uma “receita de bolo”. O que descrevo aqui foi o que funcionou (e continua funcionando) para mim. Isso não significa que vai funcionar para qualquer um. Adapte-se à sua forma de trabalho, às suas atitudes, ao tempo que você tem disponível, e principalmente aos seus objetivos de carreira.
Então vamos lá. Você quer ser um profissional extremamente competente na área de desenvolvimento de software para sistemas embarcados. Então você precisa se desenvolver em três esferas diferentes:
1. Conhecimento: você precisa conhecer a teoria envolvida em sistemas embarcados. Isso significa hardware e software. É impossível ser um competente desenvolvedor de software embarcado sem conhecer a fundo a arquitetura de hardware a qual esta trabalhando.
2. Habilidade: você precisa obter experiência na área. Precisa de prática. Você pode decorar todos os mnemônicos do assembler do PIC, mas de nada vai adiantar se você não souber acionar um led com este conhecimento.
3. Atitude: acima de tudo, você precisa de atitudes que vão te fazer crescer nesta área. É uma área muito dinâmica, com mudanças e evoluções frequentes. Voce precisa estar sempre motivado(a), ser auto-didata, gostar de aprender, “fuçar” e entender como as coisas funcionam. Sem atitudes deste tipo você vai desistir logo. Porque nesta área você precisa ser muito, mas muito persistente.
Mas como colocar tudo isso em prática? Conforme disse, não existe uma regra ou sequência a ser seguida, vai depender muito também das oportunidades que aparecerem para você, além da sua capacidade de criá-las. Mas você vai precisar desenvolver seu conhecimento para então aplicá-los, e as dicas abaixo são um bom começo.
1. O que você precisa aprender de hardware (pelo menos)
Conheça bem pelo menos uma arquitetura de 8 bits. Eu comecei com o 8051 e depois acabei aprendendo PIC. Aprenda como funciona sua arquitetura interna, como ele gerencia a memória e os I/Os. Faça alguns programas simples e brinque com o Assembly dele. Se você não tem condições de comprar ou montar um kit de desenvolvimento, você pode baixar gratuitamente o ferramentas da IAR e usar o simulador integrado à IDE para testar sua aplicação.
Saiba como interfacear alguns dispositivos de I/O normalmente utilizados: switchs, leds, teclados, displays, interfaces seriais e paralelas, etc. Invista em você mesmo e monte ou adquira um kit de desenvolvimento, como os da Microgenius. Vai valer a pena.
Aprenda pelo menos uma, e se possível duas, arquiteturas de 32 bits. Eu comecei com o x86 mesmo, depois aprendi PPC, ARM e agora trabalho mais com MIPS. São arquiteturas bem mais complexas, vale a pena uma leitura detalhada no datasheet para entender toda sua estrutura. Não é essencial conhecer todo seu conjunto de mnemonicos Assembly (você vai ficar louco e ser internado provavelmente se fizer isso), mas vale a pena dar uma passada para conhecer as possibilidades da arquitetura.
Na maioria dos casos estas CPUS rodam algum SO (RTOS, Linux, Windows, etc), então não se preocupe muito com o Assembly. Talvez você precisa consultar o datasheet de vez em quando, mas na maioria das vezes você vai desenvolver em C ou C++ nestas CPUs.
Com um pouco de experiência e persistência, você vai poder avançar e começar a trabalhar com interfaces mais avançadas, como USB, Ethernet, Bluetooth, etc.
2. O que você precisa aprender de software (pelo menos)
Desenvolvimento de software em geral, e para sistemas embarcados em específico, é uma arte. E é a arte de fazer mais com menos.
Você precisa de habilidades para trabalhar com recursos limitados. Você não tem um Duo Core de 2GHz em mãos, e sim um PIC de 4MHz. Você não tem 4G de RAM, mas apenas 4K bytes para sua aplicação. O seu display não á um LCD de 19″, e sim um LCD de 2×16 caracteres.
Seu código precisa ser mais eficiente e confiável. Você confiaria em um software que você desenvolveu rodando em um marca-passo se sua vida dependesse deste marca-passo? É mais ou menos assim que você deve se sentir quando desenvolve uma aplicação de missão crítica em sistemas embarcados.
Você precisa então conhecer pelo menos Linguagem C e Assembly.
Assembly é tão voltada ao hardware que a mencionei no tópico acima. Você precisa ser, mais do que tudo, um “mestre” em linguagem C. Conhecer todas as suas nuances. Conhecer cada palavra-chave e saber utilizá-la. Saber quando usar const, volatile, static. Saber a diferença entre heap e stack. Saber desenvolver rotinas de tratamento de interrupção (ISR). Saber o que é e como desenvolver funções reentrantes. E por aí vai.
Mas como desenvolver tudo isso? Muito estudo, leitura e prática. Eu comecei estudando pelo “C Completo e Total“. É um ótimo livro para começar, para conhecer a linguagem, mas não é focado em sistemas embarcados.
Os livros do Fabio Pereira também são muito bons para estudar determinada arquitetura.
Focados em sistemas embarcados, dois muito bons são “Programming Embedded Systems in C and C++” e “An Embedded Software Primer“, e gosto muito destes 2 livros do Jack Ganssle: “The Art of Designing Embedded Systems” e “The Firmware Handbook (Embedded Technology)“.