Como se tornar um desenvolvedor de Linux embarcado

- por Sergio Prado

Categorias: Carreira, Linux Tags: , ,

No começo de 2010 escrevi um post com algumas dicas de como se tornar um desenvolvedor de software embarcado. O post foi um sucesso e esta entre os mais acessados do blog.

Me parece que as pessoas buscam por informações que não se encontram facilmente em qualquer livro ou site na internet. Mais uma vez, tenho recebido inúmeros e-mails e mensagens de pessoas querendo aprender ou se aprofundar em Linux embarcado. São iniciantes na área ou profissionais com anos de experiência em sistemas embarcados, mas que querem conhecer ou se aprofundar em Linux.

Sejam motivados pelo hype criado pela plataforma Android, por necessidades profissionais, por curiosidade, ou até pelos meus posts sobre o kit FriendlyARM mini240, sinto que existe uma lacuna a ser preenchida para formar profissionais capacitados à trabalhar com Linux embarcado.

Esse interesse me motivou a escrever este post com algumas dicas de carreira para quem pretende aprender sobre Linux Embarcado. É claro que, assim como escrevi no outro post, o que descreverei aqui é a minha visão, baseada nas minhas experiências, e naquilo que deu certo para mim. Adapte o que for necessário de acordo com suas necessidades, possibilidades e objetivos de carreira.

Não falarei neste artigo sobre habilidades essenciais para um desenvolvedor de software embarcado, como conhecer o hardware, assembly, C/C++, etc. Isso já foi falado no artigo anterior. Nosso foco aqui será Linux embarcado.

Pronto para começar? Prometo que não irá se arrepender! :)

Passo 0: Respire Linux

Guarde bem essa dica, será a mais importante que darei a você!

Comecei a trabalhar com Linux Embarcado a mais ou menos 4 anos, mas já usava Linux muito antes disso. Existem literalmente milhares de distribuições Linux disponíveis, escolha uma. Eu já testei várias, dentre elas Conectiva, Fedora, Slackware, Debian e Gentoo. Nos últimos dois anos tenho usado Ubuntu, que me agrada tanto como usuário comum, quanto como desenvolvedor.

Aqui vale uma observação: o termo Linux é usado genericamente para expressar o sistema operacional completo, mas na verdade Linux é apenas o kernel. O papel das empresas que criam distribuições Linux é empacotar o kernel com bibliotecas, aplicações e outros pacotes adicionais como sistema de gerenciamento de pacotes, interfaces gráficas, etc.

Se você usa Windows em tudo que faz, migrar de uma vez para Linux pode te trazer alguns traumas, fazendo você desistir em pouco tempo. Instale-o como dual-boot na sua máquina, e comece a usá-lo aos poucos.

Em algumas semanas verá que tudo que você faz em Windows, você consegue fazer em Linux. Mais ainda, verá que você consegue ser muito mais produtivo e eficiente usando Linux.

Duas ótimas referências de estudo para iniciantes em Linux são o Guia Foca GNU/Linux e Entendendo e Dominando o Linux. Procure entender a estrutura de diretórios, comandos do prompt, gerenciamento de usuários, instalação de aplicações, configuração de hardware, configuração de redes e serviços, etc.

Tente se transformar em um usuário avançado de Linux, resolvendo a maioria dos problemas através da linha de comando. Desta forma, você começará a absorver a filosofia Unix por trás do sistema operacional, que resumidamente diz que programas devem “fazer apenas uma coisa, e fazer bem”.

Lembre-se: se você esta começando, terá dificuldades, então é importante ser muito resiliente. Será “apanhando” bastante que você irá se desenvolver nessa área. Seja curioso, pergunte ao oráculo (Google), visite forums na Internet (existem milhares). Você verá que resolver problemas enquanto aprende será muito divertido.

E assim que começar a se sentir confortável com o sistema operacional, você pode partir para programação em Linux.

Passo 1: Programe em Linux

Comece compilando algumas aplicações na sua máquina (ainda não estamos falando de compilação cruzada para seu dispositivo embarcado). Entenda o sistema de build do GNU e aprenda a usar o compilador gcc e a criar arquivos Makefile.

É bom também ler sobre o universo do software livre e do software open source (não misture, pois são coisas diferentes). Você precisa entender os impactos do tipo de licença das aplicações open-source que pretende usar no seu dispositivo embarcado.

Existem vários livros disponíveis para aprender a programar em C para Linux. “Beginning Linux Programming” e “The Art of UNIX programming” são ótimos para iniciantes. Para ir mais afundo, temos o “Advanced Programming in the UNIX Environment” e o “The Linux Programming Interface“, que inclusive escrevi uma resenha neste post aqui.

Neste tópico tem muita informação para absorver, mas você não precisa decorar cada função da biblioteca glibc ou cada chamada da API do kernel. Procure entender os conceitos principais, como trabalhar com arquivos, aplicações multithread e sincronização, mecanismos de comunicação entre processos, segurança e programação para redes.

Além da linguagem C, você precisará saber desenvolver em shell script, já que uma parte do trabalho de um desenvolvedor de Linux embarcado é preparar os scripts de boot do equipamento. Para desenvolver em shell script, existem vários recursos disponíveis na internet como o Linux Shell Scripting Tutorial e o BASH Programming. Alem disso, você pode sempre perguntar ao Google. Um guia de referência rápida que sempre uso é o Canivete Suiço do Shell.

De preferência, aprenda mais uma linguagem interpretada como Python ou Perl. Estas linguagens podem facilitar sua vida em diversas tarefas. Na empresa em que atuo, temos um ambiente de compilação cruzada totalmente desenvolvido por nós em Python. Usamos Python também para automatizar alguns testes do firmware dos nossos equipamentos.

É claro que poderá levar alguns anos para você adquirir certa proficiência em programação para Linux, mas em algumas semanas já estará preparado para entrar no universo do Linux Embarcado.

Passo 2: Estude Linux embarcado

É aqui que a brincadeira começa a ficar divertida. É onde aprendemos a desenvolver um sistema Linux para embarcar em nosso equipamento.

Você precisa aprender conceitos sobre como preparar um ambiente de compilação cruzada, configurar o bootloader, compilar o kernel, gerar um rootfs reduzido, trabalhar com memória flash e sistemas de arquivos para embarcados (JFFS2, YAFFS, CRAMFS, etc), gerar uma imagem, gravar no equipamento, etc.

Na minha opinião, os dois melhores livros que tratam deste assunto são o “Building Embedded Linux Systems” e o “Embedded Linux Primer” (já estudei pelos dois, e achei o segundo melhor).

Ainda não estamos falando em alterar o kernel para suportar a sua placa (vamos falar disso no passo 3). Boa parte do hardware disponível no mercado suporta Linux embarcado, o que significa que ele já tem um kernel portado com todos os device drivers necessários para colocar um sistema Linux em funcionamento.

Já que estamos falando de hardware, aqui é o momento ideal para você comprar um kit de desenvolvimento para colocar a mão na massa. A Raspberry Pi e a Beaglebone Black são duas plataformas bastante amigáveis, com muita documentação e ótima relação custo-benefício.

O Ebay é o melhor lugar para comprar kits mais baratos (mesmo com os impostos que devem ficar em torno de 60%). O problema é que pode demorar até 2 meses para chegar. Apenas tome cuidado para escolher um vendedor com boas avaliações.

Se você esta com pressa em receber o kit, você também pode adquirir a Beagleboard na Loja Virtual do Laboratório de Garagem, e como a renda deles é toda revertida para o espaço do Laboratório de Garagem (disponível de graça para qualquer pessoa), você acaba também ajudando a comunidade!

Com o kit de desenvolvimento, o livro “Embedded Linux Primer”, bastante disciplina e vontade de aprender, tenho certeza que você irá adquirir ótimos conhecimentos em Linux Embarcado.

Passo 3: Kernel e device drivers

Não são todos que chegarão a este nível, já que este é um trabalho especializado e, principalmente no Brasil, escasso de oportunidades de trabalho. Durante minha carreira como desenvolvedor de Linux Embarcado, trabalhei pouco com desenvolvimento de drivers de dispositivo. Mas isso não significa que você não precisa aprender, afinal conhecimento nunca é demais. E nunca se sabe quais oportunidades podem aparecer para você.

É aqui que descemos ao nível do hardware. Conforme já falei, os principais hardwares de mercado suportam Linux. Mas se você pegar um hardware sem suporte a Linux, precisará desenvolver dois trabalhos distintos:

  1. Portar o kernel para seu equipamento, trabalho também chamado de desenvolvimento de BSP (Board Support Package).
  2. Desenvolver os device drivers.

Divertido, não? Mas é também um trabalho bastante complexo, e vai exigir muito mais conhecimento do que o adquirido até aqui.

Existem alguns bons livros sobre o desenvolvimento do kernel do Linux, dentre eles “Understanding the Linux Kernel” e “Linux Kernel Development“. Tenho boas referências destes dois livros, apesar de ainda não ter lido nenhum deles. Por enquanto minhas consultas relativas ao kernel tem sido feitas na Internet mesmo.

Os dois principais livros que conheço sobre desenvolvimento de device drivers em Linux são “Linux Device Drivers” e “Essential Linux Device Drivers“.

Minha escolha vai para o “Essential Linux Device Drivers”, que é mais focado no desenvolvimento de device drivers para sistemas embarcados, e possui exemplos práticos com RTC, I2C, 1-Wire, USB, MTD, interfaces touch, etc.

Cursos no Brasil

Muitas pessoas não são autodidatas por natureza, e muitas vezes procuram por cursos para introduzí-las em determinado assunto. É lógico que não será um curso de 40h em Linux embarcado que te transformará num expert no assunto. Mas poderá te dar as coordenadas para seguir os estudos.

Para aprender Linux em geral eu aconselho os cursos da 4Linux.

Para cursos de Linux embarcado, você pode dar uma olhada no treinamento ministrado pela minha empresa, a Embedded Labworks. Para mais informações, clique aqui.

Não deixe a peteca cair

Já disse outras vezes no meu blog, mas acho que vale a pena repetir. O processo de aprendizado é continuo, não tem fim, e uma importante parte deste processo é compartilhar seus conhecimentos.

A própria comunidade Linux é uma prova da importância de dedicar parte de seu tempo para ajudar outras pessoas, em troca da ajuda que você teve quando estava iniciando. Desde 1991, com a dedicação de milhares de programadores ao redor do mundo, o sistema operacional Linux cresceu para se tornar o mais usado do mundo em termos de abrangência.

Então, que tal deixar também sua contribuição?

Um 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.