Compilação Cruzada

A compilação cruzada ocorre quando um dispositivo compila um código fonte para uma plataforma diferente daquela que compilou o código, geralmente temos um ambiente de desenvolvimento que está em uma arquitetura diferente da arquitetura da placa em que vamos rodar nosso programa. Para que nossos notebooks ou desktops possam gerar um binário, programa que rode em outra arquitetura, acontece o Cross Compile (Compilação Cruzada, da tradução direta do inglês). Por exemplo, em nosso caso, um computador com Linux Ubuntu, utilizando um processador Intel ou AMD com arquitetura x86, irá compilar um código para o computador embarcado rodando um sistema Linux adaptado rodando em uma arquitetura completamente diferente.

Utilizar a compilação cruzada para trabalhar com sistemas embarcados é muito comum, principalmente quando estes não possuem capacidade de processamento para suportar um compilador. Para nós seria possível compilar no próprio sistema embarcado, porém, apesar de os recursos não serem tão limitados assim, não queremos desperdiça-los. Além disso programar em um computador regular com a disposição de diversos tipos de IDE diferentes é muito melhor do que programar em um computador embarcado com recursos de interface limitadas.

Para realizarmos esse processo de compilação cruzada precisamos primeiro obter um software development kit, também conhecido como Kit de desenvolvimento de software, SDK ou devkit. O SDK nada mais é que um conjunto de ferramentas de desenvolvimento de software que possibilita a criação e compilação dos softwares para um sistema diferente.

Instalando o SDK

Nota

O projeto Yocto oferece um tutorial de como obter e instalar o SDK para seu sistema na página do GitHub Cross Compile with Yocto SDK. Todavia, todos os procedimentos realizados e os resultados obtidos na instalação serão descritos nesse tópico.

Para obter o SDK para a imagem do sistema operacional que estamos utilizando basta executar os procedimentos a seguir:

  1. Criação dos diretórios

Criaremos um diretório chamado workspace onde você não apenas instalará o SDK, mas também compilará o código de exemplo. Escolha um local conveniente para você e execute os comandos.

$ mkdir workspace
$ cd workspace
$ wget http://gumstix-yocto.s3.amazonaws.com/sdk.sh
../../../_images/sdk_download.png

Nota

O comando wget irá efetuar download do SDK para sistemas Gumstix. Esse processo pode demorar um pouco, a depender da sua velocidade de download.

  1. Verificando as permissões

Após o fim do download, verifique as permissões do arquivo executando o comando ls -la sdk.sh. Se o terminal retornar que há permissão para executar este arquivo, pule para o próximo procedimento. Caso contrário, será necessário alterar as permissões do arquivo através do comando chmod.

Nota

Relembrando, os três primeiras espaços indicam as permissões do dono e, basicamente, temos 3 permissões básicas, «r», «w» e «x» indicando permissão para leitura, escrita e execução, respectivamente.

Por exemplo, na imagem abaixo, o arquivo possui permissão para leitura e escrita, mas não pode ser executado.

../../../_images/sdk_permission.png

Para adicionar a permissão para execução, basta executar o comando chmod +x sdk.sh.

../../../_images/sdk_permission2.png
  1. Instalação

Para iniciar a instalação, execute o arquivo sdk.sh. Assim que solicitado, digite o diretório que deseja instalar o SDK (recomendamos a criação de um repositório chamado sdk) e confirme.

$ ./sdk.sh
../../../_images/sdk_install.png
  1. Configurando o ambiente

A instalação do SDK irá gerar uma pasta com o conteúdo apresentado na figura abaixo.

../../../_images/sdk_ls.png

Nota

O diretório «sysroot» contém os arquivos raiz dos dois sistemas, tanto do sistema que irá compilar o código quanto do sistema que irá executar o programa, e o primeiro arquivo da lista importa os endereços e variáveis importantes para a compilação do código.

Para podermos prosseguir com a compilação do código é necessária a execução da seguinte linha de comando:

source sdk/environment-setup-cortexa8hf-neon-poky-linux-gnueabi
../../../_images/sdk_source.png

Compilando Hello World

Uma vez realizada a instalação, podemos testar a compilação cruzada criando um simples script. Vamos criar um arquivo no editor de texto chamado helloworld.c, colar o código abaixo e salvar no diretório workspace.

#include <stdio.h>
int main(void)
{
printf ("Hello World!\n");
return 0;
}

Agora podemos executar o comando make <nome_do_código> para criar um arquivo binário executável do helloworld.c.

../../../_images/sdk_compile.png

Nota

O comando «make» é na verdade a simplificação de uma extensa linha de comando que chama um compilador arm-poky-Linux-gnueabi-gcc e dá a ele os parâmetros contidos na pasta SDK. Tudo isso graças ao comando «source» utilizado anteriormente.

Uma vez obtido o executável do código basta copiá-lo para uma das pastas do cartão de memória transferi-lo para o Overo e executá-lo. Lembre-se que o diretório principal é o diretório /home/root/, então se o arquivo for colocado dentro deste diretório será bem fácil encontra-lo.

Depois de inserido o cartão de memória no Overo, podemos inicia-lo normalmente. Quando iniciado, vamos até o diretório em que o programa foi salvo e o executamos com o comando ./nome_do_código. Se tudo ocorrer bem, o programa deverá ser executado, similar a figura abaixo.

../../../_images/sdk_compile2.png

Referências

  • PITA, H. C. Desenvolvimento de sistema de comunicação multiplataforma para veículos aéreos de asa fixa. Faculdade de Tecnologia, Universidade de Brasília, 2018.
  • Cross Compile with Yocto SDK - github.com/gumstix