Introduction à Zephyr Project. C’est un système d’exploitation temps réel (RTOS) sous Licence Apache 2.0 et sous l’égide de la fondation Linux. Cet RTOS est spécialement conçu pour systèmes à ressources limitées comme les microcontrôleurs.

Toutefois, il ne s’agit pas uniquement d’un RTOS. Zephyr Project apporte tout un écosystème d’outils de développement varié.

Zephyr Project Logo

Bien qu’il existe déjà de nombreux articles sur ce sujet de très bonne qualité (ex.: Practical Zephyr by Martin Lampacher). J’ai voulu écrire moi-même sur le sujet car cela corresponds à ma manière d’apprendre et progresser dans mon métier. Et puis peut-être vais-je réussir à vous intéresser à ce sujet passionnant.
Par conséquent je souhaite créer une série d’articles sur Zephyr. Le premier étant une description générale afin d’appréhender en quoi consiste Zephyr. Je vous conseille de parcourir la documentation du projet qui est de très bonne qualité.


Zephyr OS

Zephyr OS intègre un kernel léger, tailler pour fonctionner sur des microcontrôleurs. Il supporte de nombreuse architecture (ARM, RISC-V, MIPS, Xtensa …).

Principales fonctionnalités:

  • Multi-threading (basé sur priorités, préemptive et non-préemptive)
  • Gestion des interruptions
  • Allocation de mémoire (dynamique et statique)
  • Communication inter-thread (Sémaphore, Mutex, Queue, Stream)
  • Gestion de l’énergie
  • Séquenceur
  • Stack réseau (LwM2M et BSD sockets)
  • Bluetooth Low Energy 5.0
  • CAN ISO-TP
  • USB Host Device
  • Système de fichier (ext2, FatFs et LittleFS)

Environnement de développement

Zephyr utilise est basé sur un environnement CMake. L’environnement de développement fonctionne sous Linux, MacOS et Windows. Il est possible de créer une application native sous Linux lors du développement ou pour les tests.

Les langages de programmation supportés sont uniquement le C et le C++.

La suite d’outils offert par Zephyr Project intègre un simulateur QEMU, un débugger, un système de test unitaire et un outils d’analyse de code.

L’environnement de développement utilise, Python, Cmake et Devicetree. Cependant il existe un kit de développement (SDK) qui facilite grandement la mise en œuvre de projet utilisant Zephyr.

Construire une application

Un projet utilisant Zephyr est centré sur l’application. En effet une configuration va servir à lancer le processus de construction du code de Zephyr automatiquement.

Ainsi, un projet contient uniquement le code source de l’application et les fichiers de configuration de Zephyr :

<app>
├── CMakeLists.txt
├── app.overlay
├── prj.conf
├── VERSION
└── src
    └── main.c

A noté qu’il est possible d’utiliser des workspace de référence ou alors de créer une application plus spécifique avec une description de hardware spécifique, des drivers custom ou d’utiliser d’autres outils de développement.

West

L’outil intégré west (Zephyr’s meta-tool) permet de compiler, flasher et déboguer. Dans la documentation, cet outil est décrit comme le « couteau suisse » de Zephyr.

Voici les exemples basique d’utilisation:

Build:

west build -b <BOARD>

Flashing:

west flash

Debugging:

Pour attacher un débuggeur et ouvrir une session gdb:

west debug

Pour attacher un debuggeur et ouvrir un port en local utilisable par un outils tiers comme un IDE:

west debugserver

Debugging

Debugging avec simulateur

La suite d’outils de Zephyr intègre QEMU. Ainsi couplé avec un serveur local GDB, il est possible de procéder à un débogage de l’application en natif sans avoir de hardware.

Néanmoins, pour mettre en place ce type de debugging, cela nécessite un petit effort de configuration : Documentation Zephyr Application Debugging

Debugging hardware

Grace à l’outil west, la mise en route du débogage hardware est simplifié. Ainsi il est possible d’utiliser une interface jtag/swd avec J-Link, OpenOCD, pyOCD…

Les tests avec Zephyr Project

Le framework de test Zephyr (Ztest) met à disposition une suite d’outils permettant de réaliser des tests unitaires et d’intégrations.
Il est à noter que les outils sont parfait pour mettre en place de bons tests ou pour utiliser des méthodes de développement comme le TDD ou BDD.
Ainsi il est possible de faire des suites de tests, des builder, des harnais, des testeurs custom, des règles et plains d’autres choses très utiles.
Il est possible d’executer des tests en natif ou sur cible. Mais également de généré des mock automatique avec FFF.
En bonus, Ztest intègre également un module de stress test.

Analyse de code avec Zephyr Project

Le support d’outils d’analyse de code est possible à travers CMake. Le paramètre de build ZEPHYR_SCA_VARIANT doit spécifier l’outil à utiliser.

Les outils supportés nativement sont : CodeChecker, Sparse, GCC static analysis et Parasoft C/C++ test.

Docker image

Dans ce repo, vous trouverez de quoi utiliser Zephyr dans un Docker : zephyrproject-rtos/docker-image
Cela peut-être très utile dans un système d’intégration continu ou pour expérimenter.

Modules

De nombreux modules sont disponibles autour de la sphère Zephyr. Cela est très utile et permet de gagner du temps en en évitant de créer ce qui existe déjà.

Voici quelques exemples de modules:

Conclusion

Les caractéristiques de Zephyr semblent très prometteuses. Il s’agit d’un pack RTOS/Outils complet permettant de réaliser des projets embarqués de qualité. En plus, il semble y avoir un effort fournit niveau sécurité et sureté de fonctionnement (Safety).

Au final, j’espère que l’énumération rapide des fonctionnalités de Zephyr vous a donné, comme pour moi, envie de plongé plus profondément dans l’apprentissage de Zephyr.

A venir

Dans un prochain article nous essayerons de mettre en place un projet utilisant Zephyr avec débuggeur, tests et analyse de code.