Zephyr est un système d’exploitation temps réel pour microcontrôleur. Parler d’OS peut parfois faire réagir puisqu’il n’y a pas vraiment de noyau (kernel) et que tout est compilé en un seul firmware que l’on télécharge dans la mémoire du micro.
Ce n’est pas le seul RTOS existant pour microcontrôleur. Il a le gros avantage cependant d’être soutenu par la fondation Linux. Les deux grandes forces de ce système sont sa documentation et le support de nombreux protocoles réseaux (avec ou sans fils).
C’est le parfait OS à tester sur le GD32VF de gigadevice. Cependant, le portage n’est pas terminé. Le processeur n’apparaît donc pas dans la documentation officielle. Le seul tutoriel (en japonais) que j’ai trouvé se trouve là. J’en ai fait une traduction semi-automatique ici.
La version de Zephyr patché correspondante se trouve ici.
Essayons ici d’appliquer ce tutoriel.
On vérifiera sur le site officiel que nous avons bien installé toutes les dépendances sur notre machine.
Zephyr a besoin d’un outils python nommé west, c’est un projet à part mais qui reste dans le giron de Zephyr.
$ python -m pip install west
$ west init ~/zephyrproject
$ cd ~/zephyrproject west update
$ python -m pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt
On supprime le git officiel de zephyr téléchargé avec west Puis puis on clone le fork Zephyr de Soburi:
$ rm -rf zephyr
$ git clone https://github.com/soburi/zephyr.git
$ cd zephyr
$ git checkout longan_nano_2_5_0
Langage du code : PHP (php)
Notez la branche remotes/origin/longan_nano
_2_5_0 qui contient le travail de portage sur la longan_nano.
On installe le SDK (attention ~1Go)
$ cd ~/zephyrproject
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.12.4/zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ chmod +x zephyr-sdk-0.12.4-x86_64-linux-setup.run
$ ./zephyr-sdk-0.12.4-x86_64-linux-setup.run -- -d ~/zephyr-sdk-0.12.4
$ export ZEPHYR_SDK_INSTALL_DIR=~/zephyr-sdk-0.12.4/
Langage du code : PHP (php)
Manque plus qu’à mettre à jour avec le nouveau zephyr (de soburi) patché :
$ cd ~/zephyrproject
$ west update
Puis nous pouvons compiler le hello world :
$ cd ~/zephyrproject/zephyr/
$ west build -p auto -b sipeed_longan_nano samples/basic/blinky
Langage du code : JavaScript (javascript)
Flashage sur la longan nano
Avec le jtag
Si tout s’est bien passé on doit pouvoir maintenant flasher le binaire sur la carte. J’utilise pour cela l’adaptateur jtag de sipeed.
$ pip3 install pyelftools
Pour le moment j’ai pas encore réussi. Mais ça doit pouvoir se faire puisque ça marche avec openocd.
Avec l’usb par dfu-util
Pour avoir un fonctionnement correct il faut utiliser une version à jour du git du projet :
$ cd ~/zephyrproject
$ git clone git://git.code.sf.net/p/dfu-util/dfu-util
$ cd dfu-util
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
Langage du code : PHP (php)
J’ai suivi les conseils d’un lecteur.
$ git clone https://github.com/riscv-mcu/gd32-dfu-utils.git
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
$ dfu-util -V
dfu-util 0.10-dev
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2021 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
Langage du code : PHP (php)
Puis, pour télécharger le binaire, taper la commande :
$ dfu-util -d,28e9:0189 -s 0x8000000:leave -a 0 -D build/zephyr/zephyr.bin
dfu-util 0.10-dev
Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2021 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/
dfu-util: Warning: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release
Opening DFU capable USB device…
Device ID 28e9:0189
Device DFU version 011a
Claiming USB DFU Interface…
Setting Alternate Interface #0 …
Determining device status…
DFU state(2) = dfuIDLE, status(0) = No error condition is present
DFU mode device DFU version 011a
Device returned transfer size 2048
DfuSe interface name: "Internal Flash "
Found GD32VF103, which reports a bad page size and count for its internal memory.
Fixed layout based on part number: page size 1024, count 128.
Downloading element to address = 0x08000000, size = 19308
Erase [=========================] 100% 19308 bytes
Erase done.
Download [=========================] 100% 19308 bytes
Download done.
File downloaded successfully
Qui télécharge bien le binaire visiblement, et fait clignoter la led.
Pour s’assurer que c’est bien notre programme qui clignote, on peut changer la couleur de clignotement en modifiant la ligne suivante dans le fichier samples/basic/blinky/src/main.c
:
# Ligne 16:
- define LED0_NODE DT_ALIAS(led0)
+ define LED0_NODE DT_ALIAS(led1)
Langage du code : PHP (php)
Et relancer la compilation avec west:
$ west build -p auto -b longan_nano samples/basic/blinky
[3/9] Linking C executable zephyr/zephyr_prebuilt.elf
[9/9] Linking C executable zephyr/zephyr.elf
Memory region Used Size Region Size %age Used
ROM: 19308 B 128 KB 14.73%
RAM: 4740 B 32 KB 14.47%
IDT_LIST: 0 GB 2 KB 0.00%
Puis retélécharger pour voir la led verte clignoter.
Utilisation de la toolchain Platformio
La toolchain se trouve ici.
Le sdk nuclei se trouve ici et peut être téléchargé là.
export ZEPHYR_TOOLCHAIN_VARIANT=cross-compile
export CROSS_COMPILE=/home/fabien/zephyrproject/nuclei/gcc/bin/riscv-nuclei-elf-
Langage du code : JavaScript (javascript)