Arduino: AVR Cross-Compile com Eclipse IDE

Arduino: AVR Cross-Compile com Eclipse IDE

TLDR; Este tutorial mostra como configurar uma cross-compilação para AVR na IDE Eclipse.

Apesar de não gostar muito do ambiente do Visual Studio, por um bom tempo utilizei o Atmel Studio para desenvolver meus códigos para AVR. Deixei a IDE Eclipse de lado pela facilidade que o Atmel Studio oferece, onde tudo já vem pré-configurado e com um poderoso simulador.

Mesmo utilizando o Atmel Studio por um bom tempo, mantive a preferência pela IDE Eclipse e me fiz percorrer os caminhos das pedras e configurar uma cross-compilação para AVR no Eclipse.

Diz-se cross-compilação, ou cross-compile, quando se está compilando código para um ambiente diferente do qual está sendo realizada a compilação. Por exemplo, compilando código para AVR em com o Windows, ou compilando código para Windows em um ambiente Linux.

A intenção deste tutorial é mostrar os passos para configurar uma cross-compilação manualmente, portanto não vamos utilizar o plugin Eclipse-AVR. Também não vamos abordar a gravação do código com AVRDUDE.

Requisitos

Este tutorial foi desenvolvido em ambiente Windows. É necessário ter instalado Eclipse CDT e WinAVR.

Apesar de ter foco no ambiente Windows, os passos para outras plataformas são equivalentes, mudando apenas a localização dos executáveis, cabeçalhos e bibliotecas.

Criando o projeto

1. File > New > C Project

2. Dê um nome ao projeto, por exemplo “xcompile-avr”

Dê um nome genérico que possa ser identificado facilmente, porque depois que o projeto estiver pronto você poderá criar vários projetos a partir deste.

3. Project type: Executable > Empty project

Criar um projeto em branco. Também pode ser escolhido o Hello World.

3. Toolchains: Cross GCC

Selecione a opção cross-compilação na lista ao lado.

4. Cross compiler prefix: avr-
5. Cross compiler path: C:\WinAVR-20100110\avr\bin;C:\WinAVR-20100110\utils\bin

Estas são as configurações básicas para cross-compilação: o prefixo do compilador (no caso avr-gcc) e os caminhos para o compilador e as ferramentas.

No nosso caso o compilador e as ferramentas estão em diretórios separados, por isso adicionamos os dois, separados por ponto e vírgula. Em C:\WinAVR-20100110\avr\bin está o compilador e em C:\WinAVR-20100110\utils\bin estão ferramentas que auxiliam o compilador, como o executável make.

O projeto está criado!

Para testar a configuração criamos um arquivo main.c com com seguinte código

/* main.c */
 #include <avr/io.h>

int main(void) {
    for(;;) {}
    return 0;
}

Geralmente o compilador é capaz de encontrar os cabeçalhos e bibliotecas padrão por si próprio, conseguindo compilar o código acima com sucesso. Se esse não for o seu caso veja abaixo como configurar o projeto para encontrar os cabeçalhos e bibliotecas do compilador.

Ao compilar vemos que o cabeçalho avr/io.h gerou um aviso dizendo o tipo do microcontrolador não foi definido.

C:\WinAVR-20100110\avr\include/avr/io.h:404:6: warning: #warning “device type not defined”

Para definir qual o microcontrolador basta criar no projeto a constante correspondente. Por exemplo, para o ATmega328P (Arduino Uno) deve-se definir __AVR_ATmega328P__ e para o ATmega2560 (Arduino Mega 2560) define-se __AVR_ATmega2560__.

Esta constante definimos nas propriedades de compilação do projeto.
Project > Properties > C/C++ Build > Settings > Cross GCC Compiler > Symbols > Defined symbols (-D) > Add… > __AVR_ATmega328P__
Esta constante, ou símbolo, será definida diretamente na linha de comando do compilador.

Compilando novamente o aviso não é gerado.

Teste agora o código a seguir.

/* main.c */
#include <avr/io.h>

#define LED_CONFIG() DDRB |= (1 << DDB5)     /* Pin 13 OUTPUT */
#define LED_ON()     PORTB |= (1 << PORTB5)  /* Pin 13 HIGH   */
#define LED_OFF()    PORTB &= ~(1 << PORTB5) /* Pin 13 LOW    */

int main(void) {
    /* config */
    LED_CONFIG();

    /* loop */
    for(;;) {
        LED_ON();
    }
    return 0;
}

Encontrando os cabeçalhos e bibliotecas

Se por acaso o compilador se recusar a compilar o código acima reclamando cabeçalho não encontrado ou referência não definida será preciso seguir os passos abaixo.

Precisamos configurar o projeto para que ele indico ao compilador onde buscar os cabeçalhos e as bibliotecas.

1. Project > Properties > C/C++ Build > Settings

Aqui ficam as configurações de compilação do seu projeto.

2. Cross Settings

Aqui estão as configurações de cross-compile que definimos quando criamos o projeto. Caso precise modificar alguma coisa basta vir aqui.

3. Cross GCC Compiler > Includes > Include paths (-l) > Add… >

C:\WinAVR-20100110\avr\include
C:\WinAVR-20100110\lib\gcc\avr\4.3.3\include
C:\WinAVR-20100110\lib\gcc\avr\4.3.3\include-fixed

4. Cross GCC Linker > Libraries > Libraries search path (-L) > Add… >

C:\WinAVR-20100110\avr\lib

Agora tente compilar novamente.

Concluindo

Mais vale um cross-compile na mão do que duas VMs travando.

Curta e compartilhe se gostou do tutorial.

Dúvidas ou sugestões? Deixe um comentário abaixo!

E na hora da prova não esqueça caneta, lápis, calculadora e o conteúdo.

 

Djones

Deixe uma resposta