domingo, 13 de abril de 2014

Linguagem C para Linux Embarcado

A linguagem C para Linux Embarcado não é muito diferente da linguagem C para Linux Desktop, quando você programa software. Mas quando o assunto é programação de device drivers para Linux Embarcado existem mudanças significativas. Embora a programação de software para Linux Embarcado e Linux Desktop sejam semelhantes em muitos aspectos, ainda há pequenas diferenças a considerar.

Compilador para Linux Embarcado


O compilador usado vai depender da arquitetura do SoC(System-on-a-chip) escolhido. As plataformas ou arquiteturas mais utilizadas em Linux Embarcado atualmente é ARM, PowerPC e MIPS. Também é usado às vezes o x86 da intel. Você precisa compilar ou baixar uma variante do gcc para o alvo especifico. É o que chamamos de compilador cruzado ou toolchain. Então para ARM nós teríamos algo como arm-linux-gcc. Para MIPS, mips-linux-gcc. E assim por diante.

O Debian GNU/Linux é uma ótima distribuição que disponibiliza de graça compiladores para diversas plataformas. Existem compiladores para arquiteturas que provavelmente você nunca ouviu falar como SPARC, S390 e Hppa. Visite: http://www.emdebian.org/tools/crosstools.html.

Em nível de aplicativo você pode programar em linguagem C e muitas outras linguagens como C++, Java, Perl, Python, Lua e outras. Existem muitos projetos e bibliotecas em Python para Linux Embarcado.

Bibliotecas para desenvolvimento de software


Um grande problema na programação de Linux Embarcado é encontrar as bibliotecas de desenvolvimento para a plataforma que você escolheu. Se não existem você precisa fazer a compilação cruzada. E isso é um problema ainda maior quando uma biblioteca depende de outra, e de outra, num processo que parece não ter fim. Eu passei por isso, é muito ruim, e perde-se muito tempo!

Novamente o Debian GNU/Linux pode te salvar! Ele tem uma grande disponibilidade de pacotes para vários ports. Além de bibliotecas de desenvolvimento, ele tem também muitos aplicativos. Em especial para a plataforma ARM. Por isso você pode até rodar o Debian dentro do Android. 

Programação de Device Drivers


No Linux há três camadas de software distintas nas quais se tem diferentes niveis de acesso dentro kernel. A camada mais baixa e de maior nivel de acesso é a dos plataform drivers. O segunda com nivel de acesso intermediario é a de device drivers. A terceira e última é a camada de aplicativos. A nível de device drivers e platform drivers só é possível programar em linguagem C.

Outros dois conceitos usados na programação de Linux e que estão relacionados a divisão da memoria principal(RAM) em duas regiões são o kernel space(espaço de kernel) e o user space(espaço do usuário). As duas primeiras camadas plataform driver e device drivers são do kernel space. A camada de aplicativos é do user space.


O kernel space é onde o Linux executa e provém seus serviços, e onde os device drivers residem. Já o user space é a região de memoria onde os processos de usuários são executados. O kernel space pode ser acessado por processos de usuário somente através do uso de system calls(chamadas de sistema).

Do ponto de vista de camadas, se tomarmos como exemplo uma memoria EEPROM at24cxx acessada através de barramento I2C:
camada: I2C plataform driver (geralmente fornecida pelo fabricante)
2º camada: I2C device driver at24.c
3º camada: O software em espaço de usuário para ler e escrever a memória

O código fonte para um platform driver é dependente de arquitetura e de fabricante. Significa que um I2C platform driver para os processadores i.MX da Freescale não serve para os processadores AM335x da Texas Instruments e vice-versa. Por outro lado, o device driver at24.c roda em qualquer plataforma que tenha uma funcionalidade mínima, fornecida pelo plataform driver. Vou explicar isso com mais detalhes em outro artigo.

Desenvolvimento de Device Drivers para Android


O desenvolvimento de device drivers para Android é em muitos casos semelhante a programação de device drivers para Linux. Porque a camada mais baixo do Android é o próprio Linux. Porém, o Linux usado no Android, não corresponde exatamente ao Linux oficial. O kernel do Android tem, por exemplo, um gerenciamento de energia(Power Magagement), totalmente novo, direcionado para dispositivos portáteis cuja fonte de alimentação é uma bateria. E outros subsistemas do kernel Linux foram reescritos e outros foram criados do zero.




A programação de driver para Android envolve desenvolver/portar drivers para perifericos escolhidos que já tenham suporte na Pilha do Android. Alguns desses dispositivos são:
  1. GPS
  2. Camera
  3. Módulo GSM/GPRS
  4. Dispositivos USB
  5. Cartão de memoria SD
  6. Bluetooth
  7. Audio
  8. WiFi
  9. LCD e Touch Screen

Nenhum comentário:

Postar um comentário