Как писать скетчи, совместимые с makefile?
Я хочу написать свои скетчи, чтобы их можно было собрать/загрузить с помощью Arduino IDE или, при желании, с помощью GCC и make-файла.
Я знаю о включении объявлений функций вверху, но есть ли что-нибудь еще, чтобы мой компилятор считал мой скетч действительным C++?
Обновление 1
Понимание того, что Arduino IDE делает с файлами .ino и .pde, хорошо, но не относится к моему вопросу, поэтому это не дубликат. Что я хочу знать, так это «как написать программу, чтобы она считалась допустимой как для Arduino IDE , так и для g++».
Официальный(?) make-файл, доступный здесь, объясняет, что делать при использовании make-файла вместо среды IDE:
# The Arduino environment does preliminary processing on a sketch before
# compiling it. If you're using this makefile instead, you'll need to do
# a few things differently:
#
# - Give your program's file a .cpp extension (e.g. foo.cpp).
#
# - Put this line at top of your code: #include <WProgram.h>
#
# - Write prototypes for all your functions (or define them before you
# call them). A prototype declares the types of parameters a
# function will take and what type of value it will return. This
# means that you can have a call to a function before the definition
# of the function. A function prototype looks like the first line of
# the function, with a semi-colon at the end. For example:
# int digitalRead(int pin);
... но это не объясняет, как использовать и IDE и make-файл.
Обновление 2
Недавно я нашел PlatformIO, который не отвечает на этот вопрос напрямую, но автоматизирует большую часть процесса (генерирует файлы Scons для вас), и пока что я предпочитаю рабочий процесс как Arduino IDE, так и подходу исходный код + makefile. Хорошая поддержка со стороны авторов.
@Alex Shroyer, 👍9
Обсуждение3 ответа
Лучший ответ:
Я думаю, что под gcc/g++ вы имеете в виду именно avr-gcc/avr-g++. Ваш код Arduino, вероятно, не будет считаться действительным кодом C/C++, потому что gcc попытается скомпилировать ваш компьютер в качестве целевой системы. Многие макросы в "WPgram.h" будут ссылаться на недоступную память в вашей целевой системе.
При условии, что вы включили заголовочный файл «WProgram.h» и создали свой код с помощью приведенного выше файла Arduino Makefile (который использует avr-g++, а не g++), ваши файлы cpp должны правильно скомпилироваться и скомпоноваться. Точно так же вы сможете открыть свой код Arduino в среде IDE и там проверить свой код. Среда IDE помещает для вас файл "WProgram.h", поэтому технически он будет включен дважды. Тем не менее, включенные охранники предотвратят компиляцию любого повторяющегося кода.
Как правило, вам нужно указать функции setup()
и loop()
, они являются просто оболочками IDE:
void setup() {}
void loop() {}
int main() {
setup();
while (1)
loop();
return 0; // никогда не достиг
}
Это работает как в среде IDE, так и в командной строке. Когда вы укажете Board и SerialPort в IDE, вам также нужно будет указать оба в Makefile. Таким образом, вы получите две конфигурации.
Многие отказываются от IDE, потому что предпочитают использовать редакторы или иметь больше параметров конфигурации, установив компилятор и компоновщик переключаются.
Чтобы упростить задачу, вы можете использовать Arduino Makefile. Сегодня помечено 347.
Вот пример Makefile:
# try: make help
#
include /usr/share/arduino/Arduino.mk
ARDUINO_DIR = /usr/share/arduino
# list boards with: make show_boards
BOARD_TAG = promicro16
ARDUINO_LIBS = EEPROM
# MONITOR_CMD = picocom -b 9600
MONITOR_CMD = moni -config ACM0-9600.cfg
ARDUINO_PORT = /dev/serial/by-id/usb-Arduino_LLC_Arduino_Leonardo-if00
# ARDUINO_PORT = /dev/ttyACM0
# ARDUINO_PORT = /dev/ttyUSB0
OPTIMIZATION_FLAGS = -Os -fexpensive-optimizations -fstrength-reduce
#
Файлы *.ino изменять не нужно, а файл Makefile
следует поместить в тот же каталог.
В то же время я предпочитаю способ Makefile
, но я по-прежнему использую IDE для небольших проектов.
Что я хочу знать, так это "как мне написать программу, которая будет считаться допустимой как для Arduino IDE, так и для g++".
См.: Как избежать особенностей предварительной обработки файла скетча IDE. р>
Не обращая внимания на то, как будет выглядеть Makefile, простой ответ на ваш вопрос, как обсуждалось в приведенной выше ссылке, состоит в том, чтобы поместить все во вкладки .cpp и .h в IDE и оставить основной «набросок». (файл .ino) пустой. Он по-прежнему будет компилироваться в среде IDE и, следовательно, также будет обычным C++.
Убедитесь, что вы начинаете свои файлы .cpp с:
#include <Arduino.h>
Если вы используете библиотеки (например, SPI), вы должны включить их в основной файл скетча, после чего среда IDE скопирует их во временный файл сборки проекта. Makefile не будет об этом заботиться, так как вы убедитесь, что ваш Makefile включает в себя все необходимые файлы библиотеки.
Также смотрите мой ответ здесь: Классы и объекты: сколько и какие типы файлов мне действительно нужны для их использования?
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
- Преимущества глобальных переменных перед статическими членами класса?
- Конечный автомат C++ / Wpmf-конверсия
- использование ссылок на SFR в встроенном ассемблере gcc
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Как работать с аналоговыми контактами в цикле?
Таким образом, вопрос выходит за рамки моих знаний, но некоторые вещи, которые вам нужно учитывать, - это включение файла Arduino.h. Включение загрузчика; и что угодно еще. Я слежу за этим вопросом :), @Madivad
Я бы посоветовал вам взглянуть на Arduino-CMake (https://github.com/queezythegreat/arduino-cmake)., @jfpoilpret
http://inotool.org/, @jippie
Вы не можете написать «программу», которая будет считаться действительной как для IDE, так и для G++, если вы не готовы пойти на ряд жертв. Разберитесь с Ино., @Ignacio Vazquez-Abrams
Нашел свой ответ [здесь] (http://playground.arduino.cc/Learning/CommandLine), в комментариях к прикрепленному make-файлу., @Alex Shroyer