Learning   Examples | Foundations | Hacking | Links

Proceso de compilación de Arduino

Introducción

Bastantes cosas suceden antes de que tu código de Arduino se meta en tu placa Arduino. Primero, el entorno de Arduino lleva a cabo algunas pequeñas transformaciones para asegurarse que el código es formalmente correcto para C o C++(dos lenguajes de programación conocidos). Después pasa al compilador (avr-gcc), que trasforma el código legible por el ser humano a instrucciones legibles para la máquina (llamados ficheros objeto). Entonces este codigo se combina (se "linkea" contra) las librerías estándar de Arduino que implementan las funciones básicas como digitalWrite() o Serial.print(). El resultado es un único archivo hexadecimal Intel, que contiene los bytes necesarios para ser guardados en la memoria de programas del chip de la placa Arduino. Este archivo entonces se graba en la placa: transmitiéndolo vía USB o puerto serie, a través del bootloader que lleva incorporado el chip o con hardware de programación externo.

Sketches Multi-archivo

Un sketch puede contener múltiples archivos (pestañas). Para manejarlas, haz clic en la flecha de la derecha justo encima del las barras de desplazamiento cerca de la parte superior del entorno. Las pestañas tienen una de las siguientes extensiones, .c, .cpp o .h, si se proporciona otro tipo de extensión esta sera convertida a un añadido al nombre sustituyendo el punto por guión bajo), Cuando un sketch es compilado, todas las pestañas sin extensión serán concatenadas juntas para formas el archivo principal del scketch. Las pestañas con .c o .cpp se compilaran por separado. Para usar pestañas con extensión .h necesitas incluirlo (#include usando "comillas dobles" en vez de <mayor/menor que>).

Cambios en el archivo principal del sketch

El entorno de arduino lleva a cabo unos cambios en archivo principal del sketch (la uniono de todas las pestañas en el sketch que no tienen extensión) antes de pasarlo al copilador avr-gcc.

Primero, añade #include "WProgram.h" al inicio del sketch. Esta cabecera (ubicada en <ARDUINO>/hardware/cores/<CORE>/) incluye todas las definiciones necesarias del núcleo Arduino estándar.

A continuación, el entorno busca las definiciones de las funciones dentro del sketch y crea las declaraciones (prototipos) para las mismas. Estas son insertada después de cualquier comentario inicial, o llamadas al preprocesador (#includes y #defines) pero antes de cualquier otra instrucción (incluyendo las declaraciones de variables). Esto significa que si quieres usar un tipo de variable definida por ti como argumento en una función, la deberás declarar en un archivo de cabecera aparte. Además, este paso no es perfecto, no creara prototipos para funciones que tengan argumentos con valores por defecto, o que estén dentro de un espacio de nombres o clase.

Por ultimo, los contenidos del archivo main.cxx de la plataforma objetivo, se copian al final de tu sketch.

Plataformas objetivo

El entorno de Arduino soporta multiples plataformas objetivo con diferentes chips, (actualmente solo AVRs), velocidad de CPU, o bootloaders. Estas están definidas en una tabla dentro del [[Hacking/Preferences | archivo de preferencias]. Dentro de la variables mas importantes incluye:

<BOARD>.name: El nombre a enseñar en el menú de Placas

<BOARD>.build.mcu: El microcontrolador de la placa(normalmente "atmega168" o "atmega328p").

<BOARD>.f_cpu: La velocidad del reloj a la que el microprocesador funciona, (normalmente "16000000L", o si es un ATmega168 usando su reloj interno "8000000L")

<BOARD>.core: en que subdirectorio se encuentra el directorio hardware/cores/ contra los que vincular los sketches (normalmente "Arduino").

Igualmente útiles pueden ser estos parámetros en el archivo de preferencias generales preferences.txt:

build.verbose: enseñar o no los mensajes de depuración cuando se compila un sketch (ej. false). Si lo definimos a "true·, enseñara los comandos completos que se vayan ejecutando como parte del proceso de compilación.

Nota: a partir de Arduino 004 y posteriores, el parámetro build.extension esta en desuso - el archivo principal del sketch siempre es tratado como un archivo .cpp .

Proceso de compilación

Los Sketches son compilados por avr-gcc.

La ruta de "includes", incluye el directorio del sketch, el directorio de la plataforma objetivo (<ARDUINO>/hardware/core/<CORE>/) y el directorio de "includes" de avr (<ARDUINO>/hardware/tools/avr/avr/include/), al igual que cualquier directorio de librerías en (in <ARDUINO>/hardware/libraries/) cuya cabecera haya sido incluido en el sketch.

Cuando se verifica un sketch ("Run"), se compila en un directorio temporal dentro del directorio temporal del sistema (ej. /tmp en MacOSX). Cuando se graba en la placa, este se compila en el subdirectorio applet/ dentro del directorio del sketch. (al cual puedes acceder con "Ver directorio del sketch" en el menú "Sketch" del entorno)

Los archivos .c y .cpp de la plataforma objetivo son compilados y generan archivos .o en su directorio, al igual que el archivo del sketch y cualquier otro archivo .c o .cpp en cualquiera de las librerías que hayamos incluido en el sketch.

Estos archivos .o entonces son enlazados ("linked") entre ellos en una librería estática y el sketch es enlazado a esta librería. Solo las partes utilizadas de esta librería son incluidas en el archivo binario .hex resultante reduciendo así su tamaño.

El archivo .hex es el resultado final de la compilación y sera cargado en la placa.

Proceso de carga

Los Sketches son cargados por avrdude.

El proceso de carga esta también controlado por variables en los archivos de preferencias principal y de la placa. En los archivos de preferencia de la placa ("board") se incluye:

<BOARD>.upload.protocol: El protocolo que debe usar avrdude para hablar con la placa (normalmente "stk500").

<BOARD>.upload.speed: la velocidad (baudios por segundo) que avrdude debe usar para cargar el sketch (normalmente "57600").

<BOARD>.upload.maximum_size: El tamaño máximo de un sketch en la placa. (depende del chip y el tamaño del bootloader).

Y en el archivo principal de preferencias ("main"):

upload.verbose: si se debe o no mostrar los mensajes de depuración al cargar un sketch en la placa (por defecto "false").

Share