Kconfig: управление функционалом через prj.conf
Материал носит ознакомительный характер. Работа с электроникой и микроконтроллерами требует соблюдения техники безопасности; автор не несет ответственности за возможные повреждения оборудования или иной ущерб, возникший в ходе обучения.
В предыдущей теме мы описали «железо» через Device Tree, создав карту компонентов nRF52840. Теперь пора вдохнуть в этот скелет жизнь. Если Device Tree — это чертеж устройства, то система, которую мы изучим сегодня, — это пульт управления программными модулями.
Kconfig: программный конструктор
В Arduino IDE достаточно написать #include <Library.h>, чтобы использовать библиотеку. В nRF Connect SDK (Zephyr RTOS) всё иначе: мало добавить заголовочный файл — нужно приказать системе сборки включить этот модуль в проект.
Kconfig — это система конфигурации. Она определяет, какой код попадет в итоговую прошивку, а какой останется «за бортом». Это позволяет гибко управлять функциями, не переписывая исходный код драйверов.
Файл prj.conf — пульт управления
Главный инструмент настройки — файл prj.conf. Это текстовый список функций, которые вы активируете в проекте.
Каждая настройка называется Символ конфигурации. Он всегда начинается с префикса CONFIG_.
| Запись в prj.conf | Смысл для системы |
|---|---|
CONFIG_GPIO=y | «Да (yes), мне нужен драйвер GPIO». |
CONFIG_BT=y | «Включи в проект стек Bluetooth». |
CONFIG_SERIAL=n | «Отключи (no) UART, чтобы сэкономить память». |
Важно: Kconfig работает на этапе компиляции. Вы не можете изменить эти настройки во время работы программы. Чтобы выключить Bluetooth в коде для экономии энергии, он сначала должен быть разрешен в
prj.conf.
Зависимости модулей
Модули в Zephyr редко работают в одиночку. Часто одна функция требует наличия другой. Это и есть Зависимости модулей.
Например, вы хотите выводить текст в консоль. Но консоль «зависит» от драйвера UART. Если не включить базу, надстройка не заработает.
Пример правильной настройки:
# Сначала включаем базовый драйвер, затем — интерфейс консоли
CONFIG_SERIAL=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
Если забыть зависимость, система сборки выдаст ошибку. Это страховка от ситуаций, когда код обращается к функциям, которые не были скомпилированы.
Практика: Настройка в VS Code
Вам не обязательно заучивать тысячи символов. В расширении nRF Connect для VS Code есть графический интерфейс — Kconfig GUI.
- Откройте вкладку nRF Connect в VS Code.
- В разделе Build нажмите на иконку входящих настроек (шестеренка).
- В поиске введите нужный модуль (например,
LOG). - Поставьте галочку — система сама предложит включить необходимые зависимости. 💡
Сравнение подходов
Посмотрим, как меняется логика работы при переходе с Arduino.
- В стиле Arduino: Мы подключаем библиотеку целиком. Даже если нужна одна функция, компилятор часто забирает в память лишний «багаж».
- В стиле nRF Connect SDK: Вы берете только то, что нужно.
CONFIG_LOG=y # Включаем логирование CONFIG_LOG_DEFAULT_LEVEL=1 # Оставляем только отчеты об ошибках
Этот подход создает компактные прошивки. Для nRF52840 это критично, когда вы начнете бороться за каждый байт памяти и микроампер тока. 🔋
Типичные ловушки
- Опечатки: Если написать
CONFIG_GPO=yвместоCONFIG_GPIO=y, система просто проигнорирует строку. Ошибки не будет, но функции управления пинами не заработают. - Пересборка: После изменений в
prj.confвсегда делайте Full Rebuild, чтобы применить новые параметры.
Совет: Если VS Code подчеркивает функции драйверов красным, хотя код верный — проверьте, включен ли нужный модуль в
prj.conf.
Теперь вы умеете описывать «железо» и подключать программные «мышцы». Мы готовы управлять реальными устройствами. В следующей теме перейдем к практике: изучим драйверы GPIO, UART и ADC, чтобы окончательно оживить ваш прототип.