使用定期AVR代码Arduino的库(Using the Arduino libraries for

2019-08-02 09:55发布

我有一个Arduino UNO和Linux环境。 虽然Arduino的IDE是伟大的,所有的,但它不,如果出现错误给我很大的投入。 而且它也变得极为缓慢,并停止与芯片有时沟通。

另一种方法是使用AVR-GCC / g ++以及AVRDUDE工具链代码我Arduino的乌诺。 不过,我非常希望能够获得相同的功能在Arduino的(如串口 , digitalWrite等),而编程使用简单的文本编辑器和命令行工具。

于是,我就找到所有功能的头文件中定义即“Arduino.h”中/usr/share/arduino/hardware/arduino/cores/arduino

我用这个编译(使用makefile来做到这一点)

avr-gcc -mmcu=atmega328p -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=testarduino.o -I/usr/share/arduino/hardware/arduino/cores/arduino -I/usr/share/arduino/hardware/arduino/variants/standard -std=gnu99 -MMD -MP -MF .dep/testarduino.elf.d testarduino.o --output testarduino.elf -Wl,-Map=testarduino.map,--cref     -lm

编译这段代码:

#include "Arduino.h"

int main(void)
{
    init();
    pinMode(13,OUTPUT);
    while(1){
    digitalWrite(13,HIGH);
    delay(1000);
    digitalWrite(13,LOW);
    delay(1000);
    }
    return 0;
}

但是,没有的功能似乎是确定的,当我尝试编译(未定义的说法参考“XXXXXXXXX”)。 那么,什么是需要包括,以确保我可以使用相同的功能,准确的头文件是什么? 还是有别的东西,我错过了什么?

Answer 1:

如何获得的定义undefined reference

消息undefined reference to 'xxxxxxxxx'意味着链接器无法找到有问题的函数的实际定义 (不仅仅是声明)。

当链接器找不到的功能的定义,即定义通常是在一个库文件中找到(例如,*。所以或* .DLL)或在源文件(例如,*的.cpp或* .c)中。 为了您的Arduino,你需要告诉AVR-GCC编译器和链接的Arduino * .cpp文件。 你需要从Arduino的核心的所有源文件。

ARDCOREDIR = <my arduino folder>/hardware/arduino/cores/arduino

Sudar给了很好的建议,主张其配置为包括Arduino的函数定义的AVR使用一个Makefile的。 (我将链接到矿山及以下解释。)

在我的makefile,我处理这种操作如下:

# CPP_SOURCE_FILES is a previously-defined variable, holding my project's source files
CPP_SOURCE_FILES += $(filter-out $(ARDCOREDIR)/main.cpp, $(wildcard $(ARDCOREDIR)/*.cpp))

注意,我省略了文件main.cpp中,因为Arduino的main.cpp的文件定义main()我希望把它定义自己在我自己的项目文件。

必要的头文件

当然,你还必须经过AVR-GCC的包括Arduino的头标志:

-I$(ARDCOREDIR)

你必须在你的实际项目的代码Ardhuino.h文件:

#include <Arduino.h>

该Arduino.h头文件将包含所有其他Arduino的头文件,包括引出线文件,其中包含了Arduino的引脚定义。 不同Arduinos必须有不同的引脚排列文件,因此确定你所使用的类型,并告诉GCC编译包括包含相应的引脚文件的目录。 如果您使用的是标准的Arduino(UNO),使用以下命令:

-I$(ARDCOREDIR)/../../variants/standard

我的Makefile

不仅你的构建过程中需要实现上述几条指令,它需要知道如何使须安排到你的Arduino(或AVR).hex文件。 因此,它是用一个makefile是个好主意。

我不喜欢重建我的makefile对每一个项目,所以我有我的机器上的一个基本的makefile,每个项目都有自己的,很短的Makefile这就要求include对包括基本的makefile。 你可以找到我在这里的基地的makefile 。

短(非基本)实施例的Makefile我的计算机上的单个项目:

# This is the name of the file that shall be created. (It is also the name of my primary source file, without the file extension.)
TARGET = temp

# create a variable that only pertains to this project
MY_OWN_LIBRARY_DIR = /usr/home/MJ/Arduino/libraries/mj_midi

# "EXTRAINCDIRS" is a variable used by the base makefile. The base makefile creates a -I compiler flag for every item in the "EXTRAINCDIRS" list.
EXTRAINCDIRS = $(MY_OWN_LIBRARY_DIR)

# specify *.c source files pertaining to my project
SRC =

# specify *.cpp source files pertaining to my project
PSRC = temp.cpp $(MY_OWN_LIBRARY_DIR)/midi-listener.cpp $(MY_OWN_LIBRARY_DIR)/midi-song.cpp

# specify additional (non-core) Arduino libraries to include
ARDLIBS = SoftwareSerial

# include my base makefile
include /d/dev/avr/Makefile.base

注意:如果你打算用我的makefile基地,确保您设置的变量ARDDIR (出现接近文件的顶部)指向你的机器上的Arduino的目录。



Answer 2:

我使用了Arduino的makefile文件 ,这让我既用户以及系统库。 您不必使用Arduino的IDE,但在同一时间,可以使用它提供的库。



Answer 3:

您可能需要设置的Arduino IDE编译选项冗长。 然后编译的东西,看IDE的输出。 它会告诉你它所处的.cpp文件并使用该编译器选项。 一旦你看看.cpp文件,你马上看到你所需要的包括。

在此之后,生成文件变得更容易理解。 如果你有化妆没有现成的经验我的建议是,以避免它,去代替scons的。 scons的是写的Python。 因此,您可以立即受益于更简单的调试。



文章来源: Using the Arduino libraries for regular AVR code