Device Tree: описание аппаратных ресурсов без жесткого кодинга

Материал носит ознакомительный характер. Работа с электроникой и микроконтроллерами требует соблюдения техники безопасности; автор не несет ответственности за возможные повреждения оборудования или иной ущерб, возникший в ходе обучения.

В Arduino описание «железа» зашито прямо в код. Мы пишем digitalWrite(13, HIGH), подразумевая светодиод. Но если в новой ревизии платы светодиод перенесут на 25-й пин, вам придется вручную искать и менять все «13» в проекте. В профессиональной разработке на nRF52840 так не делают.

Для гибкости в Zephyr RTOS используют Device Tree (дерево устройств). Это способ описать аппаратную часть отдельно от логики программы.

Что такое Device Tree

Device Tree — это иерархический текстовый файл, который описывает всё оборудование: от ядер процессора до каждой кнопки на вашей плате.

Представьте разницу:

  • Путь Arduino: Код привязан к конкретным «ножкам» (пинам). Поменяли плату — переписываем код.
  • Путь Zephyr: Код обращается к абстрактному «светодиоду №1». Его физический адрес указан в отдельном файле.

Так создается Hardware Abstraction Layer (HAL) — уровень аппаратных абстракций. Благодаря ему один и тот же код без правок запустится и на nRF52840 Development Kit, и на миниатюрном USB-донгле.

Анатомия дерева: Узлы и Свойства

Дерево состоит из объектов и их параметров:

  • Node (Узел): Любой компонент (процессор, интерфейс UART, светодиод).
  • Property (Свойство): Характеристики узла (номер пина, скорость, адрес в памяти).

Пример описания светодиода:

leds {
    compatible = "gpio-leds";
    led0: led_0 {
        gpios = <&gpio0 13 GPIO_ACTIVE_LOW>;
        label = "Green LED";
    };
};

Здесь led0 — это имя узла, а gpios — свойство, указывающее на 13-й пин порта 0.

Overlay-файл: настройка под себя

У каждой готовой платы есть основной файл описания (.dts). Менять его нельзя — это системный файл производителя. Чтобы внести свои правки, используйте Overlay-файл.

Overlay-файл (.overlay) накладывается поверх основного описания и переопределяет нужные параметры. Если на вашей плате светодиод подключен к 11-му пину вместо 13-го, создайте в папке проекта файл app.overlay:

&led0 {
    gpios = <&gpio0 11 GPIO_ACTIVE_LOW>;
};

Символ & говорит системе: «Не создавай новый объект, а измени настройки в существующем узле led0».

Визуальный редактор в VS Code

Вам не обязательно заучивать синтаксис. В расширении nRF Connect для VS Code есть инструмент nRF DeviceTree Visual Editor:

  1. Откройте вкладку nRF Connect.
  2. В разделе Input Files найдите ваш .overlay файл.
  3. Нажмите на иконку «глаза».

Перед вами появится интерактивная карта пинов и периферии nRF52840. Меняйте параметры в меню, а редактор сам сгенерирует код.

Важно: После любого изменения в Device Tree или Overlay-файле проект нужно пересобрать (Build), чтобы система обновила внутренние связи.

Как магия превращается в код

При сборке Zephyr сканирует дерево и создает скрытые макросы. Чтобы связать C-код с деревом, используйте специальные функции:

// Получаем идентификатор узла из дерева по его псевдониму
#define LED0_NODE DT_ALIAS(led0)

Чтобы система понимала, какие свойства обязательны для узла (например, что у датчика должен быть адрес I2C), используются Bindings (привязки). Это YAML-файлы — «словари», которые объясняют компилятору правила описания конкретных устройств.


Мы научились описывать «железо», не трогая логику программы. Это делает проекты гибкими. Но описание железа — лишь половина дела. Теперь нужно научиться управлять программными модулями: включать Bluetooth, настраивать логи или активировать драйверы.

В следующей теме разберем, как с помощью Kconfig гибко управлять функционалом вашего проекта.