Plop les gens
Je bosse sur un projet perso (mi embarqué, mi pas-embarqué) et je me heurte à un petit souci de traitement (en C, mais on s'en branle, quoique j'ai des contraintes de RAM).
Je lis 6 tensions [0;5v] qui sont converties en interne par un CAN 10b, deux décalages et un masque plus tard, j'ai bien 6 octets refletant mes 6 tensions (potentiomètres linéaires, c'est une surface de controle).
Je fais en sorte que mon module hardware envoie au PC mes 6 données, uniquement lorsqu'elles changent (économie de charge sur la ligne usb et sur le proc du PC hote, qui recoit du coup moins de data).
C'est la que les choses deviennent fun. A certaines positions (elles sont nombreuses), mon CAN oscille entre deux valeurs de sortie, disons 0xAD et 0xAE, par conséquent j'envoie une floppée de données "pour rien", sans parler des inconvénients beaucoup plus gênants à l'utilisation (more on this later).
Fort de mes souvenirs de physique appliquée (théorie du signal, niveau "pour les nuls" ), j'ai commencé par mettre un tampon de 20 échantillons en mémoire, et à prendre la moyenne comme valeur finale: c'est vachement mieux, mais il reste quelques valeurs qui font que le CAN a le cul entre deux chaises.
(en aparté) Le souci, c'est que le projet dans son ensemble, est une console numérique pour l'éclairage de spectacle, et dans certains cas, le changement inopiné d'une valeur va se traduire par un changement de comportement radical (je pense à certains projecteurs qui ont une fonction "stroboscope" sur le même canal de contrôle que l'intensité lumineuse, ambiance 0x00 -> 0xC9 = intensité, 0xD0 -> 0xFD = stroboscope (fréquence), 0xFF = power off).
Coté hard, mon uC embarqué a seulement 256 octets de ram, et j'aimerais autant éviter qu'il swap ram<>flash en permanence, tant pour sa durée de vie que pour la fréquence de rafraichissement des trames usb.
J'avais pensé envoyer les infos de changement de valeur uniquement quand la différence > 0x01, mais je perds du coup 1 bit de résolution, en pratique, et j'ai besoin de mes 256 valeurs différentes.
J'ai aussi pensé à mettre un tampon de 3 commandes pour chaque canal, et n'envoyer réellement la dernière commande que si elle n'annule pas la précédente.
(Si c'est pas clair:
|
| Sens de lecture du tampon de commandes
|
V
CH1:FA
CH1:FB
CH1:FA
On vide le tampon sans envoyer de donnée
CH1:FA
CH1:FB
CH1:FB
On envoie effectivement CH1:FB)
D'autres idées ? Un pattern pour ce type de problème ?
---------------
I'm smart enough to know that I'm dumb. - Livres d'occase