Программирование AVR Arduino: как поделить скетч на модули Fri, December 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Arduino: как поделить скетч на модули Печать
Добавил(а) microsin   

По умолчанию проект Arduino состоит из единственного файла с расширением *.ino и одноименной папки. В файле *.ino находится весь основной код приложения:

имяпроекта\имяпроекта.ino

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

Поделить проект Arduino на отдельные модули довольно просто. Достаточно в папке проекта создать файл с расширением имямодуля1.cpp и заголовочный файл имямодуля1.h, и перетащить туда из файла *.ino необходимый код. После этого система Arduino IDE будет автоматически компилировать код как из файла *.ino, так и из файла имямодуля1.cpp.

Предположим, у Вас есть файл *.ino, в котором находятся две функции чтения и записи микросхемы EEPROM. Убрать их код в отдельный модуль можно следующим способом, процесс по шагам:

1. Создайте в папке проекта текстовый файл для исходного кода с расширением *.cpp. Этому файлу можно дать произвольное имя. Основной принцип - имя должно быть понятным, не слишком длинным, и должно отражать назначение кода, который в нем находится. В нашем примере это код для чтения EEPROM, поэтому дадим ему имя EEPROMrw.cpp.

2. Методом Cut/Paste перенесите код для EEPROM из файла *.ino в файл EEPROMrw.cpp.

В нашем примере файл EEPROMrw.cpp может содержать следующий код:

#include "EEPROMrw.h"
 
unsigned char ReadFrom24C04(unsigned char addr)
{
  int data;
  Wire.beginTransmission(0x50);
  Wire.write(addr);
  Wire.endTransmission();
  delay(5);
  Wire.requestFrom(0x50,1);
  delay(10);
  if(Wire.available())
  {
    data = Wire.read();
  }
  return data;
}
 
void WriteTo24C04(unsigned char addr, unsigned char data)
{
  Wire.beginTransmission(0x50);
  Wire.write(addr);
  Wire.write(data);
  Wire.endTransmission();
}

Обратите внимание, что в начале модуля есть строчка с оператором #include, она подключает заголовочный файл EEPROMrw.h. В этом заголовочном файле будут находиться прототипы функций модуля EEPROMrw.cpp.

3. Создайте новый файл с таким же именем, что и имя нового модуля, но с расширением *.h. Для нашего примера получится файл с именем EEPROMrw.h.

В файле EEPROMrw.h может содержаться такой текст:

#include < Wire.h>  // библиотека шины I2C для EEPROM 24LC04
 
unsigned char ReadFrom24C04(unsigned char addr);
void WriteTo24C04(unsigned char addr, unsigned char data);

В результате в папке проекта будет находиться ino-файл, и два новых файла EEPROMrw.cpp и EEPROMrw.h:

имяпроекта\имяпроекта.ino
          \EEPROMrw.cpp
          \EEPROMrw.h

4. Добавьте в начало ino-файла оператор #include для подключения нашего заголовка:

#include "EEPROMrw.h"

5. Скомпилируйте проект (Ctrl+R). Система Arduino IDE обработает как код из файла имяпроекта.ino, так и из файла EEPROMrw.cpp.

В папке проекта может быть произвольное количество модулей исходного кода с расширением *.cpp и соответствующих заголовочных файлов *.h, все они будут нормально компилироваться, как будто это единственный файл с расширением *.ino.

Такой способ организации кода в проекте дает нам следующие преимущества:

• Отлаженные куски кода можно прятать в отдельные файлы, в результате чего основной код в файле *.ino упрощается, в нем проще ориентироваться, работать становится намного легче. На аналогичном принципе основано использование библиотек Arduino (библиотеки Serial, Wire и т. д.).
• В отдельные модули и заголовки можно убрать глобальные переменные и определения #define, определения типов. Некоторые переменные можно сделать вовсе локальными для модуля (static). Это также облегчает понимание кода и его поддержку.

[Ссылки]

1. Arduino: что там внутри? (FAQ).
2220513usdx_rus.zip - проект SDR-трансивера uSDX, поделенный на модули.

 

Добавить комментарий


Защитный код
Обновить

Top of Page