Como se tornar um desenvolvedor de software embarcado

- por Sergio Prado

Categorias: Carreira Tags: , , , , ,

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)“.

A melhor forma de desenvolver novas técnicas de codificação é lendo códigos. Então procure sempre ler o máximo possível de códigos open-source disponiveis. Eu costumo analisar trechos das implementações do kernel do linux e de seus device drivers e de pacotes opensource.
3. Além disso, estude sistemas operacionais
A partir de certo nivel, você terá contato com algum tipo de sistema operacional. E se não tiver oportunidade, crie uma.
A uns seis anos atrás, eu queria aprender a arquitetura de um RTOS, mas onde trabalhava não existia nenhuma possibilidade de utilização. Então eu pensei em estudar sozinho. Mas eu precisava de um ambiente, de preferencia um kit de desenvolvimento para estudá-lo. Então tive a idéia de entrar em contato com algumas empresas com o intuito de portar um RTOS (escolhi o FreeRTOS) para sua arquitetura, e em troca eles me emprestariam uma placa de desenvolvimento para realizar o trabalho. Eles sairiam ganhando, pois teriam um RTOS livre portado para a plataforma deles, e eu sairia ganhando com a possibilidade de aprendizado. Recebi uma resposta da NXP, que tem um escritório de R&D aqui em São Paulo, e o trabalho com um ARM LPC2138 levou em torno de 3 meses. No fim, acabei aprendendo bastante sobre ARM e RTOS, fiz alguns contatos com a NXP, com a IAR que forneceu o kit e com o desenvolvedor do FreeRTOS, o que possibilitou ainda o desenvolvimento do meu networking.
Além de conhecimentos em sistemas de tempo real, sugiro que estude bastante linux, e em especial linux embarcado. Temos hoje linux rodando em dispositivos tão diversos como relógios, roteadores, set-top-boxes e smartphones. Em especial os smartphones, com os sistemas operacionais linux-based Android(Google), Maemo(Nokia), Moblin(Intel) e LiMo (consórcio de empresas) brigando de frente com a Apple e a Microsoft e seus respectivos sistemas operacionais.
4. Você precisa de uma formação
Conheço muitos hobbystas que são extremamente competentes, até mais do que alguns graduados, pois gostam do que fazem, são auto-didatas e muito inventivos. Mas considero uma formação algo essencial para se desenvolver na carreira, seja em engenharia elétrica ou ciencias da computação. Você não vai aprender tudo em uma faculdade, na verdade vai aprender apenas uma pequena parte. Mas você vai poder desenvolver seu networking, e um diploma, principalmente em uma faculdade conceituada, vai ajudar a abrir muitas portas no mercado de trabalho.
5. Não pare, continue aprendendo e desenvolvendo seu networking!
Não pare no tempo. É bem provável que o que você aprendeu hoje não vai lhe servir no ano que vem!
Os sites que acesso diariamente são o Embedded.com e o Embarcados. Assino as newsletters de players do mercado (NXP, Atmel, Microchip, Freescale, etc), uso o Google Reader para assinar blogs e ler posts de profissionais da área.
Uso também este blog como mecanismo de dissertar sobre algum tema e refrescar minha memória, o que ajuda a fixar conceitos e teorias, e me mantém aprendendo diariamente e interagindo com pessoas da área.
6. Lição final: compartilhe!
De nada adianta você ter capacidade e conhecimento em determinada área, se você não pode compartilhar este conhecimento e experiencia, e aprender com as experiencias de outras pessoas.
Foi com esta idéia que criei o grupo sis_embarcados no Yahoo, e junto com o Diego criamos o Portal Embarcados.
Ninguém mais sobrevive neste mercado sem capacidade de comunicação. Portanto, desenvolva-a, Escreva bastante, leia bastante, e troque experiencias. Faça 1 + 1 ser igual a 3. Nossa comunidade de sistemas embarcados agradece!
Um grande abraço,
Sergio Prado

Faça um Comentário

Navegue
Creative Commons Este trabalho de Sergio Prado é licenciado pelo
Creative Commons BY-NC-SA 3.0.