Journal Écrire son OS - Partie 1 : préparer le terrain

35
18
fév.
2015

Bonjour à tous,

Pour ce premier journal, je vous propose de vous raconter un peu les différentes étapes de mon projet du moment : écrire un petit OS pour un microcontrôleur STM32.

De quoi ça s'agit ?

J'ai récupéré une carte de développement construite autour d'un STM32F103RBT6. C'est un microcontrôleur basé sur un cœur ARM Cortex-M3. Il est un peu daté mais bon, on fait avec ce qu'on a (surtout quand c'est gratuit :). Pour situer un peu le bouzin, c'est un micro 32 bits qui embarque 20Ko de SRAM et 128Ko de Flash, plus un certain nombre de périphériques habituels (UART, SPI, I²C…).
La carte de dev est une MCBSTM32 de chez Keil. Le but du jeu c'est donc d'écrire un petit noyau capable de faire tourner une application sur ce chip.
Il ne s'agit pas de faire un truc de dingue (nothing big and professional like GNU), mais vraiment d'apprendre en faisant le plus simple et clair possible.

Récupérer de la doc

Bon allez c'est parti, la première des choses à faire c'est de récupérer toutes les docs susceptibles de nous servir :

  • le schéma de la carte
  • le programming manual du cœur Cortex-M3
  • la datasheet de la "famille" du chip (STM32F10xxx)
  • la datasheet du chip en lui-même
  • le Flash programming manual. Celui-là nous servira plus tard, une fois le développement un peu avancé, pour écrire du code capable de reprogrammer la Flash du micro (ceci afin de pouvoir mettre à jour le programme sans devoir sortir le JTAG).

Ensuite ? Ben y'a plus qu'à lire tout ça… Ça devrait vous occuper un certain temps. On lit jusqu'à ce qu'on ait une idée claire du boulot qui nous attend pour écrire un code qui démarre sur cette carte.

Préparer la boîte à outils

Une fois qu'on a bien digéré la doc, reste une étape avant de se lancer comme un dingue dans le code : préparer ses outils de développement.
Les ingrédients pour bien réussir cette recette sont :

  • une toolchain de cross-compilation pour notre cible (arm-none-eabi). Chez moi ça revient à sudo apt-get install gcc-arm-none-eabi binutils-arm-none-eabi
  • un cross debugger (sudo apt-get install gdb-arm-none-eabi)
  • une sonde JTAG qui nous servira à programmer et debugger le programme sur le chip. Sans vouloir faire de pub, j'ai opté pour ça. Ça fonctionne bien sous Linux et c'est un poil moins cher qu'une sonde Lauterbach à 3000€ ;)
  • enfin, un OpenOCD, un programme sympa qui fait le traducteur entre votre sonde JTAG et GDB (sudo apt-get install openocd)

Ah et il nous faudra aussi un peu de make, du git et un éditeur de texte, mais je suppose que vous avez déjà tout ça…

Voilà, c'est tout pour cette fois, on se retrouve bientôt pour parler de la config des outils et commencer à écrire du code !

PS: il est où le code ?

Pour ceux que ça intéresse, le code est libre (licence BSD) et hébergé sur Github (pour faire plaisir aux trolls). Évidemment c'est un travail en cours, qui progresse suivant mes envies et mon temps libre.

  • # uC-OS

    Posté par (page perso) . Évalué à 3.

    C'est un projet intéressant !

    Pour avoir cherché un RTOS pour un SoC maison à base d'ARM7TDMI (un peu vieillot mais toujours bon niveau gates/royalties), j'ai rapidement adopté uC-OSIII dont le code est vraiment ultra propre et très portable (je l'ai même porté sur RISC maison en quelques jours).
    http://micrium.com/downloadcenter/micrium-source-code/
    Le code du coeur est dispo en téléchargement pour des buts éducatifs et d'évaluation, et même s'il est marqué non fonctionnel, il l'est !

    Bref, en refaisant/simplifiant le portage ARM et du RISC maison, ça permet d'avoir un exemple assez simple et bien écrit pour toute la partie démarrage et changement de tâches.

    J'ai hâte de voir la suite (et peut être contribuer vu que je vais bientôt bosser avec un STM32F4, assez similaire mais avec un FPU) !

    • [^] # Re: uC-OS

      Posté par (page perso) . Évalué à 2.

      Aussi, je pensais, tu peux utiliser le CMSIS de ARM pour éviter ré-écrire un énième fois le support du Cortex-M3 :
      http://www.arm.com/products/processors/cortex-m/cortex-microcontroller-software-interface-standard.php
      c'est utilisé par ST dans leur SDK.
      Selon mbed le code téléchargé est sous licence BSD, à vérifier…

      • [^] # Re: uC-OS

        Posté par . Évalué à 1.

        En fait je ne compte pas réutiliser de code existant pour deux raisons : d'abord tout existe déjà, donc si on va par là il ne reste pas grand-chose à faire soi-même :) Ensuite j'ai volontairement choisi de tout refaire pour le plaisir d'apprendre, tout simplement. Ce qui implique aussi que comme je vais tout coder moi-même, il y aura sûrement pas mal de bugs ! C'est pour ça que j'ai précisé qu'il ne s'agissait pas de faire un truc stable et professionnel, mais bien quelque chose de didactique.

    • [^] # Re: uC-OS

      Posté par . Évalué à 0.

      Perso, j'utilise Mutekh (http://www.mutekh.org), y a le support cpu type ARM7TDMI, ARMv6, et bien d'autre (le portage a déjà été fait pour une carte STM32F401). Le noyau est ultra modulaire et très très léger.

  • # Dev STM32

    Posté par (page perso) . Évalué à 5.

    Je ne sais pas si tu utilises eclipse pour développer mais il existe un plugin sympa pour vérifier les différents registre de certains STM32 (et plus) : http://embsysregview.sourceforge.net/
    De plus il existe une lib permettant d'accéder facilement aux différentes fonctions :
    http://www.st.com/web/en/catalog/tools/PF258157

    S'il y a un problème, il y a une solution; s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

  • # Dépêche !

    Posté par (page perso) . Évalué à 7.

    Super instructif !

    Pour la suite, ça mérite bien mieux qu'un journal. Propose la suite en dépêche, soit via l'espace de rédaction collaboratif, si tu souhaites une relecture «massive» post-publication, soit en proposant ta dépêche directement à la modération :-)

  • # J'ai bien lue STM32

    Posté par (page perso) . Évalué à 5.

    Et j'ai penser a la bitbox un projet de console OpenHardware (une petit conf vidéo), qui apriori utilise un puce de la même famille, c'est certainement totalement différent, je ne mis connais pas suffisamment en hardware pour le savoir. C'était juste pour signaler ce projet qui est plus tôt sympa, et qui utilise une puce de la même famille.

  • # Bonne idée, un tuto d'OS pour uC

    Posté par . Évalué à 2.

    Super idée !

    Je vais suivre ça au fur et à mesure et tenter une adaptation sur PIC32.
    A+

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.