在没有Arduino IDE的情况下为Arduino编程..但提供了库?


10

我最近使用Arduino开始了一个新项目,该项目已经收集了一段时间的灰尘。除了收集灰尘的物理电路板之外,我的avr-gcc和Arduino库的副本也是如此。我可以管理更新avr-gcc,但是我不记得如何编译Arduino库。在Arduino源代码中,列出了源文件等,但没有用于实际构建库的makefile(我可以看到)。我不在乎构建IDE,我只想要二进制格式的库和所需的头文件。是否有任何相关文件或资料?

我不想使用Arduino IDE,我更喜欢使用自己的文本编辑器和makefile。


1
可能对您有帮助。
arminb 2012年

1
@arminb bleaklow.com/2010/06/04/a_makefile_for_arduino_sketches.html会比这更有用。您的链接仅提供了一种从命令行构建草图的方法,而不是构建arduino库的方法。两种方式都不相关,因为我已经回答了自己的问题
Earlz 2012年


@jippie我看了看(不是在询问时,而是在最近再次访问时),但是由于必须安装Arduino IDE而推迟了。某种目的失败
Earlz

Answers:


9

我使用自定义构建系统(使用Ruby)创建了一个小项目,无需安装Arduino IDE,就可以轻松实现这一点。基本上,它使用模板Makefile和ruby脚本来简化Arduino库的编译。您可以在https://github.com/Earlz/make-wiring上看到它

但是,我将在这里留下旧答案,以获取有关滚动自己的信息。虽然这很麻烦和烦人:

方向:

  1. 下载Arduino IDE源代码的副本
  2. 将的内容复制hardware/arduino/cores/arduino到新目录中,我将其称为arduino_build
  3. pins_arduino.h文件从您的Arduino变体中复制hardware/arduino/variants(如果不确定,请检查board.txt)到arduino_build
  4. 将此makefile添加到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

然后运行

make
make install PREFIX=/usr/arduino (or whatever)

然后,利用编译后的库,您可以使用一个简单的makefile,如下所示:

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

另外,如果尝试以libraries/不正确的顺序进行操作,则尝试在其中编译库时,将出现链接器错误。例如,我必须这样做才能使用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必须在命令行中最后一个存储库

无论如何,这对我来说是一种非常简单的编译方法。随着Ardunio未来版本的推出,该makefile文件应具有相当的前瞻性,只需对OBJS和HDRS进行一些修改即可。另外,此makefile应该与BSD make和GNU make一起使用

另请参见我的博客上此答案的略微修改版本,其中包含已编译的库二进制文件(使用“标准” pins_arduino.h编译)。


** 编辑 **

我发现将以下编译器优化标志添加到构建库的文件Makefile和每个单独的项目Makefile中都可以大大减少最终编译后的二进制文件的大小。这使得最终的二进制大小可与IDE相比。

-Wl,--gc-sections -ffunction-sections  -fdata-sections  

因此,对于库构建makefile:

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

并且,对于每个项目makefile:

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

参考:http : //arduino.cc/forum/index.php? topic= 153186.0


3

如果您愿意使用Arduino IDE一次(或每个设备类型一次),这是构建静态库以及获取库源的最简单方法。之后,您可以使用适合您的任何开发工具。

这篇Arduino文章(专为移至Eclipse IDE的用户而写)描述了如何通过使用Arduino IDE编译草图并从Arduino的临时目录中检索库来构建Arduino库。向下滚动到页面的1/4

  1. 从Arduino IDE项目复制库

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.