Як написати ескізи, сумісні з файлами?


9

Я хотів би написати свої ескізи, щоб я міг або створити / завантажити їх за допомогою Arduino IDE, або необов'язково за допомогою GCC та makefile.

Я знаю про включення декларацій функції вгорі, але чи потрібно ще щось зробити, щоб мій компілятор мій ескіз вважався дійсним C ++?

Оновлення 1

Розуміння того, що робить Arduino IDE для файлів .ino та .pde, добре, але моє запитання є стороннім, тому це не дублікат. Що я хочу знати, це "як написати програму таким чином, щоб вона вважалася дійсною як IDE Arduino, так і g ++.

Офіційний (?) Makefile, доступний тут, пояснює, що робити, якщо використовувати makefile замість 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, і makefile.

Оновлення 2

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


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

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


1
Ви не можете написати "програму", яка вважається дійсною як IDE, так і G ++ безпосередньо, якщо ви не бажаєте робити кілька жертв. Попрацюйте з Ino.
Ігнасіо Васкес-Абрамс

1
Знайшов свою відповідь тут , у коментарях доданого makefile.
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, так і в командному рядку. Коли ви вказуєте плату та 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

Що я хочу знати, це "як написати програму таким чином, щоб вона вважалася дійсною як IDE Arduino, так і 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.