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.

  1. Откройте вкладку nRF Connect в VS Code.
  2. В разделе Build нажмите на иконку входящих настроек (шестеренка).
  3. В поиске введите нужный модуль (например, LOG).
  4. Поставьте галочку — система сама предложит включить необходимые зависимости. 💡

Сравнение подходов

Посмотрим, как меняется логика работы при переходе с 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, чтобы окончательно оживить ваш прототип.