Pages: [1] 2   Go Down
Author Topic: Debogage de sketch  (Read 1981 times)
0 Members and 1 Guest are viewing this topic.
Chateau-Thierry (02)
Offline Offline
Full Member
***
Karma: 0
Posts: 167
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

N’ayant pas encore ma dalle tactile pour m’occuper.  La première reçue était fendue, et le fournisseur doit se réapprovisionner. Cela devrait encore prendre une bonne dizaine de jours. Je m’attaque maintenant au débogage de mon appli, dont un plantage intervient de manière aléatoire, avec un état des sorties bloquées en l’état, selon le moment du plantage. Celui-ci intervient sur la Duemilanove tous les 7 à 12 jours. Ce qui ne facilite pas la recherche.
Je pense à un débordement sur variable, mais je ne trouve pas. Et maintenant le sketch est plutôt long. (13K) car je n’avais pas constaté ce bug au début de développement, puisque je réinitialisais la carte à chaque chargement de nouveaux programmes. Soit tous les 3 ou 4 jours


Je suis passé de la version 018 (Vers. Fr) à la V0.1 sans changement.

Ce week-end, j’ai chargé le sketch sur une Mega 2560 que j’avais en attente. Elle tourne actuellement toute seule, en espérant que celle-ci plante de la même manière. Je pense ensuite enlever des portions de programme afin de cerner d’où vient le bug. Le problème c’est que cela peut prendre beaucoup de temps (plusieurs semaines au rythme des bugs).

Existe-t-il une solution plus adéquate pour rechercher le problème ?

Je lis le topique relatif à AVRstudio en me disant que ce logiciel est peut-être capable de cerner mon Pb. Mais au fait, quel est l’intérêt d’AVRstudio par rapport à l’IDE Arduino ?

Bref, si vous avez des idées, je suis preneur.

Franck
« Last Edit: January 05, 2012, 08:36:51 am by Bubule » Logged

Belgique - Arlon
Offline Offline
Full Member
***
Karma: 0
Posts: 172
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello Bubule,
 
Ta panne n'est certainement pas une mince affaire à corriger si l'Arduino plante tous les 10 jours.
 
Ton idée de débordement de variable pourrait effectivement être à l'origine, mais ce n'est certainement pas la seule cause possible.
 
As-tu des fonctions qui en appellent d'autres ? Lorsque tu appelles une fonction, le µC dépose sur la pile l'adresse mémoire de l'instruction suivante pour savoir où revenir lors du retour de la fonction. Donc la pile s'allonge. Lors du retour de la fonction, cette adresse est enlevée de la pile et celle-ci raccourcit. Si une fonction A appelle une fonction B qui elle-même appelle une fonction C et que celle-ci appelle dans certaines circonstances la fonction A, c'est la catastrophe car tu peux alors avoir une boucle sans fin entre plusieurs fonctions.La pile ne cesse de s'allonger et finit par venir recouvrir le code du programme. C'est le plantage assuré.
Lorsqu'un programme devient assez volumineux, il peut être utile de dresser un tableau de toutes les fonctions, en inscrivant pour chaque fonction les éventuelles autres fonctions qu'elle appelle.
 
Un autre exemple de plantage, c'est l'attente d'une mesure qui, pour une raison ou une autre, ne vient pas. Dans ce cas, le µC n'est pas vraiment planté mais il attend et semble planté car il reste figé au même point.
 
Il faut vérifier toutes les boucles du programme. En particulier, il faut être certain que la ou les conditions de sortie de la boucle seront toujours remplies à un moment ou a un autre. Si la condition de sortie est la réception d'une mesure (T° par exemple), il est judicieux de prévoir une sortie de boucle après un certain délai écoulé, même si la mesure d'est pas reçue. Dans ce cas, on peut envoyer un code d'erreur sur le moniteur par exemple.
 
D'une manière générale, il est bon de truffer le programme de messages ou codes envoyés au moniteur, signalant sans cesse où le programme en est. Si le programme plante, il est alors plus aisé de le suivre à la trace.
 
Je ne pense pas que Studio soit mieux placé que l'IDE Arduino pour résoudre ton problème. Mais il serait peut-être utile d'utiliser un moniteur plus sophistiqué que le moniteur inclus dans l'IDE car si tu plantes tous les 10 jours, il faut enregistrer automatiquement dans un fichier les données reçues par le moniteur.
En-dehors de l'environnement Arduino, le Moniteur porte le nom générique de "Terminal". Je te conseille d'utiliser le "Bray's Terminal" de l'adresse suivante: http://sites.google.com/site/terminalbpp/
Il est gratuit et permet un enregistrement automatique. Il faut régler le Baud Rate et le Port Com puis cliquer sur "Connect". Tu peux enregistrer en cliquant sur StartLog.
Logged

Amicalement, Jean-Marie

France
Online Online
Faraday Member
**
Karma: 39
Posts: 3558
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Un plantage sur le long terme, c'est probablement un débordement de pile ou une fonction qui n'est pas appelée très souvent.

Pour vérifier le premier cas, j'utilise la librairie FreeMemory http://www.arduino.cc/playground/Code/AvailableMemory (j'utilise le code dans le bas de la page et je l'ai mis dans les librairies). En faisant afficher périodiquement la taille mémoire disponible on peut voir s'il y a des problèmes de libération de mémoire.

Pour le second cas il faut faire afficher un message par les fonctions appelées pour essayer de tracer d'où vient le problème.

Si tu manipules des chaines de caractères, tu peux aussi avoir un problème lié à un tableau de caractères trop court et de temps en temps ta chaine déborde et vient écraser une variable.
Logged

Chateau-Thierry (02)
Offline Offline
Full Member
***
Karma: 0
Posts: 167
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

Merci de me consacrer un peu de votre temps.

Je suis un grand débutant dans la programmation. De ce fait, je n'ai pour le moment, par manque de compétence, pas utilisé autre chose que les boucles "setup" et "loop". Tout le sketch et donc une ribanbelle d'instructions, dont toutes les variables (parfois avec des noms à rallonge) ont été déclarées avant le setup.
Donc non, je n'ai pas de fonction, ni interruption (à ma connaissance) qui pourraient tourner en boucle sans en sortir.
J'utilise les librairies "servo" et "PID". Mais il me semble que le plantage avait commencé à faire son apparition avant que je utilise la librairie "PID"
 
Ce matin, la carte était de nouveau plantée, avec une sortie bloquée à 1.
 
J'avais remarqué lors de la mise au point avec le moniteur, que la liaison série bouffait pas mal de ressources. Et comme j'envoyais les données à chaque cycle, cela ralentissait fortement la scrutation. Tout dépendait également du nombre de variables affichées sur le moniteur. (print et println)
J'avais donc de ce fait limité l'envoi des donnée à une fois toutes les secondes, par front montant d'un bit sur millis(), pas sur delay(). Une piste ?
 
Je ne peux laisser le pc en permanence raccordé sur la carte. Cela ne me permet donc pas de suivre l'évolution des variables. J'ai jeté un coup d'oeil sur le lien que m'a donné Jean Marie. Cela me semble un peu compliqué. Je regarderais tout de même de manière plus approfondie.
 
Si je ne m'en sort pas :
j'ai prévu une seconde carte en remplacement (la Mega actuellement en cours de test, et qui ne semble pas se planter (à vide !)). Celle-ci remplacerait la Duemilanove qui gère actuellement la partie opérative (mise en route des pompes, gestion des oscillateurs à base de servos, régulation du pH, ...). De plus, celle-ci est déjà presque saturée en entrées-sorties.
Et j'utiliserais cette Duemilanove pour gérer l'affichage (dalle tactile 4D en attente), et la redondance de certaines mesures régulée par la partie opérative (pH, ...).
Je pourrais y adjoindre un contrôle de chaque carte par l'autre, type chien de garde. Si pas de signal pendant un laps de temps (5 secondes par exemple) >> Reset de la carte par sa surveillante.
 
Franck
Logged

Belgique - Arlon
Offline Offline
Full Member
***
Karma: 0
Posts: 172
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci fdufnews pour ta contribution très intéressante. Je ne connaissais pas ces méthodes de surveillance du Heap et du Stack. Je vais faire quelques essais car cela me paraît important dans le débogage, particulièrement pour des programmes assez volumineux.

Pour Franck: je ne l'ai jamais utilisé mais chaque Atmega possède un système de "watch-Dog" interne qu'on peut activer. Lorsqu'il est activé, ton programme doit constamment le remettre à zéro avant qu'il ne déborde, sans quoi un reset se produit. Le délai est cependant court. Le watch dog s'active en modifiant un fuse.

Logged

Amicalement, Jean-Marie

Chateau-Thierry (02)
Offline Offline
Full Member
***
Karma: 0
Posts: 167
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

Bon, j'ai très peu avancé dans les recherches de solutions de débogage.
L'utilitaire "terminal" est plutôt pas mal, mais ne permet toujours pas se rebrancher à la carte sans la réinitialiser. J'ai trouvé également la possibilité d'enregistrer les données affichées.

J'avais commencé à regardé du côté des chiens de garde, mais ce que j'en ai lu ne m'a pas pour autant rassuré, et je pense que l'utilisation des deux cartes s'auto-contrôlant est plus sécuritaire.
Ce qui ne m'empêche pas de chercher la cause des bugs.

J'ai également commencé à éplucher les options de visualisation de l'utilisation de la RAM proposées par fdufnews, mais je n'arrive pas à les faire fonctionner. Notamment, où trouver la lib MemoryFree.h. Une vrai bille...

Franck
Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

Pour monitorer ton arduino, ajoute simplement ceci à ton sketche

Code:
int availableMemory() {
  int size = 8192; // Use 2048 with ATmega328, 8192 with mega1280
  byte *buf;

  while ((buf = (byte *) malloc(--size)) == NULL)
    ;

  free(buf);

  return size;
}

un petit coup de Serial.println(availableMemory()); ici ou là, te donneras la mémoire restante disponible.

Tu peux désactiver l'auto-reset de ton arduino (duem) avec une resistance de 110 ohms entre les pins Vcc(+5) et reset. 120 ohms pour la mega.

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Belgique - Arlon
Offline Offline
Full Member
***
Karma: 0
Posts: 172
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello Franck,

Je t'envois ci-joint le fichier MemoryFree.rar. Tu peux le décompresser et copier le répertoire MemoryFree dans C:\Program Files\arduino-0022\libraries (si tu as les répertoires standarts). Sinon, tu copies dans le répertoire qui contient toutes les librairies Arduino. Le répertoire MemoryFree contient les fichiers MemoryFree.h et MemoryFree.c

Ensuite, au début de ton programme, avant la fonction SETUP, tu ajoutes
Code:
            #include <MemoryFree.h>

Dans la fonction SETUP, tu ajoutes
Code:
             Serial.begin(9600);

Enfin, là où tu veux tester la mémoire disponible, tu ajoutes dans ton programme:
Code:
            Serial.print("freeMemory() reports ");
            Serial.println( freeMemory() );
Normalement, ça devrait marcher.


* MemoryFree.rar (0.56 KB - downloaded 6 times.)
Logged

Amicalement, Jean-Marie

Chateau-Thierry (02)
Offline Offline
Full Member
***
Karma: 0
Posts: 167
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

J'ai tenté les 2 options que vous m'avez proposé. Les deux me retournent bien des valeurs, mais celles-ci sont fixes.
Quel que soit l'endroit où j'insère l'instruction Serial.println(availableMemory()); avec la routine de zoroastre, ou Serial.println( freeMemory() ); avec la lib de Jean Marie. L'insertion de ces instructions à plusieurs endroits en simultané me donne toujours la même valeur. (1162).

Seul l'ajout ou la suppression de lignes de code, permettent de faire varier cette valeur.
Êtes vous sûr que cette instruction délivre la valeur de RAM en temps réel ? Ça semble bien trop stable.

Tu peux désactiver l'auto-reset de ton arduino (duem) avec une resistance de 110 ohms entre les pins Vcc(+5) et reset. 120 ohms pour la mega.

Zoroastre.
Impeccable !

Franck
« Last Edit: December 24, 2011, 05:55:10 am by Bubule » Logged

Chateau-Thierry (02)
Offline Offline
Full Member
***
Karma: 0
Posts: 167
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour

Pour faire suite à la demande générale (euhh de quelques  smiley-wink) des dieux du forum, je poste en pièce jointe le programme actuellement en cours dans la Duemilanove.

J’ai testé en parallèle ce programme sur une Mega (à vide, juste avec un servo de raccordé). Elle ne s’est pas plantée en presque 10 jours. La Duemilanove se plantait parfois entre 8 et 15 jours. Malheureusement, les coupures EDF, et les nouveaux tests de liaison série ont interrompus les essais  smiley-sad. On ne peut donc rien en déduire de fiable. (C’était juste pour faire avancer le schmilblick !  smiley-grin).

Si vous y voyez quelque chose de louche… Mon niveau ne me le permet pas encore  smiley-red.

Franck

EDIT : Décidément....Je n'arriver pas à poster le sketch (env 32Ko .ino) Est-ce normal ?

Quote
An Error Has Occurred!
The upload folder is full. Please try a smaller file and/or contact an administrator.
« Last Edit: January 05, 2012, 09:38:35 am by Bubule » Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

EDIT : Décidément....Je n'arriver pas à poster le sketch (env 32Ko .ino) Est-ce normal ?

Quote
An Error Has Occurred!
The upload folder is full. Please try a smaller file and/or contact an administrator.
[/quote]
La taille max des pièces jointe est de ~1Mo pourtant smiley-eek-blue
Déja que les serveurs arduino.cc sont pas des plus rapide si en plus il n'y as plus d'espace disque ...

Je viens de tester, ya vraiment plus de place smiley-eek-blue
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Chateau-Thierry (02)
Offline Offline
Full Member
***
Karma: 0
Posts: 167
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fichtre !

Serait-il maintenant possible de poster une pièce jointe ? Je désespérais  smiley-red

Bon, entre temps j'ai quelque peu modifié le sketch en rajoutant du code, donc aucun risque que j'ai supprimé ce qui le faisait boguer.

Si les pros pouvaient y jeter un coup d’œil...

Franck


* Programme_Aquario_serie.ino (30 KB - downloaded 8 times.)
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 84
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est une hypothèse assez improbable, mais on ne sait jamais : as-tu regardé du côté de millis() ?

Sous le capot (lien) c'est une variable statique qu'une interruption vient mettre à jour à chaque fois que le Timer0 a décompté une milliseconde.

Cette variable est mémorisée sous la forme d'un entier non signé codé sur 32 bits, donc sa valeur maximale est de 2^32, ce qui correspond à environ 49 jours avant qu'un dépassement se produise.

Or on lit dans ton code (à la ligne 148) :  
Code:
TCCR0B = TCCR0B & 0b11111000 |3; // Accélère le timer 0 (sorties 5 et 6) (avec effet de bord sur Millis() et Delay())

Je ne sais pas de combien tu l'as accéléré, mais si c'est de l'ordre de x10 ton plantage au bout de 4 jours pourrait venir de là smiley

Sinon si c'est pas ça, désolé pour l'envolée lyrique  smiley-lol
« Last Edit: January 16, 2012, 10:25:08 am by Benvenuto » Logged

Chateau-Thierry (02)
Offline Offline
Full Member
***
Karma: 0
Posts: 167
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,

Merci d'avoir jeté un coup d’œil sur le sketch.
Mais cette ligne n'est pas active. (// juste devant l'instruction). j'avais préparé son insertion afin de réduire le bruit de certaines pompes, mais comme il y avait des effets de bord que je n'avais pas encore envie de gérer, je ne l'ai jamais activé. Ce ne peut donc pas être la cause. smiley-sad-blue

Pour éviter d'y revenir, je mets la version actuellement en cours dans la carte. (Pour éviter de trop surcharger, je virerais d'ici quelques temps le fichier du dessus).

Franck

* Programme_Aquario_serie_ino.ino (28.17 KB - downloaded 5 times.)
Logged

Offline Offline
God Member
*****
Karma: 5
Posts: 687
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir et pardon à tous  smiley-wink
@Bubule
J'ai mis un message pour toi sur le TOPIC que tu sais  smiley-lol
Comme je ne sais pas si le MP fonctionne  smiley-red

encore pardon à tous pour cet intrusion (éléphant dans un magasin de porcelaine  smiley-lol smiley-lol)
@+
Logged

The truth is elsewhere !!

Pages: [1] 2   Go Up
Jump to: