В уроке рассмотрим структуру проекта ESP-IDF. Создадим шаблон для простого проекта.
Предыдущий урок Список уроков Следующий урок
Система ESP-IDF для сборки программы из исходного кода использует утилиту CMake. Она позволяет объединять проекты в сложные иерархические структуры. При этом каждый подпроект является самостоятельным проектом, который может в свою очередь сам состоять из подпроектов. Это позволяет сложную программу разбить на модули, которые могут быть разработаны и отлажены отдельно и разными программистами.
Проект ESP-IDF – это проект CMake. В дальнейшем я буду рассказывать о нем относительно именно системы ESP-IDF.
Общая структура проекта ESP-IDF.
- myProject/
- CMakeLists.txt
- sdkconfig
- components/ - component1/ - CMakeLists.txt
- Kconfig
- src1.c
- component2/ - CMakeLists.txt
- Kconfig
- src1.c
- include/ - component2.h
- main/ - CMakeLists.txt
- src1.c
- src2.c
- build/
В каждом каталоге исходного кода проекта содержится файл CMakeLists.txt. Он определяет, что должна делать система сборки в этом каталоге. Он также задает, какие подкаталоги должны обрабатываться при сборке. С точки зрения IDE любой файл CMakeLists.txt является проектом, с которым можно работать отдельно.
- Файл CMakeLists.txt верхнего уровня содержится в корневом каталоге, на вершине иерархической структуры. Это основной файл, который определяет для CMake правила и цели сборки, хранит информацию, из каких подпроектов состоит проект, устанавливает переменные для всего проекта. Он содержит ссылку на файл /tools/cmake/project.cmake, который завершает сборку программы. Также он определяет имя проекта.
- Файл конфигурации проекта sdkconfig содержит конфигурацию компонентов проекта, включая ESP-IDF. Он создается или обновляется при запуске idf.py. В нем значения различных параметров: адреса, размеры памяти, времена задержек и таймаутов , скорости обмена, режимы и прочее.
- Необязательный каталог components содержит компоненты, которые являются частью проекта. Проект необязательно должен содержать пользовательские компоненты. Но такой способ определения удобен для создания структурного кода, который будет использоваться в других приложениях или для программных элементов, не являющихся частью ESP-IDF. В принципе эту операцию можно выполнить в файле CMakeLists.txt верхнего уровня директивой EXTRA_COMPONENT_DIRS. Но при большом количестве исходных файлов проекта лучше сгруппировать компоненты в специальном каталоге.
- Каталог main содержит исходный код самого проекта. main – имя по умолчанию. Оно может быть изменено переменной COMPONENT_DIRS.
- Каталог build создается idf.py. В нем содержится результат сборки и компиляции проекта в виде двоичных файлов. Кроме того там оказываются промежуточные объектные файлы и библиотеки.
- Каждый каталог содержит свой файл CMakeLists.txt. Он содержит определения переменных для управления процессом сборки подпроекта и его интеграции в общий проект.
- Каждый каталог может также содержать файл Kconfig, определяющий параметры конфигурации компонента. Некоторые компоненты могут включать файлы Kconfig.projbuild и project_include.cmake, которые являются специальными файлами для переопределения частей проекта.
Минимальный вариант проекта ESP-IDF.
Давайте посмотрим, из каких элементов состоит минимальный вариант проекта на примере blink1, который мы создали при установке программного обеспечения.
Вот как выглядит корневой каталог проекта у меня.
Файл верхнего уровня CMakeLists.txt.
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(blink)
Это и есть минимальный вариант CMakeLists.txt.
- Символом # в CMake определятся комментарии. В первых двух строках написано ”Следующие пять строк должны быть в файле CMakeLists вашего проекта именно в таком порядке”.
- cmake_minimum_required(VERSION 3.5) сообщает CMake минимальную версию, которая требуется для сборки проекта. ESP-IDF. Директива должна быть первой строкой в файле CMakeLists.txt.
- include($ENV{IDF_PATH}/tools/cmake/project.cmake) включает остальные функции CMake для настройки проекта, обнаружения всех компонентов и т. д.
- project(blink) создает сам проект и указывает его имя. Имя проекта будет использовано для выходных двоичных файлов myProject.elf, myProject.bin. В каждом файле CMakeLists.txt может быть определен только один проект.
Об остальные переменных для файлов CMakeLists.txt поговорим по мере необходимости.
Файл sdkconfig можете открыть и посмотреть, что там. Все параметры сопровождены комментариями.
Каталог main.
У меня выглядит так.
Файл CMakeLists.txt (не верхнего уровня).
Откроем CMakeLists.txt из каталога main.
idf_component_register(SRCS "blink.c"
INCLUDE_DIRS ".")
- SRCS "blink.c" - список исходных файлов (* .c, * .cpp, * .cc, * .S). Эти файлы будут компилированы в библиотеку компонентов. В общем случае файлов может быть несколько. Они перечисляются через пробел.
- INCLUDE_DIRS "." - список каталогов, которые необходимо добавить к глобальному пути поиска для любого компонента, которому требуется этот компонент, а также для исходного файла main.
Makefile
#
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
# project subdirectory.
#
PROJECT_NAME := blink
include $(IDF_PATH)/make/project.mk
Makefile – файл, который содержит информацию для утилиты make о том, как компилировать программу и компоновать.
Пока достаточно. Разработчики ESP-IDF советуют создавать свои проекты с помощью примеров, которые они предлагают.
Шаблон для простых проектов.
Давайте создадим шаблон для простых проектов.
В папке Project я создал каталог template.
В нем – каталог main.
Добавил минимальный вариант CMakeLists.txt. Последняя строка в нем
project(project_name)
Еще создал файл sdkconfig.defaults на случай, если захочется добавить свои настройки.
Добавил стандартный Makefile с измененной строкой:
PROJECT_NAME := project_name
В каталоге main:
Создал файл app_main.c
Хороший стиль main-файл называть не именем проекта. Он должен быть одинаков для всех проектов.
Добавим стандартный для каталога main файл CMakeLists.txt. Имя укажем app_main.c
Вот что получилось.
Загрузить шаблон простого проекта можно по ссылке:
Теперь из шаблона создадим наш новый проект our_blink.
Создадим папку our_blink и скопируем в нее все из template.
- Изменим имя проекта (project_name) в CMakeLists.txt на our_blink
- Изменим имя проекта (project_name) в Makefile на our_blink
Все. Вот что получилось у меня.
Компилируем.
Все нормально. Проект собрался без ошибок.
Что будет в следующем уроке, пока не знаю. Как построить структуру уроков еще не решил.
Предыдущий урок Список уроков Следующий урок
Спасибо! Ждём новые уроки и подробности! Если угодно, можете построить уроки как Ардуино, было очень удобно и интересно!
Добрый день! Ждем новых уроков! Интересует возможность связи между двумя модулями ESP32….
Добрый день. В этой среде можно ЕСП 286 программировать?