Как писать скетчи, совместимые с 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. Хорошая поддержка со стороны авторов.

, 👍9

Обсуждение

Таким образом, вопрос выходит за рамки моих знаний, но некоторые вещи, которые вам нужно учитывать, - это включение файла 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


3 ответа


Лучший ответ:

1

Я думаю, что под 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", поэтому технически он будет включен дважды. Тем не менее, включенные охранники предотвратят компиляцию любого повторяющегося кода.

,

1

Как правило, вам нужно указать функции 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 для небольших проектов.

,

1

Что я хочу знать, так это "как мне написать программу, которая будет считаться допустимой как для Arduino IDE, так и для g++".

См.: Как избежать особенностей предварительной обработки файла скетча IDE. р>

Не обращая внимания на то, как будет выглядеть Makefile, простой ответ на ваш вопрос, как обсуждалось в приведенной выше ссылке, состоит в том, чтобы поместить все во вкладки .cpp и .h в IDE и оставить основной «набросок». (файл .ino) пустой. Он по-прежнему будет компилироваться в среде IDE и, следовательно, также будет обычным C++.

Убедитесь, что вы начинаете свои файлы .cpp с:

#include <Arduino.h>

Если вы используете библиотеки (например, SPI), вы должны включить их в основной файл скетча, после чего среда IDE скопирует их во временный файл сборки проекта. Makefile не будет об этом заботиться, так как вы убедитесь, что ваш Makefile включает в себя все необходимые файлы библиотеки.

Также смотрите мой ответ здесь: Классы и объекты: сколько и какие типы файлов мне действительно нужны для их использования?

,