Pages: [1]   Go Down
Author Topic: Ca fonctionne au téléversement mais ça plante à la mise sous tension  (Read 261 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 84
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: August 20, 2014, 04:16:55 am by _pepe_ » Logged

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

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

Cordialement.

Pierre
Logged

IDF/SO
Offline Offline
Edison Member
*
Karma: 41
Posts: 2274
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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]
« Last Edit: August 20, 2014, 05:37:59 am by _pepe_ » Logged

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

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:
class A {
public
  int x
}

et que j'instancie une variable :

Code:
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
Logged

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

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
Logged

Offline Offline
Full Member
***
Karma: 3
Posts: 213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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

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

Haute-savoie
Offline Offline
Newbie
*
Karma: 0
Posts: 26
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: August 20, 2014, 12:15:34 pm by Jimbow » Logged

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

... 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
Logged

Pages: [1]   Go Up
Jump to: