[Résolu] Leonardo qui bug selon la taille du sketch !?

Bonjour à tou(te)s !

Je fais un sketch sur Léonardo pour tester le fonctionnement de PALs (PAL16L8 par exemple).
J'y vais par étape, après l'ajout de quelque lignes, je téléverse et vérifie le résultat.

Tout se passe bien avec le sketch testeur.ino ci-joint qui prend environ 8ko sur les 28ko dispo.

Quelques explications sur le code :

  • le constructeur de Pal initialise les ports de la léonardo en entrée ou sortie suivant la config du Pal à tester,
  • le destructeur initialise tout les ports de la léonardo en entrée,
  • la fonction Pal.test() configure les niveaux des sorties et lit le resultat sur les entrées, puis effectue un test pour déterminer si le PAL testé est ok ou hs
  • setup() affiche 1 fois le menu
  • loop() permet le choix du test d'un PAL parmis 15 possibilités

Maintenant, j'ajoute les lignes de la fonction test_CTL_IT1(), (cf fichier fonc_CTL_IT1.c ci-joint), la taille est d'environ 10ko et le téléversement se termine par :

  • une déconnexion de la Léonardo, windows 7, Xp et ubuntu 14 ne reconnaissent plus le périphérique usb
  • il n'est plus possible d'utiliser le monitoring (normal ... carte déconnectée ...)
  • la led RX est allumée fixe

J'arrive à reprendre la main en maintenant le bouton reset de la Léonardo au téléversement suivant, mais je n'arrive pas à comprendre pourquoi mon code produit ce plantage ?
Le téléchargement d'autres sketchs plus volumineux fonctionne pourtant sur cette carte (j'en ai un de 20ko pour gérer 2 pont en H).
Quelqu'un a-t-il rencontré ce problème ?
Quelqu'un voit-il une grosse boulette dans mon code ?

Merci de votre aide.

testeur.ino (8.75 KB)

fonc_CTL_IT1.c (1.83 KB)

Salut,

Je n'ai pas lu tes codes, mais...

Si le compilateur compile, c'est que le code est cohérent (ça veut pas pour autant dire qu'il est bon).

Si jamais, dans le fichier .hex pondu par ce dernier, il y avait une suite d'octets qui ferait penser à un code de contrôle quelconque du téléversement, alors serait-il possible que le bootloader l'interprête comme une commande au lieu de simple code à copier dans la flash???

Changer le bootloader par un plus récent?

bonjour,
je pensais trouver des !!!!!!, mais non
peut être qu'en virant les //-----------------------

sinon en première lecture, pas de boulette qui saute aux yeux.

Tu bouffes toute la RAM avec tes chaînes de caractères

Bonjour, et merci à tous pour vos réponses,

Super_Cinci :
J'ai effectivement rechargé le bootloader Leonardo-prod-firmware-2012-12-10.hex se trouvant dans le répertoire \hardware\arduino\bootloaders\ avec une sonde avrisp mkii et avrstudio.
Je ne sais pas si l'ancien boot de ma léonardo était moins récent, je n'ai pas su comparer les contenus des plages mémoire du boot uniquement.

infobarquee :
J'ai essayé plein de modifications de mon code : suppression de la classe PAL et remplacement par 3 fonctions en C + variables globales ... bref ... je me suis aperçu qu'en ajoutant quelque dizaines de lignes dans le sketch, la taille du .hex pouvait prendre 2ko rapidement.
Je suppose que le compilateur utilise des optimisations et que mon code n'est pas bien adapté à lui.
je n'ai essayé d'enlever les //--------------------, car j'ai lu la réponse de fdufnews.

fdufnews :
J'utilise la version 1.0.5 r2, et aucune erreur n'apparait concernant le taux d'occupation de la RAM.
Comment fais-tu pour obtenir ces informations ?
Est-ce seulement disponible à partir de la version 1.5.5 ?

Le choix des variables sous forme de chaines de caractères me plaisait, je trouvais le code lisible (sans plein de déclarations de variables), mais ce n'est pas judicieux.
Je suppose qu'en déclarant ces variables avec un nom et en static, elles seront stockées dans la flash.
Mais je vais peut être opter pour une déclaration en unsigned char, int ou long avec affectation en binaire (par exemple : B00011100, ça reste lisible aussi).

Merci encore une fois :wink:

Informations d'occupation de la mémoire disponibles à partir de la version 1.5 de l'IDE.

Bonsoir,

Je suppose qu'en déclarant ces variables avec un nom et en static, elles seront stockées dans la flash.

Une variable ne peut pas être dans la mémoire Flash :wink:

Une variable ne peut pas être dans la mémoire Flash smiley-wink

Ben ouais :~, je voulais dire une chaine de caractères constante ...

Et je viens juste de trouver comment faire ici : PROGMEM - Arduino Reference .
En utilisant la librairie avr/pgmspace.h, je peux stocker de longues chaines de caractères destinées à de l'affichage sans remplir inutilement la RAM XD !

Mon problème est donc résolu. Merci.

Il y a la fonction F() aussi

Bonsoir,

Merci mille fois B@tto !!

Cette fonction F() me simplifie vraiement le travail (pas de nom de chaine de caractère à déclarer ... ).
J'ai juste à l'ajouter à mon sketch pour qu'il fonctionne.
... Et cerise sur le gâteau, il garde la lisibilité qui me tenait tant à coeur .

JF_Couac:
Merci mille fois B@tto !!

... Et cerise sur le gâteau, il garde la lisibilité qui me tenait tant à coeur .

ah ouais, cool!!! voilà qui fait plaisir à lire! un gros merci et un mini compte-rendu! si tous les topics pouvaient se terminer ainsi... :wink: