{"id":6435,"date":"2024-10-15T05:00:49","date_gmt":"2024-10-15T04:00:49","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=6435"},"modified":"2024-10-15T11:52:23","modified_gmt":"2024-10-15T10:52:23","slug":"zephir-os-et-raspberry-pico-premiere-prise-en-main","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2024\/10\/15\/zephir-os-et-raspberry-pico-premiere-prise-en-main\/","title":{"rendered":"Zephyr OS  &#8211; 1 &#8211; D\u00e9couverte sur Raspberry Pi Pico"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"941\" height=\"786\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-00-2.png\" alt=\"\" class=\"wp-image-6522\" style=\"width:208px;height:auto\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-00-2.png 941w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-00-2-300x251.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-00-2-768x641.png 768w\" sizes=\"auto, (max-width: 941px) 100vw, 941px\" \/><\/figure><\/div>\n\n\n<p><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">Zephyr 0S<\/mark><\/strong> est un syst\u00e8me d&rsquo;exploitation temps r\u00e9el que l&rsquo;on peut utiliser sur de petits microcontr\u00f4leurs pour r\u00e9aliser des t\u00e2ches relativement simples avec un comportement temporel pr\u00e9cis.<\/p>\n\n\n\n<p>Nous allons l&rsquo;\u00e9tudier pendant quelques articles en nous appuyant sur des mod\u00e8les de microcontr\u00f4leurs r\u00e9pandus, peu co\u00fbteux et faciles \u00e0 se procurer comme le <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">Raspberry Pi Pico<\/mark><\/strong>.<\/p>\n\n\n\n<p><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">Attention&nbsp;: il s&rsquo;agit bien du \u00ab\u00a0Raspberry Pi Pico\u00a0\u00bb et <strong>pas<\/strong> du \u00ab\u00a0Raspberry Pi Pico<strong> 2<\/strong>\u00a0\u00bb sorti il y a quelques semaines<\/mark>. Ce dernier est architectur\u00e9 autour d&rsquo;un microcontr\u00f4leur diff\u00e9rent et n&rsquo;est pas encore support\u00e9 par Zephyr Os au moment de la r\u00e9daction de cet article.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-text-align-center\">&#8211;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Introduction<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Zephyr OS<\/h2>\n\n\n\n<p>Les microprocesseurs et microcontr\u00f4leurs sont omnipr\u00e9sents dans l&rsquo;informatique industrielle, dans l&rsquo;Internet des objets (<em>IOT<\/em>) et m\u00eame dans la plupart des \u00e9quipements \u00e9lectroniques que l&rsquo;on rencontre au quotidien. Lorsque la composante \u00ab\u00a0informatique\u00a0\u00bb d&rsquo;un \u00e9quipement est suffisamment importante, on d\u00e9l\u00e8gue le travail \u00e0 <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">un microprocesseur<\/mark><\/strong> sur lequel on fait tourner un <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">syst\u00e8me d&rsquo;exploitation<\/mark><\/strong> (<em>Operating System &#8211; OS<\/em>) comme <strong>Linux embarqu\u00e9<\/strong>.<\/p>\n\n\n\n<p>Lorsque le travail logiciel est relativement simple, r\u00e9p\u00e9titif et ne n\u00e9cessite pas de grosse capacit\u00e9 de calcul ou de stockage on se tourne vers <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">un microcontr\u00f4leur<\/mark><\/strong>. Les microcontr\u00f4leurs existent dans des gammes tr\u00e8s vari\u00e9es, de la famille des PIC \u00e0 celle des STM32 en passant par les AVR, LPC, etc. Cela offre un choix tr\u00e8s large pour le concepteur d&rsquo;un circuit.<\/p>\n\n\n\n<p>En contrepartie, les m\u00e9thodes de programmation pour acc\u00e9der aux fonctionnalit\u00e9s offertes par un microcontr\u00f4leur varient sensiblement d&rsquo;un mod\u00e8le \u00e0 l&rsquo;autre. Il est difficile d&rsquo;\u00e9crire du code portable d&rsquo;un microcontr\u00f4leur \u00e0 un autre, car ils n&rsquo;offrent pas de m\u00e9thodes de d\u00e9veloppement g\u00e9n\u00e9ralis\u00e9es.<\/p>\n\n\n\n<p>Mais heureusement des efforts ont \u00e9t\u00e9 r\u00e9alis\u00e9s pour offrir un socle commun, permettant de disposer d&rsquo;une interface de programmation (<em>Application Programming Interface &#8211; API<\/em>) standard et riche. Il s&rsquo;agit tout simplement de doter les microcontr\u00f4leurs d&rsquo;un OS sur lequel on peut appuyer le d\u00e9veloppement sp\u00e9cifique. Plusieurs syst\u00e8mes de ce type ont \u00e9t\u00e9 d\u00e9velopp\u00e9s&nbsp;: <em>\u00b5C\/OS<\/em>, <em>Contiki<\/em>, <em>RIOT<\/em>, etc. Nous allons nous int\u00e9resser \u00e0 <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">un OS pour microcontr\u00f4leurs<\/mark><\/strong> qui semblent de plus en plus actif aujourd&rsquo;hui&nbsp;: <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">Zephyr<\/mark><\/strong> <strong><strong>\u00ae<\/strong><\/strong> . Il s&rsquo;agit d&rsquo;une marque d\u00e9pos\u00e9e par la <em>Linux Foundation<\/em> qui g\u00e8re aujourd&rsquo;hui ce projet, initialement cr\u00e9\u00e9 par <em>Wind River<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Raspberry Pico<\/h2>\n\n\n\n<p>Depuis 2012, la <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Fondation_Raspberry_Pi\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"><strong>Fondation Raspberry Pi<\/strong><\/a> a produit de nombreux mod\u00e8les de \u00ab\u00a0<em>Single Board Computer<\/em>\u00a0\u00bb , petits ordinateurs monocartes n\u00e9cessitant simplement l&rsquo;ajout d&rsquo;un clavier, d&rsquo;un \u00e9cran, d&rsquo;une alimentation et d&rsquo;une carte micro-SD pour offrir toutes les fonctionnalit\u00e9s d&rsquo;un ordinateur classique. Ce sont tous les mod\u00e8les 1B\/B+\/A, 2B, 3B\/B+\/A, 4B\/A, 400, 5 ainsi que les petits Zero 1\/W\/2W.<\/p>\n\n\n\n<p>Un mod\u00e8le tr\u00e8s diff\u00e9rent a \u00e9t\u00e9 produit en 2021&nbsp;: le <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">Raspberry Pi Pico<\/mark><\/strong>. Il n&rsquo;est pas con\u00e7u autour d&rsquo;un microprocesseur mais autour d&rsquo;un micro-contr\u00f4leur (RP2040) sp\u00e9cifiquement con\u00e7u pour l&rsquo;occasion, avec 264Ko de RAM et 2Mo de m\u00e9moire flash int\u00e9gr\u00e9e. Une seconde version,  Raspberry Pi Pico 2, disponible depuis ao\u00fbt 2024, est construite autour d&rsquo;un nouveau micro-contr\u00f4leur (RP2350) et dispose de 4Mb de m\u00e9moire flash. Elle n&rsquo;est pas encore support\u00e9e par Zephyr.<\/p>\n\n\n\n<p>Malgr\u00e9 leur ressemblance, il est important de ne pas confondre le Raspberry Pi Zero (sur lequel on installe un syst\u00e8me Linux normal et des applications classiques) et le Raspberry Pi Pico qui ne peut contenir qu&rsquo;un OS minimal comme Zephyr et un volume de code assez r\u00e9duit.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"229\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/comparaison-pico-zero.png\" alt=\"\" class=\"wp-image-6945\"\/><\/figure><\/div>\n\n\n<p><\/p>\n\n\n\n<p>L\u00e0 o\u00f9 les Rasberry Pi classiques (y compris le Zero) peuvent faire penser \u00e0 un petit PC, le Pico est beaucoup plus proche de la famille des <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Arduino\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"><strong>Arduino<\/strong><\/a>.<\/p>\n\n\n\n<p class=\"has-text-align-center\">&#8211;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Pr\u00e9parations pr\u00e9liminaires<\/h1>\n\n\n\n<p>Je vais pr\u00e9parer sur un PC tournant sous Linux un fichier contenant l&rsquo;OS Zephyr et un petit code d&rsquo;exemple, pour pouvoir ensuite l&rsquo;installer sur un Raspberry Pi Pico.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Environnement de travail<\/h2>\n\n\n\n<p>Je cr\u00e9e <mark style=\"background-color:#ffff80\" class=\"has-inline-color\">un r\u00e9pertoire <code>Zephyr-lab<\/code><\/mark> dans mon arborescence pour stocker tous les \u00e9l\u00e9ments n\u00e9cessaires au d\u00e9veloppement pour Zephyr.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Python<\/h2>\n\n\n\n<p>Nous allons installer plusieurs outils Python sp\u00e9cifiques \u00e0 Zephyr (par exemple l\u2019outil de <em>build<\/em> <code>west<\/code>). Il est pr\u00e9f\u00e9rable de cr\u00e9er un <mark style=\"background-color:#ffff80\" class=\"has-inline-color\">environnement Python virtuel<\/mark> pour \u00e9viter de \u00ab\u00a0polluer\u00a0\u00bb notre installation Python globale.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Zephyr-Lab]$ <strong>sudo  apt install  -y  python3-venv<\/strong>\n\n&#91;Zephyr-Lab]$ <strong>python3 -m venv  .venv<\/strong>\n\n&#91;Zephyr-Lab]$ <strong>source .venv\/bin\/activate<\/strong>\n\n(.venv)&#91;Zephyr-Lab]$ <\/code><\/pre>\n\n\n\n<p>Le pr\u00e9fixe <code>(.venv)<\/code> au d\u00e9but du <em>prompt<\/em> du shell nous indique que nous utilisons cet environnement virtuel. Pour le quitter il suffit d\u2019utiliser la commande <code>deactivate<\/code>. Bien s\u00fbr il faudra r\u00e9activer l\u2019environnement (avec <code>source .venv\/bin\/activate<\/code> dans ce r\u00e9pertoire) \u00e0 chaque fois que nous lancerons un shell pour travailler avec Zephyr.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Outil de <em>build<\/em><\/h2>\n\n\n\n<p>Nous installons l\u2019outil de compilation de Zephyr. Il s\u2019appelle <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">west<\/mark><\/strong><\/code> (avant d&rsquo;\u00eatre un OS pour microcontr\u00f4leurs, le Z\u00e9phyr est un vent qui souffle de l\u2019ouest) et servira \u00e0 encadrer les appels \u00e0 <code>cmake<\/code> .<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;Zephyr-Lab]$ <strong>pip  install  west<\/strong>\n  &#91;...]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">SDK de Zephyr<\/h2>\n\n\n\n<p>Le <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">SDK<\/mark><\/strong> (<em>Software Development Kit<\/em>) est l&rsquo;ensemble de la <em>toolchain<\/em> (cha\u00eene de <em>cross-compilation<\/em>, permettant de g\u00e9n\u00e9rer du code pour le processeur cible) et des fichiers <em>headers<\/em> permettant d\u2019acc\u00e9der aux services de Zephyr.<\/p>\n\n\n\n<p>Je fais mes d\u00e9veloppements sur un PC Linux, je choisis donc le SDK en cons\u00e9quence. Il en existe en effet plusieurs versions&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>zephyr-sdk-0.16.8_linux-x86_64.tar.xz<\/code> pour Linux x86\/64 (par exemple un PC Linux),<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>zephyr-sdk-0.16.8_linux-aarch64.tar.xz<\/code> pour Linux Arm 64 (par exemple un Raspberry Pi 4 ou 5),<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>zephyr-sdk-0.16.8_macos-x86_64.tar.xz<\/code> pour MacOS sur x86\/64,<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>zephyr-sdk-0.16.8_macos-x86_64.tar.xz<\/code> pour MacOS sur Arm 64,<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>zephyr-sdk-0.16.8_windows-x86_64.7z<\/code> pour Windows sur x86\/64.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Le t\u00e9l\u00e9chargement se fait \u00e0 partir du d\u00e9p\u00f4t Gihub de <code>zephyrproject-rtos<\/code>.<\/p>\n\n\n\n<p>Une fois la <em>toolchain<\/em> d\u00e9compress\u00e9e, un script <code>setup.sh<\/code> vient configurer ses composants et enregistrer le package Cmake du SDK<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;Zephyr-lab]$ <strong>wget  <a href=\"https:\/\/github.com\/zephyrproject-rtos\/sdk-ng\/releases\/download\/v0.16.8\/zephyr-sdk-0.16.8_linux-x86_64.tar.xz\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">https:\/\/github.com\/zephyrproject-rtos\/sdk-ng\/releases\/download\/v0.16.8\/zephyr-sdk-0.16.8_linux-x86_64.tar.xz<\/a><\/strong>\n  &#91;...]\n(.venv)&#91;Zephyr-lab]$ <strong>tar  xf  zephyr-sdk-0.16.8_linux-x86_64.tar.xz <\/strong>\n(.venv)&#91;Zephyr-lab]$ <strong>cd  zephyr-sdk-0.16.8\/<\/strong>\n(.venv)&#91;zephyr-sdk-0.16.8]$ <strong>.\/setup.sh<\/strong>\nZephyr SDK 0.16.8 Setup\n\n** NOTE **\nYou only need to run this script once after extracting the Zephyr SDK\ndistribution bundle archive.\n\nInstall host tools &#91;y\/n]? <strong>y<\/strong>\nRegister Zephyr SDK CMake package &#91;y\/n]? <strong>y<\/strong>\n\nInstalling host tools ...\n\nAll done.\nPress any key to exit ...\n\n(.venv)&#91;zephyr-sdk-0.16.8]$ <strong>cd ..<\/strong>\n\n(.venv)&#91;Zephyr-lab]$ <strong>rm  zephyr-sdk-0.16.8_linux-x86_64.tar.xz<\/strong>\n\n(.venv)&#91;Zephyr-lab]$<\/code><\/pre>\n\n\n\n<p>Lors de l&rsquo;installation du SDK, un package Cmake a \u00e9t\u00e9 enregistr\u00e9 pour trouver l&rsquo;acc\u00e8s \u00e0 la <em>toolchain<\/em> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;zephyr-sdk-0.16.8]$ <strong>ls  -l  ~\/.cmake\/packages\/Zephyr-sdk\/<\/strong>\ntotal 4\n-rw-rw-r-- 1 cpb cpb 51 ao\u00fbt   7 17:09 d901fd4ba9b608aa29d7f5c12d60fef3\n\n(.venv)&#91;zephyr-sdk-0.16.8]$ <strong>cat  ~\/.cmake\/packages\/Zephyr-sdk\/d901fd4ba9b608aa29d7f5c12d60fef3<\/strong> \n\/home\/Builds\/Lab\/Zephyr-lab\/zephyr-sdk-0.16.8\/cmake\n(.venv)&#91;zephyr-sdk-0.16.8]$ <\/code><\/pre>\n\n\n\n<p class=\"has-text-align-center\">&#8211;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Exemple de base de Zephyr<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Installation du <em>kernel<\/em><\/h2>\n\n\n\n<p>Nous initialisons un r\u00e9pertoire de <em>build<\/em> nomm\u00e9 <code>zephyr-project<\/code> . Pour cela nous utilisons la commande <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">west init<\/mark><\/strong><\/code> . Celle-ci va cloner un <em>repository<\/em> Github contenant entre autres un <code>manifest<\/code> listant les autres d\u00e9p\u00f4ts \u00e0 cloner.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;Zephyr-lab]$ <strong>west  init  zephyr-project<\/strong>\n=== Initializing in \/home\/Builds\/Lab\/Zephyr-lab\/zephyr-project\n--- Cloning manifest repository from https:\/\/github.com\/zephyrproject-rtos\/zephyr\nCloning into '\/home\/Builds\/Lab\/Zephyr-lab\/zephyr-project\/.west\/manifest-tmp'...\nremote: Enumerating objects: 1088209, done.\nremote: Counting objects: 100% (231\/231), done.\nremote: Compressing objects: 100% (138\/138), done.\nremote: Total 1088209 (delta 101), reused 156 (delta 89), pack-reused 1087978\nReceiving objects: 100% (1088209\/1088209), 650.48 MiB | 25.04 MiB\/s, done.\nResolving deltas: 100% (821755\/821755), done.\nUpdating files: 100% (36170\/36170), done.\n--- setting manifest.path to zephyr\n=== Initialized. Now run \"west update\" inside \/home\/Builds\/Lab\/Zephyr-lab\/zephyr-project.\n\n(.venv)&#91;Zephyr-lab]$ <\/code><\/pre>\n\n\n\n<p>Le r\u00e9pertoire cr\u00e9\u00e9 contient un sous-r\u00e9pertoire avec la configuration de <code>west<\/code> et un second avec les sources du kernel Zephyr&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;Zephyr-lab]$ <strong>ls  -a  zephyr-project\/<\/strong>\n.  ..  .west  zephyr\n\n(.venv)&#91;Zephyr-lab]$ <strong>ls  -a  zephyr-project\/.west\/<\/strong>\n.  ..  config\n\n(.venv)&#91;Zephyr-lab]$ <strong>ls  -a  zephyr-project\/zephyr\/<\/strong>\n.                   doc                Kconfig.zephyr   share\n..                  drivers            kernel           snippets\narch                dts                lib              soc\nboards              .editorconfig      LICENSE          submanifests\n.checkpatch.conf    .git               .mailmap         subsys\n.clang-format       .gitattributes     MAINTAINERS.yml  tests\ncmake               .github            misc             VERSION\nCMakeLists.txt      .gitignore         modules          version.h.in\n.codecov.yml        .gitlint           README.rst       west.yml\nCODE_OF_CONDUCT.md  include            samples          .yamllint\nCODEOWNERS          Kconfig            scripts          zephyr-env.cmd\nCONTRIBUTING.rst    Kconfig.constants  SDK_VERSION      zephyr-env.sh\n(.venv)&#91;Zephyr-lab]$ <\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"919\" height=\"656\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-01.png\" alt=\"\" class=\"wp-image-6463\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-01.png 919w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-01-300x214.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-01-768x548.png 768w\" sizes=\"auto, (max-width: 919px) 100vw, 919px\" \/><\/figure>\n\n\n\n<p>Comme la commande <code>west init<\/code> nous y invitait, nous allons ex\u00e9cuter <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">west update<\/mark><\/strong><\/code> pour mettre \u00e0 jour tous les modules n\u00e9cessaires (cela rappelle un peu la commande <code>git submodule update<\/code>).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;Zephyr-lab]$ <strong>cd  zephyr-project\/<\/strong>\n\n(.venv)&#91;zephyr-project]$ <strong>west  update<\/strong>\n=== updating acpica (modules\/lib\/acpica):\n--- acpica: initializing\nInitialized empty Git repository in \/home\/Builds\/Lab\/Zephyr-lab\/zephyr-project\/modules\/lib\/acpica\/.git\/\n  &#91;...]\n * &#91;new tag]         inital-pr         -&gt; inital-pr\n * &#91;new tag]         old-structure     -&gt; old-structure\nHEAD is now at 75d0880 tests: Update mps2 board name\nHEAD is now at 75d0880 tests: Update mps2 board name\n(.venv)&#91;zephyr-project]$ \n&#91;...]\nSuccessfully installed Deprecated-1.2.14 MarkupSafe-2.1.5 Pillow-10.4.0 PyGithub-2.3.0 anytree-2.12.1 appdirs-1.4.4 arrow-1.2.3 astroid-3.2.4 bz-1.0 canopen-2.3.0 capstone-4.0.2 cbor-1.0.0 cbor2-5.6.4 certifi-2024.7.4 cffi-1.17.0 charset-normalizer-3.3.2 clang-format-18.1.8 click-8.1.3 cmsis-pack-manager-0.5.3 colorlog-6.8.2 coverage-7.6.1 cryptography-43.0.0 dill-0.3.8 exceptiongroup-1.2.2 gcovr-7.2 gitlint-0.19.1 gitlint-core-0.19.1 graphviz-0.20.3 grpcio-1.65.4 grpcio-tools-1.65.4 idna-3.7 imgtool-2.1.0 importlib-metadata-8.2.0 importlib-resources-6.4.0 iniconfig-2.0.0 intelhex-2.3.0 intervaltree-3.1.0 isort-5.13.2 jinja2-3.1.4 junit2html-31.0.2 junitparser-3.1.2 lark-1.1.9 libusb-package-1.0.26.2 lpc_checksum-3.0.0 lxml-5.2.2 mccabe-0.7.0 mock-5.1.0 msgpack-1.0.8 mypy-1.11.1 mypy-extensions-1.0.0 natsort-8.4.0 pathspec-0.12.1 platformdirs-4.2.2 pluggy-1.5.0 ply-3.11 prettytable-3.10.2 progress-1.6 protobuf-5.27.3 psutil-6.0.0 pycparser-2.22 pyelftools-0.31 pygments-2.18.0 pyjwt-2.9.0 pylink-square-1.2.1 pylint-3.2.6 pynacl-1.5.0 pyocd-0.36.0 pyserial-3.5 pytest-8.3.2 python-can-4.4.2 python-magic-0.4.27 pyusb-1.2.1 regex-2024.7.24 requests-2.32.3 sh-1.14.3 sortedcontainers-2.4.0 tabulate-0.9.0 tomli-2.0.1 tomlkit-0.13.0 typing-extensions-4.12.2 urllib3-2.2.2 wcwidth-0.2.13 wrapt-1.16.0 yamllint-1.35.1 zcbor-0.8.1 zipp-3.19.2\n<\/code><\/pre>\n\n\n\n<p>Nous terminons la pr\u00e9paration du r\u00e9pertoire en installant <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">les modules Python suppl\u00e9mentaires<\/mark><\/strong> r\u00e9clam\u00e9s par Zephyr&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;zephyr-project]$ <strong>pip  install  -r  zephyr\/scripts\/requirements.txt<\/strong>\n  &#91;...]\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Compilation pour Raspberry Pi Pico<\/h2>\n\n\n\n<p>Le dossier du <em>kernel<\/em> Zephyr que nous avons install\u00e9 plus haut contient un sous-r\u00e9pertoire <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">samples\/<\/mark><\/strong><\/code> avec plusieurs exemples des possibilit\u00e9s de l&rsquo;OS.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;zephyr-project]$ <strong>cd  zephyr\/<\/strong>\n\n(.venv)&#91;zephyr]$ <strong>ls  samples\/<\/strong>\napplication_development  fuel_gauge    sample_definition_and_criteria.rst\narch                     hello_world   sensor\nbasic                    index.rst     shields\nbluetooth                kernel        subsys\nboards                   modules       synchronization\nclassic.rst              net           sysbuild\ncpp                      philosophers  tfm_integration\ndrivers                  posix         userspace\n\n<\/code><\/pre>\n\n\n\n<p>Nous allons nous int\u00e9resser aux plus simples des exemples, dans le sous-r\u00e9pertoire <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">basic\/<\/mark><\/strong><\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n(.venv)&#91;zephyr]$ <strong>ls  samples\/basic\/<\/strong>\nbasic.rst  blinky_pwm  custom_dts_binding  hash_map  rgb_led      sys_heap\nblinky     button      fade_led            minimal   servo_motor  threads\n<\/code><\/pre>\n\n\n\n<p>L&rsquo;\u00e9quivalent pour les syst\u00e8mes embarqu\u00e9s du classique \u00ab\u00a0<em>Hello World<\/em>\u00a0\u00bb s&rsquo;appelle <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">blinky<\/mark><\/strong><\/code>, c&rsquo;est le clignotement d&rsquo;une led.<\/p>\n\n\n\n<p>Nous pouvons demander \u00e0 <code>west<\/code> de compiler cet exemple en lui pr\u00e9cisant via son option <code>-b<\/code> le nom du microcontr\u00f4leur concern\u00e9 <code>rpi_pico<\/code>. Pour conna\u00eetre la liste des cartes connues par Zephyr,  voir le <a href=\"#sources\"><strong>lien ci-dessous<\/strong><\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n(.venv)&#91;zephyr]$ <strong>west  build  -b rpi_pico  samples\/basic\/blinky<\/strong>\n-- west build: generating a build system\nLoading Zephyr default modules (Zephyr base).\n-- Application: \/home\/Builds\/Lab\/Zephyr-lab\/zephyr-project\/zephyr\/samples\/basic\/blinky\n &#91;...]\n&#91;2\/2] Linking ASM executable boot_stage2\n&#91;134\/134] Linking C executable zephyr\/zephyr.elf\nMemory region         Used Size  Region Size  %age Used\n      BOOT_FLASH:         256 B        256 B    100.00%\n           FLASH:       15432 B    2096896 B      0.74%\n             RAM:        3968 B       264 KB      1.47%\n        IDT_LIST:          0 GB        32 KB      0.00%\nGenerating files from \/home\/Builds\/Lab\/Zephyr-lab\/zephyr-project\/zephyr\/build\/zephyr\/zephyr.elf for board: rpi_pico\nConverted to uf2, output size: 31744, start address: 0x10000000\nWrote 31744 bytes to zephyr.uf2\n(.venv)&#91;zephyr]$ <\/code><\/pre>\n\n\n\n<p>En sortie du build, un message nous annonce la cr\u00e9ation d\u2019un fichier <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">.uf2<\/mark><\/strong><\/code>.<\/p>\n\n\n\n<p>Le format UF2 (pour \u201c<em>USB Flashing Format<\/em>\u201d ), d\u00e9velopp\u00e9 par Microsoft est pr\u00e9vu pour flasher des microcontr\u00f4leurs en utilisant l\u2019interface \u201c<em>mass storage<\/em>\u201d .<\/p>\n\n\n\n<p>Le Raspberry Pi Pico poss\u00e8de une telle interface, il suffit de le connecter au PC avec un c\u00e2ble de connexion USB\/micro-USB en maintenant son <mark style=\"background-color:#ffff80\" class=\"has-inline-color\">bouton \u201c<em><strong>Bootsel<\/strong><\/em>\u201d press\u00e9 pendant le banchement<\/mark>. Sur le PC une interface est d\u00e9tect\u00e9e au bout de cinq secondes environ, semblable \u00e0 une cl\u00e9 USB habituelle. C&rsquo;est probablement la m\u00e9thode la plus simple pour flasher un microcontr\u00f4leur (nous en verrons d&rsquo;autres dans les prochains articles).<\/p>\n\n\n\n<p>Cinq secondes apr\u00e8s avoir raccord\u00e9 mon Raspberry Pico \u00e0 mon PC de d\u00e9veloppement, je le vois appara\u00eetre dans mon arborescence&nbsp;: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv) &#91;zephyr]$ <strong>lsblk<\/strong>\nNAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS\n  &#91;...]\nsdd           8:48   1   128M  0 disk \n\u2514\u2500sdd1        8:49   1   128M  0 part \/media\/cpb\/RPI-RP2\n  &#91;...]\n\n(.venv)&#91;zephyr]$ <strong>ls  \/media\/cpb\/RPI-RP2\/<\/strong>\nINDEX.HTM  INFO_UF2.TXT<\/code><\/pre>\n\n\n\n<p>Les fichiers pr\u00e9sents sur le Pico sont des documentations nous indiquant que c&rsquo;est bien l&#8217;emplacement o\u00f9 nous devons copier le fichier <code>.uf2<\/code> . Il faut \u00e0 pr\u00e9sent trouver ce fichier dans l&rsquo;arborescence de Zephyr&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;zephyr]$ <strong>find  .  -name '*.uf2'<\/strong>\n.\/build\/zephyr\/zephyr.uf2<\/code><\/pre>\n\n\n\n<p>Tout logiquement, le fichier se trouve dans le sous-dossier <code>build\/<\/code>.<\/p>\n\n\n\n<p>Je copie le fichier, et d\u00e8s que la copie est termin\u00e9e, <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">le microcontr\u00f4leur se r\u00e9initialise<\/mark><\/strong> et commence \u00e0 ex\u00e9cuter le code.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;zephyr]$ <strong>cp  build\/zephyr\/zephyr.uf2  \/media\/cpb\/RPI-RP2\/<\/strong>\n\n(.venv)&#91;zephyr]$ <\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"273\" height=\"460\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/ezgif.com-animated-gif-maker.gif\" alt=\"\" class=\"wp-image-6473\"\/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Interface s\u00e9rie<\/h2>\n\n\n\n<p>Nous \u00e9tudierons dans le prochain article la structure d&rsquo;un r\u00e9pertoire pour une application. Voyons juste le fichier <code>samples\/basic\/blinky\/src\/main.c<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\n * Copyright (c) 2016 Intel Corporation\n *\n * SPDX-License-Identifier: Apache-2.0\n *\/\n\n#include &lt;stdio.h&gt;\n#include &lt;zephyr\/kernel.h&gt;\n#include &lt;zephyr\/drivers\/gpio.h&gt;\n\n\/* 1000 msec = 1 sec *\/\n#define SLEEP_TIME_MS   1000\n\n\/* The devicetree node identifier for the \"led0\" alias. *\/\n#define LED0_NODE DT_ALIAS(led0)\n\n\/*\n * A build error on this line means your board is unsupported.\n * See the sample documentation for information on how to fix this.\n *\/\nstatic const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);\n\nint main(void)\n{\n        int ret;\n        bool led_state = true;\n\n        if (!gpio_is_ready_dt(&amp;led)) {\n                return 0;\n        }\n\n        ret = gpio_pin_configure_dt(&amp;led, GPIO_OUTPUT_ACTIVE);\n        if (ret &lt; 0) {\n                return 0;\n        }\n\n        while (1) {\n                ret = gpio_pin_toggle_dt(&amp;led);\n                if (ret &lt; 0) {\n                        return 0;\n                }\n\n                led_state = !led_state;\n                <mark style=\"background-color:#ffff80\" class=\"has-inline-color\">printf(\"LED state: %s\\n\", led_state ? \"ON\" : \"OFF\");<\/mark>\n                k_msleep(SLEEP_TIME_MS);\n        }\n        return 0;\n}<\/code><\/pre>\n\n\n\n<p>Outre le clignotement de la LED, nous pouvons apercevoir, dans la boucle principale une ligne \u00ab\u00a0<code>printf(\"LED state...\");<\/code>\u00a0\u00bb qui indique que ce programme affiche un message sur sa sortie standard.<\/p>\n\n\n\n<p>Suivant l&rsquo;\u00e9tat d&rsquo;un param\u00e8tre de configuration, Zephyr redirige la sortie standard vers l&rsquo;interface s\u00e9rie principale du microcontr\u00f4leur (la plupart des microcontr\u00f4leurs ont plusieurs interfaces s\u00e9ries). Pour le Raspberry Pi Pico, cette interface est l<mark style=\"background-color:#ffff80\" class=\"has-inline-color\">&lsquo;<strong>UART0<\/strong><\/mark> dont les connecteurs sont <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><code>TX<\/code> sur la broche 1<\/mark><\/strong>, et <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><code>RX<\/code> sur la broche 2<\/mark><\/strong>. En outre nous avons une masse <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><code>GND<\/code> sur la broche 3<\/mark><\/strong>, nous pouvons donc utiliser un petit adaptateur USB-S\u00e9rie comme pour le port s\u00e9rie du Raspberry Pi classique.<\/p>\n\n\n\n<p>Attention toutefois, sur les Raspberry Pi habituel (1B, 2B, 3B, 3B+, 4, 5, etc.) l&rsquo;ordre des broches est <code>GND<\/code>&#8211;<code>TX<\/code>&#8211;<code>RX<\/code> alors qu&rsquo;avec le Pico c&rsquo;est <code>GND<\/code>&#8211;<code>RX<\/code>&#8211;<code>TX<\/code>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"844\" height=\"1024\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-02-844x1024.png\" alt=\"\" class=\"wp-image-6476\" style=\"width:334px;height:auto\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-02-844x1024.png 844w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-02-247x300.png 247w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-02-768x931.png 768w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/zephyr-pico-02.png 874w\" sizes=\"auto, (max-width: 844px) 100vw, 844px\" \/><\/figure><\/div>\n\n\n<p>Une fois la connexion physique \u00e9tablie, je lance sur mon PC le terminal s\u00e9rie <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">minicom<\/mark><\/strong><\/code> (dont la sortie est facile \u00e0 capturer dans le cadre de cet article), mais il est possible d&rsquo;utiliser de nombreuses variantes <code>putty<\/code>, <code>tio<\/code>, <code>picocom<\/code>, <code>gtkterm<\/code>, <code>cutecom<\/code>, etc.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>(.venv)&#91;zephyr]$ <strong>minicom<\/strong>\n\nWelcome to minicom 2.8\n\nOPTIONS: I18n \nPort \/dev\/ttyUSB0, 07:46:09\n\nPress CTRL-A Z for help on special keys<\/code><\/pre>\n\n\n\n<p>Apr\u00e8s avoir branch\u00e9 l&rsquo;alimentation du Raspberry Pico, j&rsquo;observe sur la sortie&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*** Booting Zephyr OS build v3.7.0-711-gd590c1867284 ***\nLED state: OFF\nLED state: ON\nLED state: OFF\nLED state: ON\nLED state: OFF\nLED state: ON\nLED state: OFF\nLED state: ON\nLED state: OFF\nLED state: ON\nLED state: OFF\nLED state: ON\nLED state: OFF\nLED state: ON\nLED state: OFF\nLED state: ON\nLED state: OFF<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"sources\">Sources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Liste des cartes support\u00e9es par Zephyr OS&nbsp;: <a href=\"https:\/\/docs.zephyrproject.org\/latest\/boards\/index.html\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"><strong>https:\/\/docs.zephyrproject.org\/latest\/boards\/index.html<\/strong><\/a> <\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\">&#8211;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>Nous voyons que l&rsquo;installation et l&rsquo;utilisation de Zephyr sur un microcontr\u00f4leur est assez simple, l&rsquo;outil <code>west<\/code> offre une interface simple pour configurer, compiler et installer le code sur la cible. Nous n&rsquo;avons pas utilis\u00e9 <code>west<\/code> pour installer le code ci-dessus sur le Raspberry Pico car ce dernier offre une m\u00e9thode beaucoup plus simple, mais nous l&rsquo;utiliserons dans un article \u00e0 venir.<\/p>\n\n\n\n<p class=\"has-text-align-center\">&#8211;<\/p>\n\n\n\n<p>Nous avons compil\u00e9 un exemple tout fait, sans modifier quoique ce soit. Nous verrons dans le prochain article comment d\u00e9velopper <strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">notre propre code<\/mark><\/strong> et le compiler avec Zephyr.<\/p>\n\n\n\n<p class=\"has-text-align-center\">&#8211;<\/p>\n\n\n\n<p>Si vous pr\u00e9f\u00e9rez assister \u00e0 une session de formation sur \u00ab&nbsp;Zephyr OS&nbsp;\u00bb en mode pr\u00e9sentiel ou distanciel, ou disposer d&rsquo;une assistance technique personnalis\u00e9e pour vos d\u00e9veloppement n\u2019h\u00e9sitez pas \u00e0 <a href=\"mailto:christophe.blaess@logilin.fr\"><strong><mark style=\"background-color:#c7efdb\" class=\"has-inline-color\">me contacter<\/mark><\/strong><\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Zephyr 0S est un syst&egrave;me d&rsquo;exploitation temps r&eacute;el que l&rsquo;on peut utiliser sur de petits microcontr&ocirc;leurs pour r&eacute;aliser des t&acirc;ches relativement simples avec un comportement temporel pr&eacute;cis. Nous allons l&rsquo;&eacute;tudier pendant quelques articles en nous appuyant sur des mod&egrave;les de microcontr&ocirc;leurs r&eacute;pandus, peu co&ucirc;teux et faciles &agrave; se procurer comme le Raspberry Pi Pico. Attention&nbsp;: [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,16,11,25],"tags":[],"class_list":["post-6435","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-microcontroleur","category-raspberry-pi","category-zephyros"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/6435","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=6435"}],"version-history":[{"count":50,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/6435\/revisions"}],"predecessor-version":[{"id":6956,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/6435\/revisions\/6956"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=6435"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=6435"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=6435"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}