Déjà le mois des giboulées qui pointe son museau. Nous sommes tous ravis, car nous avons reçu les nouveaux badges avec le LOGO de la NDRMSE. C’est un peu idiot, mais une certaine fierté à le porter démontre à quel point les personnels sont attachés à ce projet. Pour le moment JEKERT est endormie, mais personne ne doute qu’elle remplira vaillamment sa mission. Sur l’orbite de transfert qui la conduit à destination, elle a franchi plus de la moitié de la distance. Maintenant le Soleil la ralentit, car durant la première moitié de la trajectoire il l’attirait dans son emprise, mais elle a franchi le périhélie avec une vitesse considérable qui va la faire « remonter » jusqu’à Mars. Elle ne commencera à réaccélérer que lorsqu’elle arrivera dans sa sphère d’influence. Ce n’est pas demain la veille, les ingénieurs ont largement le temps de lui préparer encore quelques petits programmes.
Recharger P21 version P sur l’ATmega328.
Poursuivre l’analyse des améliorations apportées au logiciel implique de le téléverser à nouveau, avec en début de son listage source la grande table Image_LOGO[228]. Elle a changé de nom pour avoir un identificateur plus parlant, mais surtout elle a subit un amaigrissement, passant de 258 octets à 228 soit une « perte de poids » de 30 octets. Nous verrons plus avant la raison de ce changement, car le dessin n’est pas modifié, impliquant qu’il a fallu compenser par tracé de segments de droite pour reconstituer l’image intégrale. Observez maintenant une autre petite modification :
• RESET > Un BP pour démarrer le programme > Touche DONNEES >
• Activer le BPccr pour allumer la LED bleue du mode graphique >
• Touche OPTIONS > BPccr pour allumer la LED SÉCURITÉ >
• BPccr jusqu’à afficher l’item AFF. Nav. continu ? > OUI >
À ce stade l’écran ne montre rien de bien nouveau.
• BPccr pour sélectionner la référence interne Gyroscopique :
En affichage graphique la valeur du Calage GYRO. n’est plus affichée et remplacé par « //// » car correspond à une donnée interne au MPU6050. Ce n’est pas un paramètre vraiment opérationnel et en afficher la valeur peut prêter à confusion quand on observe l’Ecart de route. C’est le « bug » du CAP Magnétique qui est affiché en permanence, car il correspond à la direction dans laquelle on désire aller. L’interprétation de l’écran est plus simple, augmentant la convivialité d’utilisation.
Représentation graphique du spectre colorimétrique.
Des postures à gogo !
Pour implanter ces données en mémoire non volatile EEPROM, il nous faut revoir « le plan d’occupation des sols ». Nous en étions à la répartition des informations représentée en Fig.288 qui laissait tout le haut de la mémoire disponible à partir de l’adresse 768. Chaque posture contient douze consignes codées sur des int soit 24 octets. Il serait possible d’en sauvegarder 255 / 24 = 10,625. (255 est la taille actuelle de la zone libre en haut de la mémoire EEPROM.) Pour simplifier le logiciel on limitera leur n° à un seul chiffre significatif. Le nombre maximum possible sera donc de neuf configurations. Initialement, pour simplifier le logiciel il a été décidé de loger chaque posture sur des zones de 32 octets. (Voir la Fig.343) Le nombre maximum possible est alors de huit, et comme on utilise la procédure de sélection d’un programme du menu APPRENDRE , si 9 a été sélectionné nous aurons génération d’une erreur E11. Au final, ce n’est pas une très bonne idée. Il serait préférable de placer les postures les unes à la suite des autres et d’en limiter naturellement le nombre à neuf lors de la saisie. Si le cœur vous en dit …
La méthode retenue pour pouvoir choisir entre les huit empreintes possibles n’est pas du tout compliquée. Elle consiste à ajouter un item vu sur la Fig.344 qui recopie la valeur de l’index de programme dans le n° de posture traitée pour l’affichage et pour l’utilisation. Le protocole pour sélectionner une posture parmi les huit possible est précisé dans le manuel d’utilisation du pupitre au chapitre > Protocole pour indexer le n° de posture EEPROM et reproduit ci-dessous pour que vous puissiez l’expérimenter avec P21P.
2) Un pas en Rotation ⊇ pour avoir l’item Changer PGM EEPROM,
3) OUI pour valider la saisie, (Le cadre jaune indique le n° actuel)
4) Rotation ⊇ ou ⊆, pour imposer le n° désiré, (Valeurs de 1 à 8)
5) Sortir de la saisie par FIN,
6) Activer le menu des POSTURES,
7) Deux pas en Rotation ⊇ pour Pointer POSTURE n°N ?,
8) Touche OUI pour la valider. La consigne 99 est envoyée à la sonde. Si la valeur est valide l’ACR est OK, si N vaut 9 un E11 est généré assorti d’un BIP sonore.
Collision entre la PILE et le TAS !
Fonctionnement de la mémoire vive SRAM.
La mémoire vive (256 + 2Ko) est généralement divisée en quatre zones :
• Les 256 premiers octets pour les registres généraux du microcontrôleur (Représentée en jaune sur la Fig.346) occupent « le bas » de la SRAM.
• La zone nommée BSS qui contient toutes les variables globales, allouées statiquement au moment de l’édition de lien lors de la compilation. La BSS est utilisée par de nombreux compilateurs pour désigner une zone de données contenant les variables statiques déclarées dans les initialisations, et les déclarations.
• Le TAS sur lequel on entasse du bas vers le haut est destiné aux allocations dynamiques dans lequel on peut attribuer et libérer des blocs de mémoire. (Nommé HEAP) Le TAS se fragmente généralement au cours de l’évolution du programme, (Car une variable locale libérant de la place laisse « un trou » non utilisé.) avec un risque notable de le rendre inutilisable.
Défragmenter HEAP par une séquence de code de type « Ramasse miettes » est faisable mais relativement dangereux, car si l’on déplace une variable en cours d’utilisation, les conséquences peuvent s’avérer ingérables.
* Les paramètres associés à l’appel des fonctions et procédures,
* Les adresses de retour des fonctions et procédures,
* Les variables locales aux fonctions et procédures.
La PILE est une zone de mémoire commençant en haut de la SRAM qui se charge vers le bas de façon linéaire et continue lors des appels des fonctions ou des procédures. Elle se réduit vers le haut lors des retours. Chaque appel à une procédure suppose que lorsque cette dernière s’achève, le déroulement du programme doit passer à la suite. Pour aborder d’une façon volontairement très simplifiée le fonctionnement du compilateur, nous allons raisonner sur la fig.347 qui dans la boucle de base void loop() enchaîne deux procédures. Arrivé à la ligne d’instruction (1) l’analyseur syntaxique sait que le microcontrôleur va devoir « se brancher » sur les instructions de ce qui pour le programmeur est un identificateur nommé TRAITER_LE_CLAVIER(). L’analyseur syntaxique « saute » l’accolade { et recherche la première instruction cohérente qui suit. Il note alors l’adresse dans le programme du début de cette subroutine dans une cellule nommée Tester_le_clavier. Le déroutement ne peut se faire immédiatement. En effet, que devra faire l’ATmega328 quand toutes les instructions de la subroutine auront été déroulées, événement jalonné par la « fermeture du bloc » avec } ? .
Il faudra passer à la suite du programme, c’est à dire en ligne (2). Hors le microcontrôleur ne peut pas inventer cette adresse de retour. Donc, avant de brancher sur Tester_le_clavier par la route colorée en bleu ciel, le compilateur demande à l’ATmega328 d’EMPILER l’adresse de retour de procédure. Quand le programme arrive à l’instruction « Retour de procédure » en }, l’adresse est DÉPILÉE et le processeur se branche sur cette dernière. Vous avez noté que chaque appel à une fonction, à une procédure, à une interruption, c’est à dire toute
Configuration qui produit la collision de PILE avec le TAS.
PRÉVENTIF : Aucun programmeur n’est à l’abri d’une telle « catastrophe ». Aussi, pour minimiser les risques il faut placer le minimum de chaînes de caractères dans le programme car en réalité elles sont placées sur le TAS. Il faut également minimiser les tableaux. Enfin, quand le programme est terminé, il importe de vérifier que le risque est faible en faisant afficher la place encore disponible entre la PILE et le TAS. Le compilateur C++ d’Arduino nous fournit des outils pour ça.
REMÈDE : Dégager impérativement de la place sur le TAS.
Avec un peu d’expérience, le programmeur repère assez rapidement les gros consommateurs d’octets sur le TAS. D’une façon générale il ne sera pas possible de diminuer le nombre des variables locales. De toute manière ce n’est pas la solution, car en général c’est du « gagne petit ». La première solution consiste à placer les textes en EEPROM, ce n’est pas nouveau. Pour JEKERT ce n’était pas possible puisque cette méthode a été respectée à profusion. C’est à ce stade que l’analyse du programme a montré qu’afficher en textuel le spectre colorimétrique devenait peu utile. Fonction abandonnée les emplacements ainsi libérés ont permis d’utiliser les « trous » par d’autres textes qui étaient présents dans les instructions « Bla bla bla » du programme conduisant à la version ultime de P35_Ecrire_les_textes_en_EEPROM.ino qui sur les démonstrateurs à fichu un peu la pagaille.
Examinant avec un peu plus de sagacité la belle fresque Image_LOGO[228] on observe sur la Fig.348 que le bas de l’image ne comporte pas beaucoup de pixels allumés. On peut sans vergogne supprimer dans le tableau les octets relatifs aux cinq lignes du bas ce qui économise 5 x 6 = 30 octets sur le TAS. Pour reconstituer le dessin des points coloriés en orange, il faudra tracer deux lignes et un point. Cette correction va ajouter quelques octets au code objet, pas grand chose au regard de ce qui reste encore disponible, car ces derniers seront logés en zone programme. Après ces deux mesures drastiques, le programme a retrouvé sa bonne humeur. (Et surtout le programmeur !) Bon, le pupitre ronronne, les écrans sont impeccables bref tout va bien. Au fait, sommes-nous certains que l’espace dynamique est suffisant ? L’accident est toujours possible, aussi nous allons prendre une assurance pour limiter les dégâts.
Prendre une assurance contre les collisions de PILE.