Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références ».
Le noyau Zephyr est pensé pour des appareils aux contraintes fortes en termes de mémoire[4] : du capteur connecté à la montre connectée en passant par les « technologies portables » simple ou la passerelle IoT sans fil. Il est principalement utilisé dans les objets connectés[5].
L'OS se distingue des autres solutions existantes sur plusieurs points :
Les ressources sont définies statiquement, à la compilation
Peu ou pas de vérification d'erreurs dynamique
De plus, l'OS expose un certain nombre d'interfaces de programmation pour permettre au développeur d'écrire son application.
Sécurité
Un groupe de travail est dédié au maintien et au développement de la sécurité pour le projet. En outre, le modèle de développement ouvert permet de multiplier les études et critiques du code, ce qui participe à le rendre sûr et plus sécurisé.
Espace d'adressage unique
Une image Zephyr fonctionnelle contient le code applicatif et le code du noyau, réunis en un seul binaire. L'application et le kernel s'exécutent dans le même espace d'adressage.
Hautement configurable
Zephyr permet de sélectionner uniquement les fonctionnalités voulues, et de les paramétrer si besoin (taille d'un espace mémoire réservé par exemple).
Ressources définies statiquement
Il n'est pas possible de définir une ressource pendant l’exécution d'une application. Ceci permet de diminuer la taille du code et d'augmenter les performances, en évitant du code de gestion dynamique supplémentaire.
Vérification d'erreurs minimale
Là aussi, cela permet de gagner en taille de codecompilé et performances. A noter qu'il est possible d'activer des services de vérifications dynamiques, pour aider à déboguer pendant la phase de développement.
API de développement
Les interfaces fournies sont classiques, et sont résumées ici:
Multithreading à niveaux de priorités, avec la possibilité de mélanger threadspréemptibles et coopératifs. Optionnellement, l'ordonnanceur préemptif peut allouer des quanta de temps via un mécanisme de type round-robin.
Gestion des interruptions, avec configuration statique ou dynamique des routines liées à chaque interruption.
Synchronisation: sémaphore (binaire ou à compteur), mutex.
Communication entre threads: file de messages, flux d'octets.