fig

Compilador GCC cruzado usando Newlib (para microcontroladores)

agosto 1, 2014 - Linguagem C / Microcontroladores / Programação

Os passos a seguir visam compilar uma versão do GCC e dos utilitários binários para gerar código para microcontroladores, como por exemplo ARM-Cortex (STM32), MIPS (PIC32) ou M68K (Coldfire). Como não há um sistema operacional alvo, vamos utilizar a biblioteca Newlib, que é uma versão do libc otimizada para uso com microcontroladores.

Esse processo pode ser realizado em sistemas operacionais baseados no Unix (Linux e MacOS X) ou no Windows, usando o MinGW. No caso do MacOS, recomendo que seja instalado o GCC através de algum utilitário de pacotes (como o macports) ao invés de usar o XCode da Apple.


Passo 1 – Instalar o GCC e bibliotecas auxiliares

Geralmente para isso basta um comando do tipo

Veja que é preciso instalar os pacotes GMP, MPFR e MPC, que serão necessários para compilar o GCC. Se o seu sistema de pacotes não possuir os binários já compilados, você precisará compilá-los um por um.


Passo 2 – Baixar os fontes

Você deverá baixar e descompactar os fontes dos binutils, do GCC e do Newlib. Você pode tentar usar as versões mais recentes de cada pacote, mas pode ser necessário tentar com uma versão anterior, se ocorrer algum problema de compatibilidade.

GNU Binutilshttp://ftp.gnu.org/gnu/binutils/

GNU GCChttp://ftp.gnu.org/gnu/gcc/

Redhat Newlibftp://sourceware.org/pub/newlib/index.html

Crie um diretório para conter cada código-fonte e dentro dele também um diretório /build ou /make para os arquivos compilados, para evitar misturá-los com os arquivos fonte.


Passo 3 – Compilar!

Defina o processador/sistema alvo e o diretório de instalação em duas variáveis de ambiente, pois todos os pacotes vão utilizá-los.

O local de instalação é arbitrário, mas eu prefiro usar o padrão /usr/local, o que evita a necessidade de adicionar caminhos às variáveis de ambiente. Você pode compilar várias versões do GCC para vários processadores: os nomes não serão sobrepostos, pois os programas gerados terão nomes do tipo mips-none-elf-as ou arm-none-eabi-gcc, que não entrarão em conflito com os utilitários ou o compilador nativo gcc.

Compilar o binutils para o processador desejado é bem simples, apenas entre no diretório /build criado dentro da pasta com os fontes e execute o usual configure/make/make install,

Se tudo correr bem, os programas terão sido instalados e um comando como

vai retornar uma informação de versão.

No caso do compilador C, o processo é um pouco mais complexo. Inicialmente você deve criar um compilador “startup“, que será usado para compilar o newlib:


Passo 4 – Compilar newlib e o compilador final

Uma vez criado o compilador básico, vamos utilizá-lo para compilar a biblioteca newlib, incluindo a opção SMALL_MEMORY para otimização com microcontroladores.

Agora que a biblioteca libc está criada, podemos gerar a versão final do compilador GCC. Voltando novamente ao diretório fonte do GCC,completamos o processo de compilação,

Quando bem sucedido, o compilador estará instalado e você pode testar o ambiente usando, por exemplo para o MIPS:

que vai mostrar o código gerado para um pequeno programa em C.

Uma observação a respeito do Windows: é comum que o processo de compilar o GCC dentro do MinGW seja interrompido em algum momento por um erro de falta de memória. Nesse caso, repita o comando make original quantas vezes for necessário; como o processo de montagem é incremental, após um número de tentativas o resultado final será conseguido.


Opcional – Compilar o Depurador (GDB)

Embora não seja essencial, para se trabalhar com o compilador cruzado é também muito interessante ter uma versão do depurador, com capacidade para emular a execução do código gerado em sua arquitetura. Para compilar o depurador, baixe o código fonte em

http://ftp.gnu.org/gnu/gdb/

Instale a biblioteca libtinfo para compilar o GDB:

Compile o depurador da mesma forma que os demais programas,

Boa diversão!

Deixe um comentário

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">