SiteWebAstrolabe/src/posts/tuto-debug-zephyr.md
2024-11-21 12:47:21 +01:00

5.3 KiB

title date type illustration description
Tutoriel développement embarqué 2024-02-02 news /images/posts/zephyr/zephyr-image.jpg Développeur embarqué expérimenté, je partage mon retour d'expérience sur le debug avec Zephyr OS.

Dans le cadre des mes missions de développeur embarqué sur plateforme libre depuis plus de 15 ans, j'ai dû mettre en place un certain nombre d'outils. Celui qui revient régulièrement est le debug. Lors de la phase de développement, le debug est indispensable mais nécessite d'avoir les équipements et les outils adaptés. Voici mon retour d'expérience sur ce sujet que je (Francois Bonningues) veux partager avec le système d'exploitation Zephyr OS. Cela comprend les traces sur la console et le debug avec un outil comme gdb.

L'objectif de ce tutorial est de déboguer une application basique d'exemple (blinky fourni par Zephyr) qui s'exécute sur une carte d'évaluation stm32F4 depuis un PC sous linux.

Environnement

Zephyr OS

L'installation de l'environnement est très bien documenté sur le site officiel:

https://docs.zephyrproject.org/latest/develop/getting_started/index.html

Matériels utilisés

Voici le matériel nécessaire pour cet exemple :

Compilation, flashage

Une fois l'environnnement installé sur le PC (ici dans mon répertoire home) et après y avoir branché la carte d'évaluation, il suffit de taper ces commandes:

cd ~/zephyrproject/zephyr
source ~/zephyrproject/.venv/bin/activate
west build -p always -b stm32f4_disco samples/basic/blinky
west flash

Débogage de l'application embarquée

Traces sur la console série

Les traces de l'application peuvent être observées via la liaison série. Les broches PA2, PA3 et GND de la carte d'évaluation doivent être reliées à un adaptateur USB TTL comme indiqué ci-dessous.



L'illustration ci-dessous montre les 3 fils connectés utilisés par la liaison série:



Ensuite lancer l'outil minicom (ou équivalent) sur /dev/ttyUSB0*.

* Remplacer le x de /dev/ttyUSB<x> par celui qui correspond à votre configuration. Pour le savoir, exécuter sudo dmesg.
A noter qu'il est sans doute nécessaire d'ajouter l'utilisateur au groupe dialout (sous debian) pour avoir accès à la console sans être root.

minicom -D /dev/ttyUSB0



Les traces s'affichent alors:



Debug en ligne de commande

Il est possible d'aller plus loin dans le debug notamment en exécutant le programme en pas à pas.

Il faut alors enlever les optimisations du compilateur. Pour cela, dans le fichier prj.conf (samples/basic/blinky/prj.conf), ajouter la ligne suivante:

CONFIG_NO_OPTIMIZATIONS=y

Ensuite depuis votre terminal, il suffit d'exécuter la commande:

west debug



Debug sous VisualStudio Code

Le debug peut être exécuté depuis l'IDE VisualStudio Code.

Exécuter visualStudio Code

(.venv) francois@debian-acer-fb:~/zephyrproject/zephyr$ code &



Ajouter l'extension Cortex-Debug

Installer l'extension Cortex-Debug.



Définir la configuration de Debug

Cela peut être fait via le menu View\Commande palette Ctrl-shift-P et en tapant Debug: Add configuration

Editer le fichier launch.json. En voici un exemple. Les chemins sont à modifier pour correspondre à votre environnement:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "openocd",
            "serverpath": "${env:HOME}/zephyr-sdk-0.16.4/sysroots/x86_64-pokysdk-linux/usr/bin/openocd",
            "cwd": "${workspaceRoot}",
            "executable": "./build/zephyr/zephyr.elf",
            "gdbPath": "${env:HOME}/zephyr-sdk-0.16.4/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb",
            "name": "Debug",
            "device": "STM32F407",
            "configFiles": [
                "${env:HOME}/zephyrproject/zephyr/boards/arm/stm32f4_disco/support/openocd.cfg"
            ],
        }
    ]
}



Exécution en pas à pas Placer un point d'arrêt et exécuter le programme via le menu Run\Start Debugging (touche F5). Le debugger s'exécute et s'arrête sur le point d'arrêt comme illustré dans l'exemple ci-dessous: