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 ?
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???
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).
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 !
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 .