Langue: FR

Premiers pas avec Zephyr sous Ubuntu

Comment j’ai installé Zephyr RTOS sous Ubuntu et flashé ma première application sur une nRF5340 DK, en venant du bare metal.

Firmware ·

  • Zephyr
  • RTOS
  • nRF5340
  • C embarqué
  • Linux

Caractéristiques

CarteNordic nRF5340 DK
SoCnRF5340, deux cœurs Arm Cortex-M33 (application + réseau)
OrdinateurUbuntu Linux
Outilswest, Zephyr SDK, CMake, Ninja
DébogueurSEGGER J-Link, intégré à la DK
Première appliBlinky (samples/basic/blinky)

Schéma fonctionnel

Schéma fonctionnel. Mon application, les fichiers de la carte et Zephyr passent par west build, qui utilise CMake, Ninja et GCC pour produire zephyr.hex. west flash l’envoie sur la nRF5340 DK via le J-Link en USB, et la LED1 clignote.

Présentation

Pendant des années, j’ai écrit du firmware en bare metal, avec ma propre boucle principale, mes interruptions et des pilotes écrits directement sur les registres. Je voulais essayer Zephyr, le RTOS open source désormais soutenu par Nordic, NXP, ST et bien d’autres. Voici comment je l’ai installé sous Ubuntu et fait tourner ma première application sur une nRF5340 DK.

Installer Zephyr sous Ubuntu

1. Installer les outils système

$ sudo apt update && sudo apt upgrade
$ sudo apt install --no-install-recommends git cmake ninja-build gperf \
    ccache dfu-util device-tree-compiler wget python3-dev python3-venv python3-tk \
    xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1

2. Créer un environnement Python et installer west

west est l’outil en ligne de commande de Zephyr. Il télécharge le code, compile et flashe. Je le garde dans son propre environnement Python, pour ne pas le mélanger avec le Python d’Ubuntu.

$ python3 -m venv ~/zephyrproject/.venv
$ source ~/zephyrproject/.venv/bin/activate
$ pip install west

Chaque nouveau terminal a besoin de cette commande avant d’utiliser west.

$ source ~/zephyrproject/.venv/bin/activate

3. Télécharger Zephyr

$ west init ~/zephyrproject
$ cd ~/zephyrproject
$ west update
$ west zephyr-export
$ west packages pip --install

west update prend un moment. Il télécharge Zephyr et tous ses modules, y compris les bibliothèques des fabricants.

4. Installer le Zephyr SDK

Le SDK contient les compilateurs (GCC pour Arm et d’autres architectures) et les outils de débogage.

$ cd ~/zephyrproject/zephyr
$ west sdk install

5. Installer les outils pour flasher la nRF5340 DK

La DK intègre un débogueur SEGGER J-Link. Pour la flasher depuis Linux, j’ai installé deux outils.

  • le J-Link Software and Documentation Pack de SEGGER (le fichier .deb pour Ubuntu),
  • nRF Util de Nordic, puis ses commandes pour les cartes.
$ nrfutil install device

6. Compiler et flasher Blinky

Le nRF5340 a deux cœurs. Les applications tournent sur le cœur application, cpuapp.

$ cd ~/zephyrproject/zephyr
$ west build -p always -b nrf5340dk/nrf5340/cpuapp samples/basic/blinky
$ west flash

La LED1 de la carte se met à clignoter.

7. Voir la sortie série

L’exemple hello_world écrit sur le port série USB de la DK.

$ west build -p always -b nrf5340dk/nrf5340/cpuapp samples/hello_world
$ west flash
$ sudo usermod -aG dialout $USER   # une seule fois, puis se déconnecter et se reconnecter
$ screen /dev/ttyACM0 115200       # quitter avec Ctrl+A, puis K

Ce que j’ai appris - bare metal ou Zephyr

En bare metal, mon code est seul sur la puce. Il y a une boucle while (1), des interruptions pour tout ce qui est urgent, et des pilotes écrits sur les registres. C’est petit, rapide et entièrement prévisible, et je connais chaque ligne qui s’exécute. Pour un produit simple, avec un capteur et une seule tâche, c’est toujours le bon choix.

Ça se complique quand le projet grandit. Avec du BLE, un écran, des logs et un capteur en même temps, la boucle principale devient un empilement de drapeaux et de machines à états, et une tâche lente retarde toutes les autres.

Zephyr m’apporte quatre choses.

  • Des threads avec des priorités. Chaque tâche a son propre thread, et l’ordonnanceur exécute d’abord la plus urgente. Mutex, sémaphores et files de messages permettent aux threads de partager des données sans risque.
  • Des piles toutes prêtes. Bluetooth LE, USB, réseau, systèmes de fichiers, logs et shell sont inclus, maintenus et testés.
  • Du code portable. Le matériel est décrit dans le devicetree et les fonctions s’activent dans Kconfig (prj.conf). Le même Blinky se compile pour des centaines de cartes en changeant seulement -b.
  • Les deux cœurs gérés. Sur le nRF5340, Zephyr peut faire tourner le contrôleur Bluetooth sur le cœur réseau à ma place. En bare metal, je devrais gérer moi-même les deux cœurs et leur communication.

Il y a un prix. Zephyr prend plus de flash et de RAM, le système de compilation (west, CMake, devicetree, Kconfig) demande du temps à apprendre, et les erreurs sont parfois plus difficiles à remonter.

Ma règle. Pour un petit appareil à usage unique, je choisis le bare metal. Dès que j’ai besoin de plusieurs tâches en parallèle, d’une connexion sans fil, ou d’un code qui doit survivre à un changement de puce, je choisis Zephyr.

← Retour à tous les projets