Auteur Sujet: UniversalAccessoryDecoder 420  (Lu 16617 fois)

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
UniversalAccessoryDecoder 420
« le: décembre 20, 2015, 02:36:19 pm »
Suite à plusieurs demandes, je me suis penché sur la consommation mémoire de UAD qui semblait à tout le monde (moi compris) excessive... De fait avec plus de 1400 octets de mémoire dynamique occupés pour l'exemple Full livré avec la version 4.15, ça laissait peu de place pour le fonctionnement. Je n'avais testé que sur un Mega, et ça marchait bien, mais sur un Uno , que nenni !

Après quelques heures d'optimisation, j'ai fait deux grosses amélios que je vais détailler ici parce que cela peut servir à beaucoup de monde...

Dcc_decoder.h/c : Ce bout de code utilisé fréquemment dans les décodeurs d'accessoires Dcc chez nous et ailleurs, est prévu pour beaucoup de choses, y compris la configuration du décodeur par des CVs. Et pour que cela marche, ce source tient une liste des valeurs courantes de toutes les CVs, soit 259 ! Dans le cas de UAD, seules certaines parmi les 29 premières sont utilisées, alors j'ai réduit cette liste à 29, soit 230 octets de gain ! Pour ceux que cela intéressent en tant que fichiers autonomes, il peuvent récupérer ces sources depuis la forge Framasoft https://git.framasoft.org/locoduino.org/UniversalAccessoryDecoder/tree/V4.

SerialCommander : Dans ce source je tente de piloter les accessoires à travers la liaison série fournie par les classes Serial et Serial1, 2 et 3 lorsqu'elles sont disponibles. Mais il y a deux gros bémols : mon source n'est pas opérationnel... J'aurais dû prendre le temps de m'inspirer de ce que Denis a écrit sur le sujet (article non publié...) mais ce n'est pas le cas ! Le second bémol, c'est que chaque classe Serial déclare en dur et en interne un buffer de lecture, un tampon de 150 caractères pris sur la mémoire dynamique. Et comme j'avais quand même tenté de faire les choses bien, j'avais permis d'utiliser les quatre interfaces séries lorsque le matériel le permet, ce sont 600 octets qui partaient en fumée même si le SerialCommander n'était pas utilisé ! Parce que l'IDE Arduino compile tous les sources du répertoire de la bibliothèque, même ceux qui ne sont appelés ou inclus par personne !

Voilà, au final, ce sont 619 octets de mémoire dynamique qui sont utilisés sur le même exemple en version 4.20 . C'est quand même beaucoup mieux et devrait permettre de piloter des accessoires avec un Uno ou un Nano !