Ho creato un piccolo progetto con un sistema di compilazione personalizzato (usando Ruby) che lo rende piuttosto semplice senza dover installare l'IDE di Arduino. Fondamentalmente, utilizza un template Makefile e uno script ruby per rendere estremamente semplice la compilazione delle librerie di Arduino. Puoi vederlo su https://github.com/Earlz/make-wiring
Tuttavia, lascio qui la vecchia risposta per informazioni su come creare la tua. È abbastanza ingombrante e fastidioso però:
Indicazioni:
- Scarica una copia del codice sorgente IDE di Arduino
- Copia il contenuto di
hardware/arduino/cores/arduino
in una nuova directory che chiamerò arduino_build
- Copia il
pins_arduino.h
file da qualsiasi variante di Arduino sia tua hardware/arduino/variants
(controlla boards.txt se non sei sicuro) in arduino_build
- Aggiungi questo makefile a arduino_build:
.
#BSD licensed, see http://lastyearswishes.com/static/Makefile for full license
HDRS = Arduino.h binary.h Client.h HardwareSerial.h IPAddress.h new.h pins_arduino.h Platform.h Printable.h Print.h \
Server.h Stream.h Udp.h USBAPI.h USBCore.h USBDesc.h WCharacter.h wiring_private.h WString.h
OBJS = WInterrupts.o wiring_analog.o wiring.o wiring_digital.o wiring_pulse.o wiring_shift.o CDC.o HardwareSerial.o \
HID.o IPAddress.o main.o new.o Print.o Stream.o Tone.o USBCore.o WMath.o WString.o
#may need to adjust -mmcu if you have an older atmega168
#may also need to adjust F_CPU if your clock isn't set to 16Mhz
CFLAGS = -I./ -std=gnu99 -DF_CPU=16000000UL -Os -mmcu=atmega328p
CPPFLAGS = -I./ -DF_CPU=16000000UL -Os -mmcu=atmega328p
CC=avr-gcc
CPP=avr-g++
AR=avr-ar
default: libarduino.a
libarduino.a: ${OBJS}
${AR} crs libarduino.a $(OBJS)
.c.o: ${HDRS}
${CC} ${CFLAGS} -c $*.c
.cpp.o: ${HDRS}
${CPP} ${CPPFLAGS} -c $*.cpp
clean:
rm -f ${OBJS} core a.out errs
install: libarduino.a
mkdir -p ${PREFIX}/lib
mkdir -p ${PREFIX}/include
cp *.h ${PREFIX}/include
cp *.a ${PREFIX}/lib
E poi corri e basta
make
make install PREFIX=/usr/arduino (or whatever)
E poi per usare le librerie compilate e simili puoi usare un semplice makefile come questo:
default:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -mmcu=atmega328p -o main.elf main.c -larduino
avr-objcopy -O ihex -R .eeprom main.elf out.hex
upload:
avrdude -c arduino -p m328p -b 57600 -P /dev/ttyUSB0 -U flash:w:out.hex
all: default upload
Inoltre, se provi a compilare le librerie in libraries/
, otterrai un errore del linker se non fai le cose nel giusto ordine. Ad esempio, ho dovuto fare questo per utilizzare SoftwareSerial:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -mmcu=atmega328p -o main.elf main.c -lSoftwareSerial -larduino
La -larduino
deve essere l'ultimo della libreria sulla riga di comando
Comunque, questo è stato un modo abbastanza semplice per compilarlo per me. Quando usciranno le versioni future di Ardunio, questo makefile dovrebbe essere abbastanza a prova di futuro, richiedendo solo alcune modifiche a OBJS e HDRS. Inoltre, questo makefile dovrebbe funzionare sia con BSD che con GNU make
Vedi anche una versione leggermente modificata di questa risposta sul mio blog con un binario già compilato della libreria (compilato usando il "standard" pins_arduino.h).
** MODIFICA **
Ho scoperto che l'aggiunta dei seguenti flag di ottimizzazione del compilatore sia alla creazione del Makefile della libreria sia a ciascun singolo Makefile del progetto riduce notevolmente le dimensioni del file binario compilato finale. Ciò rende la dimensione binaria finale paragonabile a quella dell'IDE.
-Wl,--gc-sections -ffunction-sections -fdata-sections
.
Quindi, per il makefile di compilazione della libreria:
CFLAGS = -I./ -std=gnu99 -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p
CPPFLAGS = -I./ -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p
e, per ogni makefile di progetto:
avr-g++ -L/usr/arduino/lib -I/usr/arduino/include -Wall -DF_CPU=16000000UL -Os -Wl,--gc-sections -ffunction-sections -fdata-sections -mmcu=atmega328p -o main.elf main.c -larduino
.
Rif: http://arduino.cc/forum/index.php?topic=153186.0