Как настроить многофайловый проект в Arduino IDE?
Допустим, у меня есть проект с несколькими модулями и основной программой. Это хорошо работает при добавлении модулей в main_program.
module1.cpp
module1.h
module2.cpp
module2.h
...
main_program.ino
У меня возникают проблемы, когда у меня есть тестовые программы для каждого из модулей. Это позволяет тестировать различные устройства изолированно.
module1.cpp
module1.h
module1.ino # test program
module2.cpp
module2.h
module2.ino # test program
...
main_program.ino
Мне требуется, чтобы каждый файл ino находился в каталоге с тем же именем. Я могу добавить файлы в main_program, добавив (например) ../module1/module1.{cpp,h}. Но я обнаружил, что на самом деле он скопировал module1.{cpp,h} в main_program/.
Как это настроить? Есть ли какой-нибудь другой вариант, кроме как сделать каждый модуль библиотекой? Если возможно, я бы хотел, чтобы эти файлы были более локальными, чем каталог библиотеки, поскольку они относятся к этому проекту, а не к библиотекам общего назначения.
@Mark Harrison, 👍6
Обсуждение1 ответ
Лучший ответ:
У вас есть два варианта использования ArduinoIDE.
Сначала Каждый модуль в каталоге модулей
Так выглядит структура
main_routine
main_routine.ino
--module1
module1.ino #test routine
module1.cpp
module1.h
--module2
.....
входит в состав main_routine.ino
#include "module1/module1.h"
#include "module2/module2.h"
Итак, у вас есть все в главном каталоге и в конкретных подкаталогах модулей ниже. Ничего не копируется и не будет копироваться ArduinoIDE (v1.8.12)
Второй (более хакерский способ) состоит в том, чтобы хранить все в одном каталоге и для тестирования разработки работать с включенными охранниками в main_routine.ino
// для производства прокомментируйте все MODULEX_TEST и раскомментируйте PRODUCTION
//#определить ПРОДУКЦИЮ
#define MODULE1_TEST
//#определить MODULE2_TEST
.....
#if defined (PRODUCTION) || defined (MODULE1_TEST )
#include "module1/module1.h"
#endif
#if defined (PRODUCTION) || defined (MODULE1_TEST )
uint8_t myModule1Var = 0;
#endif
setup(){
.....
#if defined (PRODUCTION) || defined (MODULE1_TEST )
myModule1setup someInit(1,2,3);
#endif
.....
}
loop(){
.....
#if defined (PRODUCTION) || defined (MODULE1_TEST )
void mymodule1Func(){....};
#endif
#ifdef MODULE1_TEST
void mymodule1Test(){....};
#endif
За и против
- +Этот подход позволяет тестировать два модуля одновременно.
- -Читать сложнее, но
- + проще документировать с помощью таких инструментов, как doxygen
- ~Только активные включения компилируются, поэтому в скомпилированном коде нет накладных расходов.
Имейте в виду, что с некоторыми цепочками инструментов в настоящее время возникают проблемы при использовании специальных шаблонов (работает, если все находится в одном файле модуля - я использую файл «расширенного заголовка» в качестве мгновенного решения) или массивов в качестве инициализатора (открытая проблема в esp8266)
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Сделайте каждый модуль библиотекой., @Majenko