Stworzyłem mały projekt z niestandardowym systemem kompilacji (używając Ruby), który sprawia, że jest to dość łatwe bez konieczności instalowania Arduino IDE. Zasadniczo wykorzystuje szablon Makefile i skrypt ruby, aby kompilacja bibliotek Arduino była wyjątkowo łatwa. Możesz to zobaczyć na https://github.com/Earlz/make-wiring
Pozostawiam jednak starą odpowiedź tutaj, aby uzyskać informacje na temat rozwijania własnej. Jest to jednak dość kłopotliwe i denerwujące:
Kierunki:
- Pobierz kopię kodu źródłowego Arduino IDE
- Skopiuj zawartość
hardware/arduino/cores/arduino
do nowego katalogu, który będę określał jako arduino_build
- Skopiuj
pins_arduino.h
plik z dowolnego wariantu Arduino z twojego hardware/arduino/variants
(sprawdź deski.txt, jeśli nie jesteś pewien) do arduino_build
- Dodaj ten plik makefile do 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
A potem po prostu biegnij
make
make install PREFIX=/usr/arduino (or whatever)
A potem, aby skorzystać ze skompilowanych bibliotek, możesz użyć prostego makefile takiego jak ten:
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
Ponadto, jeśli spróbujesz skompilować biblioteki libraries/
, pojawi się błąd linkera, jeśli nie zrobisz rzeczy we właściwej kolejności. Na przykład musiałem to zrobić, aby użyć 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
-larduino
Musi być ostatnim biblioteki w wierszu poleceń
W każdym razie był to dla mnie dość łatwy sposób. Gdy pojawią się przyszłe wersje Ardunio, ten plik makefile powinien być dość przyszłościowy, wymagając tylko kilku modyfikacji OBJS i HDRS. Ponadto ten plik makefile powinien współpracować zarówno z marką BSD, jak i GNU
Zobacz także nieco zmodyfikowaną wersję tej odpowiedzi na moim blogu z już skompilowanym plikiem binarnym biblioteki (skompilowanym przy użyciu „standardowego” pliku pin_arduino.h).
** EDYCJA **
Odkryłem, że dodanie następujących flag optymalizacji kompilatora zarówno do pliku Makefile budującego bibliotekę, jak i do każdego pliku Makefile projektu znacznie zmniejsza rozmiar końcowego skompilowanego pliku binarnego. To sprawia, że końcowy rozmiar binarny jest porównywalny z rozmiarem IDE.
-Wl,--gc-sections -ffunction-sections -fdata-sections
.
Zatem dla makefile kompilacji biblioteki:
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
oraz dla każdego makefile projektu:
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
.
Patrz: http://arduino.cc/forum/index.php?topic=153186.0