Ca fonctionne au téléversement mais ça plante à la mise sous tension

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

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

Cordialement.

Pierre

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 ?

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 :

class A {
public
  int x
}

et que j’instancie une variable :

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

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

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 :
* *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

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

Jimbow:
… 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