Как настроить многофайловый проект в 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/.

Как это настроить? Есть ли какой-нибудь другой вариант, кроме как сделать каждый модуль библиотекой? Если возможно, я бы хотел, чтобы эти файлы были более локальными, чем каталог библиотеки, поскольку они относятся к этому проекту, а не к библиотекам общего назначения.

, 👍6

Обсуждение

Сделайте каждый модуль библиотекой., @Majenko


1 ответ


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

5

У вас есть два варианта использования 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)

,