IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Voir le flux RSS

Le blog de f-leb

[Actualit�] [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code

Noter ce billet
par , 02/06/2023 � 09h00 (5189 Affichages)
Mon #@�* de code ne fonctionne pas ! Mais vous me croyez si je vous dis que je l'ai fait expr�s ?
Parce qu'apr�s avoir mis en place tout l'environnement avec ma sonde (voir D�boguer la Raspberry Pi Pico avec une sonde dans Visual Studio Code), il fallait bien mettre en place un sc�nario de d�bogage...

#@�*-de-code.c
Code c : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include "pico/stdlib.h"
 
void four_digits(uint8_t *t, uint number);
 
int main()
{
    stdio_init_all();
    sleep_ms(3000);
 
    uint8_t p[4], q[4];
 
    four_digits(p, 5678u);
    four_digits(q, 124u);
 
    /* ----- débogage avec printf() ------ */
    for (uint8_t i = 0; i < 4; i++)
    {
        printf("%d ", p[i]);
    }
 
    printf("\r\n");
 
    for (uint8_t i = 0; i < 4; i++)
    {
        printf("%d ", q[i]);
    }
 
    printf("\r\n");
 
    return 0;
}
 
void four_digits(uint8_t *t, uint number)
{ /*  Remplit un tableau de 4 entiers passé en argument
      avec chaque chiffre du nombre 'number' (alignement à droite)
      exemple : avec four_digits(p, 124u)
      p[0]=0, p[1]=1, p[2]=2, p[3]=4 */
 
    if (number > 9999u)
        number = 9999u;
 
    uint8_t i = 0;
    while (number)
    {
        t[3 - i] = number % 10u;
        number /= 10u;
        i++;
    }
}

La fonction four_digits() doit compl�ter un tableau de taille 4 avec les diff�rents chiffres qui constituent le nombre pass� en param�tre (nombre < 9999).
Par exemple avec four_digits(p, 5678u), ont doit obtenir p[0]=5, p[1]=6, p[2]=7, et p[3]=8.

L'algorithme est simple, une histoire de division enti�re par 10 et de son reste... La fonction pourra servir plus tard � afficher un nombre entier sur un afficheur 7-segments � quatre digits.

Pourtant tout compile bien, mais mes printf() en retour dans un terminal m'affichent 100 1 2 4 pour l'appel four_digits(p, 124u) alors que j'ai bien 5 6 7 8 comme pr�vu pour l'appel four_digits(p, 5678u)... D'o� vient cette valeur 100, qu'est-ce que c'est que ce bin's ?

Nom : bogue1.jpg
Affichages : 11350
Taille : 108,1 Ko

Le lecteur averti a sans doute d�j� trouv� ce qui clochait, mais le but du jeu est de voir comment on pourrait d�busquer la boulette gr�ce � la sonde.
Quand on appuie sur l�ic�ne du bouton Ex�cuter et d�boguer � gauche (ou par Ctrl+Maj+d), et que l�on clique sur la fl�che verte d�marrer le d�bogage (F5) , la session de d�bogage d�bute avec une premi�re pause � un point d�arr�t provisoire � l'entr�e du main() :

Nom : breakpoint1.jpg
Affichages : 4938
Taille : 35,9 Ko

En cliquant au d�but de la ligne 14, on rajoute un point d'arr�t (le point rouge) pour que le programme fasse une pause apr�s la sortie de l'appel four_digits(p, 5678u). On sait qu'� cette �tape, le r�sultat renvoy� est correct.

Nom : breakpoint2.jpg
Affichages : 4919
Taille : 19,8 Ko

On doit cliquer ici sur le bouton Continuer (F5) pour d�rouler le programme jusqu'au prochain point d'arr�t � la ligne 14. On voit en effet dans la section Variables � gauche que le tableau p est bien renseign� avec les valeurs 5, 6, 7 et 8, comme attendu.

Nom : breakpoint3.jpg
Affichages : 4952
Taille : 72,9 Ko

Ici, il faut cliquer sur pas � pas d�taill� (F11) pour justement rentrer dans le d�tail de la fonction. On aper�oit que l'argument 124 est bien pass� en param�tre � la fonction. On peut d'ailleurs voir la valeur du param�tre number au passage de la souris sur la variable (number=124).

Nom : breakpoint4.jpg
Affichages : 4929
Taille : 82,6 Ko

Ici, on avance un peu plus vite jusqu'au while. On rajoute un point d'arr�t � la ligne 44 � l'entr�e de la boucle while, et on clique sur Continuer (F5).

Nom : breakpoint5.jpg
Affichages : 4942
Taille : 51,1 Ko

D�tailler enti�rement les instructions de la boucle pas � pas � chaque passage dans la boucle serait un peu long. On peut acc�l�rer les choses en modifiant les caract�ristiques du point d'arr�t au niveau du while, avec une condition d'arr�t renseign�e. Ici, le programme fera une pause quand la condition i==2 sera v�rifi�e.

Nom : breakpoint6.jpg
Affichages : 5006
Taille : 8,2 Ko

En cliquant sur Continuer (F5), le programme stoppe � nouveau � l'entr�e du while mais apr�s deux tours dans la boucle, avec i=0 au 1er passage et i=1 au 2nd passage.

Le tableau local t commence � se remplir avec t[3]=4 puis t[2]=2 :

Nom : breakpoint7.jpg
Affichages : 4949
Taille : 63,6 Ko

Comme number=1, il y a au moins un tour suppl�mentaire � effectuer dans la boucle. On peut cette fois d�rouler les instructions jusqu'au retour au d�but du while avec des clics sur pas � pas (F10), et voir l'�volution du tableau t qui va �tre compl�t� avec t[1].

On a bien t[1]=1, les chiffres du nombre 124 sont bien dans le tableau :

Nom : breakpoint8.jpg
Affichages : 4937
Taille : 65,0 Ko

Mais maintenant number=0, donc on au prochain clic sur pas � pas (F10), on sort de la boucle while et on quitte la fonction.
On comprend que dans la fonction, t[0] n'a jamais �t� renseign� et que l'emplacement en m�moire est donc rest� � sa valeur d'entr�e non initialis�e, c'est-�-dire ici la valeur 100 (code ASCII du caract�re 'd'). La boucle while a bien trait� un nombre � 3 chiffres, mais le 4� digit � gauche n'est pas mis � z�ro.

Nom : breakpoint9.jpg
Affichages : 4935
Taille : 46,4 Ko

Pour r�soudre le probl�me, soit on initialise le tableau avec des z�ros avant de boucler, soit on change la condition dans la boucle pour �tre s�r d'initialiser les quatre digits quelle que soit la taille du nombre pass� en param�tre. Par exemple, while (number) peut simplement �tre remplac� par while (i < 4) sans rien changer d'autre par ailleurs.

Nom : breakpoint9b.jpg
Affichages : 4942
Taille : 15,0 Ko
Programme d�bogu�


Conclusion

Nous avons, � travers un petit exemple tout simple, d�grossi les notions essentielles pour d�buter le d�bogage du microcontr�leur Raspberry Pi Pico : point d'arr�t et ses propri�t�s, d�roulement pas � pas du programme, et espionnage du contenu des variables. Pour �tre complet, il faudrait rentrer dans l'analyse des registres et des p�riph�riques du Cortex M0, la pile des appels, etc.
Le fonctionnement du couple OpenOCD - GNU Debugger(GDB) est complexe : OpenOCD d�marre entre autres un serveur GDB sur un port TCP, et un client GDB peut alors se connecter au port pour d�boguer le microcontr�leur. Finalement, Visual Studio Code propose une interface graphique plus conviviale pour interagir avec le client, mais il est toujours possible de dialoguer en ligne de commande dans VS Code. Vous pouvez regarder cette discussion sur Stackoverflow avec un beau sch�ma pour comprendre le principe (avec un autre microcontr�leur).

� suivre...

Envoyer le billet � [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code � dans le blog Viadeo Envoyer le billet � [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code � dans le blog Twitter Envoyer le billet � [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code � dans le blog Google Envoyer le billet � [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code � dans le blog Facebook Envoyer le billet � [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code � dans le blog Digg Envoyer le billet � [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code � dans le blog Delicious Envoyer le billet � [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code � dans le blog MySpace Envoyer le billet � [Raspberry Pi Pico][SDK C/C++] Session de d�bogage avec la sonde dans Visual Studio Code � dans le blog Yahoo

Cat�gories
Raspberry Pi , Raspberry Pi Pico

Commentaires