Подтвердить что ты не робот

Использование библиотек Arduino для обычного AVR-кода

У меня есть Arduino Uno и среда Linux. Хотя Arduino IDE отличная и все, однако это не дает мне много вкладов, если что-то пойдет не так. И он также становится мучительно медленным и иногда перестает связываться с чипом.

Альтернативой является кодирование моего Arduino Uno с использованием инструментальной привязки AVR-GCC/g++ и AVRDude. Тем не менее, мне очень хотелось бы иметь доступ к тем же функциям, что и в Arduino (например, Serial, digitalWrite и т.д.) при программировании с использованием простого текстового редактора и инструментов командной строки.

Итак, я попытался найти файл заголовка со всеми определенными функциями, то есть "Arduino.h" в /usr/share/arduino/hardware/arduino/cores/arduino.

Я использовал это для компиляции (используя make файл для этого)

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;
}

Но ни одна из функций не отображается, когда я пытаюсь скомпилировать (говоря undefined ссылка на "xxxxxxxxx" ). Итак, каков точный заголовочный файл, который необходимо включить, чтобы я мог использовать одни и те же функции? Или есть что-то еще, что я пропустил?

4b9b3361

Ответ 1

Как получить определения для undefined reference

Сообщение undefined reference to 'xxxxxxxxx' означает, что компоновщик не может найти фактическое определение (а не просто объявление) для рассматриваемой функции.

Когда компоновщик не может найти определение для функции, это определение обычно находится в файле lib (например, *.so или *.dll) или в исходном файле (например, *.cpp или *. с). Для вашего Arduino вам нужно сообщить avr-gcc, чтобы скомпилировать и связать файлы Arduino *.cpp. Вам нужны все исходные файлы из ядра Arduino.

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

Судар дал хороший совет, выступая за использование Makefile для AVR, который настроен на включение определений функций Arduino. (Я свяжусь с моим и объясню это ниже.)

В моем make файле я обработал эту операцию следующим образом:

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

Обратите внимание, что я пропустил файл main.cpp, потому что файл Arduino main.cpp определяет main(), и я хочу сам определить его в своих файлах проекта.

Необходимые файлы заголовков

Конечно, вы также должны передать avr-gcc флаг include для заголовков arduino:

-I$(ARDCOREDIR)

И вы должны включить файл Ardhuino.h в свой код проекта:

#include <Arduino.h>

Заголовочный файл Arduino.h будет содержать все другие файлы заголовков Arduino, включая файл распиновки, в котором содержатся определения для контактов Arduino. У разных Arduinos должны быть разные файлы распиновки, поэтому укажите тип, который вы используете, и сообщите avr-gcc о включении каталога, содержащего соответствующий файл распиновки. Если вы используете стандартный Arduino (UNO), используйте следующее:

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

Мой файл Makefile

Не только ваш процесс сборки должен реализовать несколько инструкций, описанных выше, он должен знать, как сделать файл .hex, который должен быть запрограммирован на ваш Arduino (или AVR). Поэтому рекомендуется использовать make файл.

Мне не нравится перестраивать мой make файл для каждого проекта, поэтому у меня есть только один базовый make файл на моей машине, и каждый проект имеет свой собственный очень короткий make файл, который вызывает include, чтобы включить базовый make файл. Здесь вы можете найти мой базовый файл.

Пример короткого (не базового) файла 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

Примечание. Если вы собираетесь использовать мой базовый make файл, убедитесь, что вы установили переменную ARDDIR (которая появляется в верхней части файла), чтобы указать на каталог Arduino на вашем компьютере.

Ответ 2

Я использую make файл для Arduino, который позволяет мне как пользователям, так и системным библиотекам. Вам не нужно использовать Arduino IDE, но в то же время можете использовать библиотеки, которые предоставляются им.

Ответ 3

Возможно, вам захочется установить параметры компиляции в Arduino IDE. Затем скомпилируйте что-нибудь и посмотрите вывод IDE. Он расскажет вам, где он находит файл .cpp и какие параметры компилятора он использует. Когда вы заглянете в файл .cpp, вы сразу увидите, что вам нужно включить.

После этого make файлы становятся намного легче понять. Если у вас нет прежнего опыта, я бы посоветовал избежать этого и пойти вместо него. Scons написан Python. Таким образом, вы сразу извлекаете выгоду из гораздо более простой отладки.