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:
- Откройте вкладку nRF Connect.
- В разделе Input Files найдите ваш
.overlayфайл. - Нажмите на иконку «глаза».
Перед вами появится интерактивная карта пинов и периферии nRF52840. Меняйте параметры в меню, а редактор сам сгенерирует код.
Важно: После любого изменения в Device Tree или Overlay-файле проект нужно пересобрать (Build), чтобы система обновила внутренние связи.
Как магия превращается в код
При сборке Zephyr сканирует дерево и создает скрытые макросы. Чтобы связать C-код с деревом, используйте специальные функции:
// Получаем идентификатор узла из дерева по его псевдониму
#define LED0_NODE DT_ALIAS(led0)
Чтобы система понимала, какие свойства обязательны для узла (например, что у датчика должен быть адрес I2C), используются Bindings (привязки). Это YAML-файлы — «словари», которые объясняют компилятору правила описания конкретных устройств.
Мы научились описывать «железо», не трогая логику программы. Это делает проекты гибкими. Но описание железа — лишь половина дела. Теперь нужно научиться управлять программными модулями: включать Bluetooth, настраивать логи или активировать драйверы.
В следующей теме разберем, как с помощью Kconfig гибко управлять функционалом вашего проекта.