Share

Introdução

O que é Linux Embarcado, Linux Embarcado é a aplicação e uso do kernel Linux em uma placa eletrônica cujo principal elemento é o SoC(System-on-a-chip). SoC é um chip eletrônico que reúne todos os elementos básicos de um sistema computacional como CPU, memória principal(RAM), memória secundaria(ROM/FLASH) e alguns periféricos. Atualmente um SoC contém internamente diversos periféricos dos mais variados tipos como I2C, SPI, UART, CAN, enfim, a lista pode ser enorme. A figura abaixo mostra um típico SoC ARM.

 SoC ARM

O kernel Linux em conjunção com outros softwares são escritos na memória flash ou outra mídia de armazenamento presente na placa, como, por exemplo, um cartão uSD. Esta combinação forma um sistema operacional completo e funcional.

O mesmo Linux que roda em um supercomputador pode rodar também em uma simples placa eletrônica. O que torna isso possível é que o Linux suporta uma grande variedade de arquiteturas e processadores. Mas nem todas essas arquiteturas são de fato usadas em sistemas embarcados. As mais comumente usadas em sistemas embarcados são ARM, PowerPC e MIPS.

Muitas sub-comunidades mantêm seu próprio kernel, com atributos novos e distintos, porém menos estáveis. E em alguns casos, os fabricantes mantêm versões derivadas do Linux oficial para dar suporte para seu hardware específico. Citando alguns exemplos, a Beaglebone Black mantém seu kernel no endereço https://github.com/beagleboard/linux e a Raspberry Pi, no endereço https://github.com/raspberrypi/linux

Arquitetura de um Sistema Linux Embarcado

Os componentes básicos de um Linux Embarcado são:

1. Bootloader

2. Kernel

3. Rootfs

4. Toolchain

O bootloader reside em uma memória de programa protegida em um SoC ou outra mídia de armazenamento presente na placa. Ele usualmente é o primeiro software a rodar depois que se liga a placa ou depois de um reset. O bootloader é responsável por carregar o kernel na memória principal do sistema. Ele pode receber parâmetros de configuração através de arquivo ou linha de comando. E você pode passar parâmetros e comandos ao kernel por meio do bootloader. A figura abaixo mostra o processo de boot de um sistema Linux Embarcado e os elementos básicos que o compõe:

boot de um sistema Linux Embarcado QEMU

O kernel é o Linux em si. Como você deve saber o kernel é responsável por gerenciar todos os periféricos internos ao SoC e fora dele, a memória principal e secundária do sistema, além de oferecer mecanismos de acesso a hardware para softwares em espaço de usuário, através de chamadas de sistema(system calls). Ele coordena todos os processos para que não haja conflitos por recursos do sistema. E muitas outras tarefas.

O rootfs(root file system) é um conjunto de programas e bibliotecas organizadas em uma hierarquia predefinida. Está relacionado intimamente com a ideia que temos sobre distribuições baseadas em GNU/Linux, pelo fato deles proverem programas e bibliotecas já prontos para uso. Por esta razão temos rootfs feitos por distribuições como Debian, Ubuntu, Fedora, Arch e outras. No Debian há ports para ARMEL, ARMHF, MIPS, PowerPC, Sparc, etc. O rootfs pode ser construído e gravado com vários tipos de sistemas de arquivos próprios para memória NAND como cramfs, JFFS2, e muitos outros. Hoje em dia pode-se usar sistemas de arquivos projetados para HDs em memórias FLASH como ext2, ext3 e ext4.

Toolchain

Uma toolchain é um conjunto de softwares de ferramentas de desenvolvimento. Uma toolchain cruzada (como arm-linux-gnueabihf-gcc) roda em um sistema host de uma arquitetura específica, tal como x86, mas produz código binário que executará em uma arquitetura diferente, como ARM, por exemplo. Este processo é chamado de compilação cruzada (cross compile) e é a maneira típica de construir software embarcado.

Uma toolchain pode ser considerada o elemento central de um Linux Embarcado. A partir dela todos os outros elementos serão gerados. Desta forma, se você escolhe uma toolchain cruzada para armhf, bootloader, kernel e todos os softwares terão que ser compiladas para armhf. Você pode criar sua própria toolchain ou baixar uma já existente. Os compiladores do Debian são uma boa escolha porque são estáveis e compactos. Por outro lado construir sua própria toolchain é uma tarefa complexa e às vezes pode ser frustante. Você pode encontrar as toolchains do Debian aqui: http://www.emdebian.org/

Há três conceitos associados com toolchains que você verá constantemente:

  • build machine, é onde a toolchain é criada

  • host machine, é onde a toolchain é executada

  • toolchain, gera os executáveis para determinado alvo

Tipicamente nós usamos algo como uma máquina de construção(build machine) x86, um host x86 e algum alvo(ARM, PowerPC, MIPS). A máquina de construção e o host podem ser Windows ou Mac OS, entretanto é altamente recomendado usar Linux como estação de trabalho. A razão é simples: para ganhar experiência com Linux, não há nada melhor do que usar o próprio Linux para desenvolvimento. Minha recomendação pessoal: use Linux como build machine e host machine.

Construtores de sistemas

Existem softwares que podem construir de maneira automatizada um sistema Linux Embarcado completo. Usando o mesmo esquema de construção do Linux, através de um arquivo .config. A maioria desses sistemas permite a construção do sistema usando uma toolchain indicada por você ou constrói tudo do zero, incluindo a toolchain. Boas escolhas de construtores de sistemas são o Buildroot, Yoctoproject e Ptxdist. Você pode também construir manualmente um Linux Embarcado do zero, mas leva um certo tempo e é bastante complicado. O livro Construindo Sistemas Linux Embarcados explica passo a passo como construir o sistema completo do zero.

Placas com Linux Embarcado

Placas com Linux Embarcado

Em 2013 uma avalanche de novas placas com Linux apareceram no mercado. Muitos com preços atrativos. Antes disso era difícil comprar um placa devido aos altos preços. Não que não existisse nenhuma placa com preço acessível, mas haviam poucas. Por exemplo, Friendly ARM.

Atualmente existem muitas opções e configurações de placas. Entre as mais baratas e com ótimo custo beneficio estão OLinuXino, Cubieboard, BeagleBone Black, Raspberry pi, Wandboard…

Elas são feitas por fabricantes independentes de diferentes partes do mundo. Das novas placas que tem emergido recentemente, a Beaglebone Black foi a que mais se difundiu rapidamente.

A escolha dependerá dos requirimentos do projeto e de seu orçamento disponível. As placas cujo público-alvo são hobistas são geralmente mais baratas. Você pode comprá-las com menos de $100. As placas com maior número de periféricos e mais memória RAM são usualmente mais caras.

Linguagens de Programação

A disponibilidade de ports feitos por distribuições como Debian, Fedora, Arch, etc, torna a programação mais fácil em qualquer linguagem disponível em um Desktop Linux. Por exemplo, é possível programar em C, C++, Java, Perl, Python. Muitos projetos tem sido feitos em Python, devido à facilidade de programação e ao número de bibliotecas disponíveis.

Para cada linguagem é necessário que o compilador seja portado para a plataforma alvo. Por exemplo, se você for utilizar linguagem C na plataforma ARM, é necessário baixar ou construir o compilador que gere executáveis para ARM, o que chamamos de cross compiler ou toolchain. Um dos toolchains mais usadas atualmente para linguagem C cujo alvo é a plataforma ARM, são os da Linaro: http://releases.linaro.org/14.04/components/toolchain/binaries/

Aplicações

O Linux tem se expandido muito no mundo da eletrônica em anos recentes. Em grande parte devido ao Android. Mas não apenas por isso, também por sua maturidade e melhorias nos ports usados em sistemas embarcados como ARM, MIPS e PowerPC. Parece que os desenvolvedores do kernel estão dando mais atenção a sistemas embarcados e novos atributos visando esse segmento tem sido adicionados.

Hoje o Linux é usado em muitos dispositivos eletrônicos, mesmo onde não era usado antes. Exemplos como TVs, geladeiras, Smartphone, receptores de TV por satélite, em automação de carros e assim por diante. É provável que continue crescendo.

Referências


Translate »