Bonjour,
Toujours avec mon projet Arduino UNO / Shield Ethernet / Ecran TFT ILI9341 + dalle tactile XPT 2046, mon travail d'optimisation porte ses fruits :
- code plus court de 5000 octets (sur 32K c'est pas négligeable), j'ai maintenant 10K de libres pour d'autres fonctionnalités
- affichage du texte 2,5X plus rapide et des bitmaps 3X plus rapide
Ceci alors que je suis parti d'une librairie déjà optimisée PDQ GFX par rapport à la Adafruit d'origine.
J'ai fait une remarque : les instructions sur les types 'int' sont très consommatrices ; une affectation comme celle-là :
bouffe 24 octets de ROM dans le code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int A; int B; ... ... A = B;
Un type 'int' c'est un entier signé, il y a plein de vérification que le microcontrôleur dois faire...
Ce qui n'est pas le cas avec un unsigned int
Problème : le c++ Arduino ressemble tellement au c++ classique que les gens ont écrit des programmes de la même façon.
Sur un PC, les instructions sur les entiers signés sont câblés, mais pas toujours dans les microcontrôleurs.
Du coup, lorsqu'on utilise des entiers signés sur un microcontrôleur, c'est le carnage car le compilateur doit ajouter plein de code.
En épluchant mon code et le code des bibliothèques et des fonctions du core, on voit que l'emploi de ces entiers signés est souvent injustifié :
- soit le code n'utilise que des valeurs positives![]()
- soit on utilise juste une valeur négative (typiquement '-1') pour renvoyer une erreur
Parfois c'est pire, pour des valeurs toujours comprises entre 0 et 255 le code utilise un 'int' au lieu d'un byte.
Donc la prochaine étape pour moi c'est de partir à la chasse au 'int'
Ce n'est pas toujours évident et la question que je me pose est de savoir si on peut forcer la copie directe sans code de vérification (comme le cas de mon exemple).
Si je copie un 'int' dans un autre 'int' il ne peut pas y avoir de débordement ! Le contrôle a déjà été fait lorsque le 'int' source a été affecté...
De même, forcer une copie directe d'un unsigned int dans un int, quand on est certain que le unsigned int a une valeur qui ne sera pas interprétée comme un nombre négatif...
A bientôt
Partager