sábado, 26 de abril de 2014

O que é Linux Embarcado

Introdução 


Linux Embarcados é 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.



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.

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:

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 de 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 distros 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, squashfs e muitos outros. Hoje em dia pode-se usar sistemas de arquivos projetados para HDs como ext2, ext3 e ext4.

Toolchain


Uma toolchain é um conjunto de softwares de ferramentas de desenvolvimento. Uma toolchain cruzada (como arm-linux-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 considerado 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 seu próprio toolchain ou baixar uma já existente. Os compiladores do Debian são uma boa escolha porque são estáveis e compactas. 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á constatemente:
  • build machine, é onde a toolchain é criada
  • host machine, é onde a toolchain é executada
  • target machine, o alvo para qual a toolchain gera os executáveis

Tipicamente nós usamos algo como uma máquina de construiçã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



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 nenhum placa com preço acessível, mas havia 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 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. Entretanto a maioria ainda é feito em linguagem C.

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, refrigeradores, Smartphone, receptores de TV por satélite, em automação de carros e assim por diante. É provável que continue crescendo.

Referências




Nenhum comentário:

Postar um comentário