Saltar al contenido

¿Se compilará un .ino Arduino Sketch directamente en GCC-AVR?

Solución:

Vea mi respuesta aquí: Clases y objetos: ¿cuántos y qué tipos de archivos necesito realmente para usarlos? – específicamente: cómo el IDE organiza las cosas.

Sé que como mínimo tienes que incluir el archivo de encabezado de Arduino

Sí, tendrías que hacer eso.

pero más allá de eso, ¿qué causaría un error de compilación si compilara dicho archivo .ino a .cpp usando, digamos, por ejemplo GCC-AVR?

El IDE genera prototipos de funciones para usted. El código en un archivo .ino puede necesitar esto o no (probablemente lo hará a menos que el autor sea lo suficientemente disciplinado para codificar en la forma habitual de C ++ y hacerlo él mismo).


Si el “boceto” contiene otros archivos (por ejemplo, otros archivos .ino, .co .cpp), entonces estos deberían incorporarse en el proceso de compilación como describo en mi respuesta mencionada anteriormente.

También necesitaría (compilar y) vincular en cualquier biblioteca utilizada por el boceto.


No ha preguntado sobre el lado de la vinculación de las cosas, pero, naturalmente, los diversos archivos, tal como se compilan, deben vincularse entre sí y luego convertirse en un archivo .elf y .hex para fines de carga. Vea abajo.


Ejemplo de archivo MAKE

Basado en la salida IDE, hice un archivo MAKE simple hace un tiempo:

#
# Simple Arduino Makefile
#
# Author: Nick Gammon
# Date: 18th March 2015

# where you installed the Arduino app
ARDUINO_DIR = C:/Documents and Settings/Nick/Desktop/arduino-1.0.6/

# various programs
CC = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-gcc"
CPP = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-g++"
AR = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-ar"
OBJ_COPY = "$(ARDUINO_DIR)hardware/tools/avr/bin/avr-objcopy"

MAIN_SKETCH = Blink.cpp

# compile flags for g++ and gcc

# may need to change these
F_CPU = 16000000
MCU = atmega328p

# compile flags
GENERAL_FLAGS = -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=$(MCU) -DF_CPU=$(F_CPU)L -MMD -DUSB_VID=null -DUSB_PID=null -DARDUINO=106
CPP_FLAGS = $(GENERAL_FLAGS) -fno-exceptions
CC_FLAGS  = $(GENERAL_FLAGS)

# location of include files
INCLUDE_FILES = "-I$(ARDUINO_DIR)hardware/arduino/cores/arduino" "-I$(ARDUINO_DIR)hardware/arduino/variants/standard"

# library sources
LIBRARY_DIR = "$(ARDUINO_DIR)hardware/arduino/cores/arduino/"

build:

    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(MAIN_SKETCH) -o $(MAIN_SKETCH).o
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/malloc.c -o malloc.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)avr-libc/realloc.c -o realloc.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WInterrupts.c -o WInterrupts.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring.c -o wiring.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_analog.c -o wiring_analog.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_digital.c -o wiring_digital.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_pulse.c -o wiring_pulse.c.o 
    $(CC) $(CC_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)wiring_shift.c -o wiring_shift.c.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)CDC.cpp -o CDC.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HardwareSerial.cpp -o HardwareSerial.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)HID.cpp -o HID.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)IPAddress.cpp -o IPAddress.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)main.cpp -o main.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)new.cpp -o new.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Print.cpp -o Print.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Stream.cpp -o Stream.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)Tone.cpp -o Tone.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)USBCore.cpp -o USBCore.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WMath.cpp -o WMath.cpp.o 
    $(CPP) $(CPP_FLAGS) $(INCLUDE_FILES) $(LIBRARY_DIR)WString.cpp -o WString.cpp.o 
    rm core.a
    $(AR) rcs core.a malloc.c.o 
    $(AR) rcs core.a realloc.c.o 
    $(AR) rcs core.a WInterrupts.c.o 
    $(AR) rcs core.a wiring.c.o 
    $(AR) rcs core.a wiring_analog.c.o 
    $(AR) rcs core.a wiring_digital.c.o 
    $(AR) rcs core.a wiring_pulse.c.o 
    $(AR) rcs core.a wiring_shift.c.o 
    $(AR) rcs core.a CDC.cpp.o 
    $(AR) rcs core.a HardwareSerial.cpp.o 
    $(AR) rcs core.a HID.cpp.o 
    $(AR) rcs core.a IPAddress.cpp.o 
    $(AR) rcs core.a main.cpp.o 
    $(AR) rcs core.a new.cpp.o 
    $(AR) rcs core.a Print.cpp.o 
    $(AR) rcs core.a Stream.cpp.o 
    $(AR) rcs core.a Tone.cpp.o 
    $(AR) rcs core.a USBCore.cpp.o 
    $(AR) rcs core.a WMath.cpp.o 
    $(AR) rcs core.a WString.cpp.o 
    $(CC) -Os -Wl,--gc-sections -mmcu=$(MCU) -o $(MAIN_SKETCH).elf $(MAIN_SKETCH).o core.a -lm 
    $(OBJ_COPY) -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 $(MAIN_SKETCH).elf $(MAIN_SKETCH).eep 
    $(OBJ_COPY) -O ihex -R .eeprom $(MAIN_SKETCH).elf $(MAIN_SKETCH).hex 

En ese caso particular, el archivo .ino se compiló sin problemas después renombrándolo a Blink.cpp y agregando esta línea:

#include <Arduino.h>

Solo me gustaría agregar algunos puntos a la respuesta de Nick Gammon:

  • No es necesario cambiar el nombre de un archivo .ino para compilarlo: si le dice explícitamente al compilador que es C ++ (opción -x c++), ignorará la extensión de archivo inusual y lo compilará como C ++.
  • No es necesario agregar #include <Arduino.h> en el archivo .ino: puede decirle al compilador que lo haga por usted (-include Arduino.h).

Usando esos trucos, puedo compilar Blink.ino con sin modificación, simplemente invocando avr-g ++ con las opciones de línea de comandos adecuadas:

avr-g++ -mmcu=atmega328p -DARDUINO=105 -DF_CPU=16000000L 
    -I/usr/share/arduino/hardware/arduino/cores/arduino 
    -I/usr/share/arduino/hardware/arduino/variants/standard 
    -Os -fno-exceptions -ffunction-sections -fdata-sections 
    -Wl,--gc-sections -g -Wall -Wextra 
    -x c++ -include Arduino.h 
    /usr/share/arduino/examples/01.Basics/Blink/Blink.ino 
    -x none /usr/local/lib/arduino/uno/libcore.a -lm 
    -o Blink.elf

Algunas notas sobre la línea de comandos anterior:

  • /usr/local/lib/arduino/uno/libcore.a es donde guardé el núcleo Arduino compilado. Odio recompilar una y otra vez las mismas cosas.
  • -x none es necesario para decirle al compilador que tenga en cuenta las extensiones de archivo nuevamente. Sin él, se supondría que libcore.a es un archivo C ++.

Aprendí esos trucos del Arduino-Makefile de Sudar Muthu. Este es un Makefile muy general que funciona con muchas placas y con bibliotecas. Lo único que falta en relación con el IDE de Arduino son las declaraciones directas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *