Go Down

Topic: Ca fonctionne au téléversement mais ça plante à la mise sous tension (Read 361 times) previous topic - next topic

ChPr

Bonjour à toutes et à tous,

J'ai codé une application (Mega2560 avec touchScreen) dans laquelle, suite à une appui sur l'écran, je crée des objets. Comme le dit le titre de ce sujet, ça fonctionne bien suite au téléversement de l'application. Mais si je débranche le module et que je le rebranche, le même appui sur l'écran fait planter mon application.

Avez-vous une idée du pourquoi du comment ?

Merci de votre aide.

Pierre

_pepe_

Bonjour

Le problème est très probablement dû à un bug dans le programme qui ne se manifeste qu'en fonctionnement normal, comme par exemple un défaut d'initialisation ou l'utilisation d'une zone mémoire normalement non autorisée.

ChPr

C'est effectivement ce à quoi je pense. Y a-t-il un moyen de "nettoyer" la mémoire au lancement ?

Cordialement.

Pierre

68tjs

Ne vaudrait-il pas mieux améliorer l'initialisation  ou supprimer les accès dans une zône non autorisée de la mémoire ?

_pepe_

C'est effectivement ce à quoi je pense. Y a-t-il un moyen de "nettoyer" la mémoire au lancement ?


Avant de penser à "nettoyer", il faudrait penser à corriger les bugs.

Si une variable ou un registre n'a pas été initialisé, alors il n'est pas normal que le comportement du programme ou du matériel dépende de son contenu. L'initialisation des variables et des registres avec les valeurs convenues doit apparaître explicitement dans le code.

Et comme je l'ai indiqué, il est aussi possible que le programme dépende du contenu de zones mémoire dans lesquelles il n'aurait simplement pas dû aller lire ou écrire.

[EDIT: en fin de compte, j'ai paraphrasé 68tjs]

ChPr

Vous avez entièrement raison, il faut que "nettoie" mon application".

Il est possible que je n'ai pas initialisé toutes les variables, je vais m'en assurer. Pour autant, si je déclare ce qui suit :

Code: [Select]
class A {
public
  int x
}


et que j'instancie une variable :

Code: [Select]
A a;

n'ayant pas initialisé la variable int x, est-ce qu'elle aura une place réservée (dans le code ou le tas) ? Si ce n'est pas le cas, l'affectation a posteriori de cette variable pose-t-elle problème ?

Cordialement.

Pierre

ChPr

Bon, j'ai initialisé tout ce que je pouvais initialiser ... ça plante toujours.

Avez-vous des idées de ce qu'il faut vérifier pour s'assurer qu'il n'y a pas d'allocation mémoire à problème ?

Merci de votre aide.

Pierre

_pepe_

Déboguer un programme ne se fait pas à distance et avec une boule de cristal.

Si je devais énumérer tous les cas de figure possibles que j'ai pu relever durant ma longue expérience (et je ne suis pas sûr d'avoir encore tout vu), on y passerait des semaines.

Si c'est possible, il serait préférable que tu montres le code source de ton programme pour qu'on puisse l'analyser.

ChPr

Je veux bien vous passer mon code source, mais il est énorme dû à des bibliothèques que j'ai créées.

En fait je recrée un environnement visuel ou j'ai des boutons, des éditeurs, des boite listes, ...

A chaque fois que je crée un composant (dans mon application, je lui affecte un pointeur et j'ajoute ce pointeur à une liste de pointeurs.

En suite, dans la partie "loop" de l'application, je balaie cette liste de pointeurs et, si un composant a reçu un appel (un appui sur l'écran tactile), je fais une action typique (que j'ai programmée) à ce composant.

Dans mon application, les composants sont créés :
1 - de manière statique, par exemple : Bouton monBouton(x, y, ...);
2 - de manière dynamique : Bouton btns[7]; et dans ce cas, dans la partie "setup" il y a une boucle de création : btns = new Bouton(x, y, ...);
3 - ou en réponse à un appui sur un composant. Dans la procédure relative à l'appui sur ce composant, j'écris :
Code: [Select]
void creeBoutons(byte n) {
  Bouton lesBoutons[n];
  for (byte i = 0; i < n; i++) {
    lesBoutons[i] = new Bouton(x, y, ...);
  }
}


Comme dit précédemment, tout cela fonctionne bien suite au téléversement, pas à la remise sous tension.
A la remise sous tension, tout fonctionne bien sauf la création par la procédure creeBoutons.

Donc, si vous le tout ...

Par ailleurs, au téléversement, le programme est chargé en mémoire flash et la mémoire dynamique est initialisée en fonction de ce programme.

A la remise sous tension, je suppose que le programme occupe la même place en mémoire flash, mais que c'est la mémoire dynamique qui est peut-être initialisée de manière différente Oui/Non ?

Merci de votre aide.

Pierre

Jimbow

Salut

Y a quelque temps les instances d'objet en dynamique ne fonctionnais pas. Je m'etait deja pris la tête avec ca. La dans ta boucle for tu utlise "new".

Essye un bout de code simple (un truc tout con).

Dans mon cas a l'époque (y a longtemps^^). lors de l'execution d'une instance dynamique (avec "new") mon arduino rebootait automatiquement.

Sinon essye de déclarer tes objets en statique. mais si tu utilise des tableaux d'objets ca risque d'etre problèmatique...

J'ai retrouvé mon vieux poste de l'époque^^ :
http://forum.arduino.cc/index.php?topic=130651.msg983046

ChPr

... Dans mon cas a l'époque (y a longtemps^^). lors de l'execution d'une instance dynamique (avec "new") mon arduino rebootait automatiquement. ...

J'ai bien l'impression que c'est ce qu'il se passe ! Mais ce n'est pas systématique.

Cordialement.

Pierre

Go Up