Как написать совместимые с makefile эскизы?


9

Я хотел бы написать свои эскизы, чтобы я мог их собрать / загрузить с помощью 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);

... но это не объясняет , как использовать как интегрированную среду разработки и Makefile.

Обновление 2

Недавно я нашел PlatformIO, который не отвечает на этот вопрос напрямую, но автоматизирует большую часть процесса (генерирует файлы Scons для вас), и до сих пор я предпочитаю рабочий процесс как в среде Arduino IDE, так и в методе source + makefile. Хорошая поддержка со стороны авторов.


Таким образом, вопрос за пределами моего понимания, но некоторые вещи, которые вы должны рассмотреть, это включение файла Arduino.h. Включение загрузчика; и все остальное. Я буду следить за этим вопросом :)
Мадивад

Я бы посоветовал вам взглянуть на Arduino-CMake ( github.com/queezythegreat/arduino-cmake ).
jfpoilpret


1
Вы не можете написать «программу», которая считается действительной как непосредственно в IDE, так и в G ++, если вы не готовы пойти на несколько жертв. Разобраться с Ино.
Игнасио Васкес-Абрамс

1
Наш ответ нашел здесь , в комментариях к приложенному make-файлу.
hoosierEE

Ответы:


1

Под gcc / g ++ я думаю, что вы имеете в виду именно avr-gcc / avr-g ++. Ваш код arduino, вероятно, не будет считаться допустимым кодом C / C ++, потому что gcc попытается скомпилировать ваш компьютер в качестве целевой системы. Многие из макросов в «WProgram.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; // never reached
}

Это работает как в 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 включает в себя все необходимые файлы библиотеки.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.