Перейти к содержанию

Kconfig

Включить Bluetooth, выбрать размер стека системной очереди, отключить лишний драйвер — и всё это без правки исходников. Zephyr и ESP-IDF взяли для этого Kconfig, систему настройки ядра Linux: символы с типами и зависимостями, меню и один файл с текущими значениями.

Обновлено Редакция GAW

Kconfig — система настройки сборки, заимствованная из ядра Linux: параметры (символы) описываются в файлах Kconfig вместе с типом, подсказкой, значением по умолчанию и зависимостями, группируются в меню, а итоговая конфигурация превращается в макросы для C и системы сборки. Цель — настраивать проект без изменения исходников: код неиспользуемых функций просто не попадает в образ. В Zephyr Kconfig дополняет devicetree: дерево описывает железо, Kconfig — какую программную поддержку собрать. ESP-IDF настраивает через него проект, систему сборки, сам фреймворк и компоненты.

Символы и их типы

Пример определения из документации Zephyr:

config FPU
    bool "Support floating point operations"
    depends on HAS_FPU

Символ с подсказкой ("...") называется видимым: он показывается в меню и его можно задать в файлах. Невидимый символ без подсказки получает значение из default или через select других символов. Тип обязателен; в esp-idf-kconfig это bool, int, string, hex или float, в Zephyr документация говорит о bool, int, hex и string. Прочие опции: default, help, range, select, imply, depends on (работает и для нечисловых типов). choice задаёт исключающий выбор из нескольких bool. Для int и hex стоит всегда писать default — иначе они равны пустой строке.

В файлах значений символ пишется с префиксом CONFIG_:

ЗаписьСмысл
CONFIG_FPU=ybool включён (без пробелов вокруг =)
# CONFIG_FPU is not setbool выключен — так пишет сохранённая конфигурация
CONFIG_SOME_STRING="cool value"строка
CONFIG_SOME_INT=123число

Присваивание действует только если выполнены зависимости символа, иначе сборка печатает предупреждение (в Zephyr KCONFIG_WARNING_AS_ERROR превращает его в ошибку — полезно в CI).

Zephyr: prj.conf и .config

Начальная конфигурация приложения Zephyr — слияние трёх источников: boards/<VENDOR>/<BOARD>/<BOARD>_defconfig, записей кеша CMake с префиксом CONFIG_ и настроек приложения, по умолчанию из prj.conf (альтернативы — CONF_FILE, boards/<BOARD>.conf, фрагменты socs/…conf). Приложение побеждает defconfig платы. Результат попадает в zephyr/.config в каталоге сборки, и из него генерируется autoconf.h. west build -t menuconfig открывает терминальное меню, guiconfig — графическое; они корректно учитывают зависимости, но правят только .config, то есть временно. Клавиша D в menuconfig сохраняет минимальную конфигурацию — только отличия от умолчаний, удобно переносить в prj.conf. Невидимые символы платы настраивают в Kconfig.defconfig. Обычные видимые символы приложение задаёт в prj.conf — так, например, выбирают стек и приоритет потока системной очереди работ через CONFIG_SYSTEM_WORKQUEUE_*.

ESP-IDF: sdkconfig и sdkconfig.defaults

В ESP-IDF опции определяют файлы Kconfig (попадают в раздел Component config меню) и Kconfig.projbuild (корневое меню), а текущие значения хранит один файл sdkconfig в корне проекта. Его создаёт и меняет idf.py menuconfig; вручную его не правят, а предыдущая версия сохраняется в sdkconfig.old. Значения уходят в C через sdkconfig.h и в CMake через sdkconfig.cmake; из основного sdkconfig выводится и конфигурация загрузчика. Под системой контроля версий документация советует держать не sdkconfig, а sdkconfig.defaults — пользовательские умолчания, которые перекрывают default из Kconfig, но уступают значениям, уже изменённым пользователем в sdkconfig. idf.py save-defconfig генерирует его из отличий от умолчаний; sdkconfig.defaults.<chip> (например, .esp32s2) дополняет его для конкретного чипа и работает только при наличии общего файла. Переименования опций между версиями фиксирует sdkconfig.rename. Именно так на ESP32 включают, например, CONFIG_FREERTOS_USE_TICKLESS_IDLE для бестактового режима. Что ещё лежит рядом с прошивкой в каталоге сборки — в статье «Файлы прошивки»; о версиях Zephyr — в ответе о LTS-выпусках.

Частые вопросы

Что такое sdkconfig и можно ли править его руками?

sdkconfig — файл в корне проекта ESP-IDF, где хранятся текущие значения всех опций, и пользовательские, и умолчания. Его создаёт и обновляет idf.py menuconfig, и вручную его не редактируют: между опциями есть зависимости, которые легко сломать. Для переносимых настроек служит sdkconfig.defaults — туда записывают только значения, отличающиеся от умолчаний (idf.py save-defconfig делает это сам). Если же пользователь изменил опцию в sdkconfig, значение из sdkconfig.defaults для неё игнорируется.

Откуда берётся начальная конфигурация в Zephyr?

Из слияния трёх источников: файла платы boards/<VENDOR>/<BOARD>/<BOARD>_defconfig, записей кеша CMake с префиксом CONFIG_ и конфигурации приложения — по умолчанию prj.conf (или файлов из CONF_FILE, boards/<BOARD>.conf). Настройки приложения имеют приоритет над defconfig платы. Результат сохраняется в zephyr/.config в каталоге сборки; именно его меняет menuconfig, но это временные изменения — постоянные пишут в *.conf.

Какие типы бывают у символов Kconfig?

В Zephyr документация упоминает bool, int, hex и string; в esp-idf-kconfig тип обязателен для каждого config и может быть bool, int, string, hex или float. В файлах значений bool записывают как CONFIG_X=y, выключенный — как «# CONFIG_X is not set», строки в кавычках, числа без. Для int и hex стоит всегда задавать default: без него они по умолчанию равны пустой строке.

Источники

  1. Zephyr Project. Zephyr Project Documentation (latest): Configuration System (Kconfig) — overview; Setting Kconfig configuration values; Interactive Kconfig interfaces; Kconfig — Tips and Best Practices, 2026 — обзор: та же система настройки, что в ядре Linux; цель — настройка без изменения исходников; символы определяются в файлах Kconfig вместе с зависимостями, группируются в меню; результат — заголовок autoconf.h с макросами, код неиспользуемых функций исключается; стр. Setting values: видимый символ — с подсказкой (prompt), его можно задать в файлах; невидимый — без, значение берётся из default или select; синтаксис CONFIG_<символ>=<значение> без пробелов вокруг =; bool — y или n, строка "...", int число, # — комментарий; n также как «# CONFIG_X is not set»; присваивание действует только при выполненных зависимостях, иначе предупреждение; начальная конфигурация — слияние boards/<VENDOR>/<BOARD>/<BOARD>_defconfig, записей кеша CMake с CONFIG_ и конфигурации приложения, по умолчанию prj.conf (иначе CONF_FILE, boards/<BOARD>.conf, socs/…conf); приложение имеет приоритет над defconfig платы; результат — zephyr/.config в каталоге сборки; KCONFIG_WARNING_AS_ERROR; невидимые символы настраивают в Kconfig.defconfig; пример: config FPU bool "Support floating point operations" depends on HAS_FPU; стр. Interactive interfaces: menuconfig в терминале и графический guiconfig — для временных изменений, запуск west build -t menuconfig; клавиша D сохраняет минимальную конфигурацию; постоянные настройки — в *.conf; стр. Tips: depends on работает и для string, int и hex символов; int и hex должны иметь default; пример hex "Stack size"
  2. Espressif. ESP-IDF Programming Guide v6.1, ESP32: Project Configuration — overview; Configuration File Structure and Relationships; Build System; Configuration Options Reference — обзор: единая настройка проекта, системы сборки, ESP-IDF и компонентов через Kconfig; файлы Kconfig и Kconfig.projbuild определяют опции, sdkconfig в корне проекта хранит текущие значения, menuconfig их редактирует, значения передаются в CMake и C через sdkconfig.cmake и sdkconfig.h; sdkconfig.defaults задаёт пользовательские значения по умолчанию, предпочтителен под системой контроля версий; стр. Structure: каждая опция получает префикс CONFIG_ при записи в файл; Kconfig — раздел Component config в menuconfig, Kconfig.projbuild — корневое меню; sdkconfig генерируется автоматически и не редактируется вручную из-за зависимостей; строки CONFIG_NAME=<value> и «# CONFIG_NAME is not set»; sdkconfig.old — резервная копия; sdkconfig.defaults имеет приоритет над default в Kconfig, но значения из sdkconfig имеют приоритет над sdkconfig.defaults; sdkconfig.defaults.<chip> требует наличия sdkconfig.defaults; idf.py save-defconfig создаёт sdkconfig.defaults из отличий от умолчаний; sdkconfig.rename — пары старое/новое имя; стр. Build System: idf.py menuconfig, конфигурация загрузчика выводится из основного sdkconfig; стр. Configuration Options Reference: имена опций — прописные буквы с подчёркиваниями, Kconfig пишет их в sdkconfig и sdkconfig.h с префиксом CONFIG_
  3. Espressif. esp-idf-kconfig documentation (latest): Kconfig language — ключевые слова: записи mainmenu, menu, config, menuconfig, choice, source, if, comment; опции: тип — один из bool, int, string, hex, float, а также prompt, depends on, default, help, range, select, imply; тип обязателен для config; choice — исключающий выбор, всегда bool; в контексте ESP-IDF mainmenu задаётся в корневом Kconfig проекта; отступ 4 пробела, язык чувствителен к регистру
Страница помогла?

Нашли ошибку? ·