© 2023 DiyTronic

Настраиваем рабочее окружение для Zephyr OS

Начитавшись всякого про Zephyr OS решил перейти к тестам. Мигать светодиодами посчитал ниже своего достоинства и решил сразу «зайти с козырей» и начать сразу с BLE примеров. Ну и самая классика это конечно BLE beacon. С него и начинаю.

Ставим ядро

Итак для начала нам надо установить ядро Zephyr. Для этого создаём папку и клонируем туда код с GitHub.

1
2
3
$ mkdir zephyr
$ cd zephyr
$ git clone https://github.com/zephyrproject-rtos/zephyr.git

Потом переходим в скачанную папку с зефиром и ставим все зависимости. Для этого у нас должен быть установлен python версии 3. У меня оно уже стояло. На установке python останавливаться не буду.

1
2
$ cd  zephyr
$ pip3 install --user -r scripts/requirements.txt

Ставим SDK

SDK скачивается в виде самораспаковывающегося скрипта. В общем-то тут тоже всё довольно тривиально — качаем и запускаем. Оно спросит куда установить — я не стал спорить и дал ему установиться куда оно просило — в /opt/zephyr-sdk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ wget https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/0.9.2/zephyr-sdk-0.9.2-setup.run
$ sh zephyr-sdk-0.9.2-setup.run
[sudo] пароль для roman:
Verifying archive integrity... All good.
Uncompressing SDK for Zephyr 100%
Enter target directory for SDK (default: /opt/zephyr-sdk/):
Installing SDK to /opt/zephyr-sdk
Creating directory /opt/zephyr-sdk
Success
[*] Installing x86 tools...
[*] Installing arm tools...
[*] Installing arc tools...
[*] Installing iamcu tools...
[*] Installing mips tools...
[*] Installing nios2 tools...
[*] Installing xtensa tools...
[*] Installing riscv32 tools...
[*] Installing additional host tools...
Success installing SDK. SDK is ready to be used.

Ну и для полного счастья нужно задать пару переменных окружения в конфиг зефира в домашней папке пользователя.

1
2
3
4
$ cat <<EOF > ~/.zephyrrc
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk
EOF

Так-же наду куда-то в автозагрузку запихать скрипт из папки с ядром zephyr-env.sh. Он пропишет ещё какие-то свои пути и переменные. Я пока глубоко не рыл, но вроде там просто путь к файлам ядра указывается.

На этом всё. Можно приступать к сборке.

Пробуем собрать проект

Запускаю zephyr-env.sh — только ради переменной $ZEPHYR_BASE. Ну и переходим в папку с кодом для beacon-а.

1
2
$ source zephyr-env.sh
$ cd $ZEPHYR_BASE/samples/bluetooth/beacon

Теперь нужно создать папку для своего проекта. Это фактически папка для сборки под конкретную железку. Для каждой железки под которую хочется собрать код нужно создавать свою. Я собираю код под nrf51822 поэтому папку проекта обозвал как nrf51

1
$ mkdir -p build/nrf51 && cd build/nrf51

По умолчанию сборка зефирных проектов выполняется с помощью cmake и ninja. CMake в этом случае только генерирует файлы для сборки, а ninja уже занимается сборкой, прошивкой и прочей грязной работой. Вообще можно организовать сборку и через make и в доках у зефира были описаны ещё варианты сборки, но я пока буду использовать то, что рекомендуют авторы проекта т. к. ожидаю, что те средства которые они используют и будут наиболее сьабильно работать.

Итак генерируем файлы для сборки — указываем, что сборка будет проводиться с помощью ninja и указываем конфигурацию используемой платы. В моём случае тестирую я только beacon и распиновка мне не важна, поэтому взял наугад какую-то плату под nrf51 — nrf51_pca10028. Вот тут про неё поподробнее. Запускаем генерацию.

1
2
3
4
5
6
7
8
$ cmake -GNinja -DBOARD=nrf51_pca10028 ../..
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.6.4", minimum required is "3.4")
-- Selected BOARD nrf51_pca10028
Zephyr version: 1.10.99
...
-- Configuring done
-- Generating done
-- Build files have been written to: <skip>/beacon/build/nrf51

Ну и запускаем сборку — просто стартуем ninja.

1
2
3
4
5
6
7
8
9
$ ninja
[1/116] Generating always_rebuild
Building for board nrf51_pca10028
[111/116] Linking C executable zephyr/zephyr_prebuilt.elf
Memory region Used Size Region Size %age Used
FLASH: 57032 B 256 KB 21.76%
SRAM: 12964 B 32 KB 39.56%
IDT_LIST: 132 B 2 KB 6.45%
[116/116] Linking C executable zephyr/zephyr.elf

Вроде мелочь, а приятно — ninja в итоге выдал некую статистическую сводку по использованию ресурсов контроллера. Кому как, а я люблю такие приятные мелочи.

Ну и та-дааам — заливаю прошивку в устройство. Получилось со 2-го раза. Для работы с чипами nrf ninja пытается использовать утилиту nrfjprog, которая на самом деле ни что иное как SEGGER Jlink, только завёрнутый в их программу со своими ключами — ну типа всё заточено под nrf чипы. У меня она была просто скачана в отдельной папке — пришлось установить готовый пакет под мою OS. Как вариант можно было просто путь к nrfjprog прописать в системные пути. Но тем не менее дальше всё прошло абсолютно гладко.

1
2
3
4
5
6
7
8
9
10
11
12
13
$ ninja flash
[1/84] Generating always_rebuild
Building for board nrf51_pca10028
[1/2] Flashing nrf51_pca10028
Flashing file: <skip>/build/nrf51/zephyr/zephyr.hex
Erasing user available code and UICR flash areas.
Applying system reset.
Parsing hex file.
Reading flash area to program to guarantee it is erased.
Checking that the area to write is not protected.
Programing device.
Applying pin reset.
Board with serial number 59400351 flashed successfully.

После этого просканировал с телефона beacon-ы и обнаружил вот это:

Более того. Андроид на телефоне сам нашёл bacon и запустил какое-то приложение Nearby, которое сказало мне что в радиусе 0,13 метров от меня есть ссылка www.zephyrproject.org.

Итоги и первые впечатления

В общем могу сказать, что Zephyr офигенен. Не хочу перегружать статью подробностями, но сам код маяка по сравнению с Mynewt гораздо понятнее и лаконичнее. В нём только именно то, что нужно без всякой лишней ерунды. И это при том, что в итоге получившийся маяк вышел гораздо функциональнее того, что удалось получить с Mynewt. Он сходу подхватился андроидом, в то время как Mynewt-оновский был виден только специальной программой.

Ну и опять же сравнивая с Mynewt — сборка примера прошла вообще без проблем. Ни одного мало-мальски значимого косяка с запуском кода или со сборкой. В общем Zephyr на голову выше Mynewt — совершенно другой уровень.

Буду изучать дальше. На самом деле доки я уже перечитал — там много вкусного и есть, что попробовать.

Источники

Комментарии