Como se tornar um desenvolvedor de software embarcado

Em 24/02/2010, em Linguagem C, por sergioprado
Neste post dou algu­mas dicas de como se desen­volver na car­reira de desen­volve­dor de soft­ware embarcado.
Com­par­tilhe!
  • Twitter
  • Facebook
  • LinkedIn
  • del.icio.us
  • Digg
  • email
  • PDF
  • Print

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 2x16 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 3 livros do Jack Ganssle "The Art of Designing Embedded Systems", 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 portal Embedded.com e o LinuxDevices.com, além do Portal 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
VN:F [1.9.0_1079]
Rating: 8.0/10 (3 votes cast)
Como se tornar um desenvolvedor de software embarcado, 8.0 out of 10 based on 3 ratings
Compartilhe!
  • Twitter
  • Facebook
  • LinkedIn
  • del.icio.us
  • Digg
  • email
  • PDF
  • Print

Posts relacionados:

  1. Misra-C — Padrão para software em C
  2. Vídeo: Introdução ao Linux Embarcado
  3. Meld 2.0 para desenvolvedores de linux embarcado

12 Respostas para “Como se tornar um desenvolvedor de software embarcado”

  1. Diego Diego disse:

    Parabéns por mais um ótimo post Sergio.

    Suas dicas estão sendo valiosas tanto para quem está começando quanto para quem já tem exper­iên­cia e começa a ver as coisas de uma ótica diferente.

    Um forte abraço,

    *dS

  2. Rodrigo De Presbiteris Rodrigo De Presbiteris disse:

    Jão, você é o cara.

    Como não é a minha área de desen­volvi­mento, nem me arrisco a ir fundo na leitura de códi­gos téc­ni­cos, mas sobre os con­ceitos que você disse, em geral, serve tam­bém para out­ras áreas de desenvolvimento.

    Ótimo post.

  3. Vitor Bicca Vitor Bicca disse:

    Parabéns. Parabéns pela clareza com que trans­mi­tiste as infor­mações.
    Tra­balho desde 1981 com pro­gra­mação… 8 bits, 16, 32, 64, DOS e Win­dows, e mais recen­te­mente desen­volvi pro­jeto com micro­con­tro­lador HCS08 da Freescale.
    Como sou ini­ciante no desen­volvi­mento de sis­temas embar­ca­dos, real­mente tive van­tagem sig­ni­fica­tiva por con­hecer como fun­ciona o hard­ware.
    A exper­iên­cia em ambi­entes UNIX, no meu caso EDIX, e SCO-UNIX, aju­dou bas­tante tam­bém.
    O con­hec­i­mento de “C” com­bi­nado com as décadas de desen­volvi­mento em COBOL, foi fun­da­men­tal para o sucesso do pro­jeto.
    O que me fal­tou mesmo, foi o con­hec­i­mento de eletrônica, para o pro­jeto das pla­cas.
    Boa Sorte

  4. […] via Como se tornar um desen­volve­dor de soft­ware embar­cado | Blog do Ser­gio Prado. […]

  5. Jeronimo Jeronimo disse:

    Ser­gio, muito bom o seu post. Intu­iti­va­mente venho seguindo algu­mas das suas ori­en­tações e venho me ded­i­cando seri­amente a ser um desen­volve­dor de soft­ware embar­cado. O seu post traz mais ori­en­tações nesse cam­inho e dicas que serão inves­ti­gadas e estu­dadas com atenção. Valeu !!!
    Jeron­imo
    http://www.blogdoje.com.br
    AVR,Arduino & ARM

  6. Marcelo Marcelo disse:

    Ser­gio,

    Parabéns, impres­sio­n­ante a riqueza do con­teúdo e a clareza deste post.

    - Com seu post, tenho agora uma ori­en­tação que posso seguir, o que será de grande valia para meus estu­dos e desenvolvimento.

    - Dividi os prin­ci­pais tópi­cos do seu post, e estarei os usando para auto avali­ação, em qual área pre­ciso mel­hor; hard­ware, software…etc.

    O Livro: Pro­gram­ming Embed­ded Sys­tems in C and C++, já estava lendo e estou gostando.

    Nova­mente parabéns pelo exce­lente post!!!

    Abraços,
    Marcelo Guerra

  7. flavio flavio disse:

    Um link com alguns dos livros recomen­da­dos e com a doc­u­men­tação de uma TCP/IP stack muito usada em sis­temas embar­ca­dos:
    [link moderado]

  8. Sergio Prado Sergio Prado disse:

    Olá Flavio,

    Agradeço pelo comen­tário, mas infe­liz­mente não posso divul­gar seu link, já que infrige os dire­itos autorais dos livros com cópias não autor­izadas dos mesmos.

    Um abraço e con­tinue acom­pan­hando o blog.

    Ser­gio Prado

  9. Marcelo Araujo Marcelo Araujo disse:

    Flávio,

    voce não pode enviar o nome dos livros ao invés de pas­sar esse link ?

    Marcelo

  10. caio átila caio átila disse:

    exce­lente post!

  11. Vinicius Vinicius disse:

    Ser­gio, parabens  pelo post.
    Sou estu­dante de Engen­haria de Com­puta­cao pre­tendo focar minha car­reira em sis­tema embar­ca­dos e Redes. E eh bas­tante moti­vante ler posts (de qual­i­dade) de uma pes­soa que atua nessa area de embed­ded e com­par­tilha com a gente a sua expe­ri­en­cia.
     
    Obrigado!

  12. Ronaldo Z. Afonso Ronaldo Z. Afonso disse:

    Ser­gio,

    Exce­lente post. Adorei as dicas. Vou ten­tar praticá-las.
    Um abraço.

Deixe um comentário