jeudi 15 janvier 2015

PIC micro Pascal, test #2

J'ai poursuivi mes expérimentations avec PMP. Cette fois ci j'ai repris le programme ambiance pingpong et j'ai retravaillé les versions assembleur et XC8 et créé une version avec PMP. Ces versions cible le PIC10F200 au lieu du PIC10F202, ce qui réduit la mémoire programme à un maigre 256 location et la RAM à 16 octets. J'ai commencé par la version en 'C' et j'ai vraiment du me creuser les méninges pour que ça rentre dans les 16 octets de RAM car le compilateur XC8 utilise plusieurs octets de RAM supplémentaires en plus de celle définis dans le code source. J'ai finalement réussi à faire entrer ça dans les 16 octets de RAM. Pour la mémoire FLASH il n'y a pas vraiment eu de problème. Dans cet article je présente donc les 3 versions de code, et je compare les ressources utilisées ainsi que la vitesse d'exécution.

Méthode de travail améliorée

Finalement j'ai découverts la méthode la plus pratique pour travailler avec PMP en utilisant MPLABX pour la programmation du MCU. Dans MPLABX je crée un projet et j'importe le fichier assembleur généré par PMP. Chaque fois que PMP recompile le nouveau fichier assembleur ce dernier est automatiquement disponible dans le projet MPLABX et je n'ai qu'à cliquer sur le bouton "Make and program device" dans la barre d'outil de MPLABX pour reprogrammer le MCU. C'est en fait plus simple que d'utiliser le programme PICKIT 2 programmer et ce n'est pas limité au MCU supportés par le PICKIT 2.

Comparaison des ressources

Voici un tableau comparatif des ressources utilisées par chaque version du programme. Boucle/min. est le nombre de fois que la boucle principale du programme s'exécute pendant la minute d'activité. Sans surprise le code assembleur est beaucoup plus rapide.

versionassembleurC (XC8 free)PIC micro Pascal
RAM111615
FLASH101164162
boucles/min.901560005000

Il semble que les résultats pour XC8 et PMP soient très semblable mais en fait le code assembleur généré par PMP serais de 150 instructions et la RAM utilisée serait de 14 octets si ce n'était pas d'un bug dans la version 2.0.6B du compilateur. le code original de transition était: Lorsque le bug sera corrigé dans la version finale de PMP 2.0.6 cette version pourra être utilisée. Pour le moment lorsqu'on passe l'élément d'un tableau aux procédures inc() et dec() c'est toujours le premier élément qui est modifié.

Vitesse d'exécution

Si on regarde le code source, on se rends compte que le gros du temps processeur est passé dans la procédure pwm_control. donc plus cette procédure est courte plus la boucle PWM sera rapide. Pour la version écrite en assembleur cette procédure utilise 17 instructions, celle en C est de 28 instructions et finalement pour celle écrite en Pascal est de 32 instructions. Donc même si au total PMP génère un code légèrement plus court que XC8 ce n'est pas le cas pour la procédure pwm_control ce qui explique qu'en terme de vitesse d'exécution ce code est le plus lent des 3.

Code source des 3 version

La constante EXPIRE est choisie en fonction de la vitesse d'exécution de chaque version pour une durée d'activité de 60 secondes. En première approximation EXPIRE = 60/PWM_PERIOD. La période PWM est elle-même en première approximation


PWM_PERIOD= 256*N*Tcy
Tcy = 1µsec
N ~=nombre d'instructions dans la routine pwm_control+
    nombre d'instructions supplémentaires dans la boucle
    lorsque pwm_cntr<>0.
Pour chaque version j'ai chronométrée la durée d'activité et recalculé la valeur de EXPIRE et chronométré à nouveau avec la valeur calculée pour m'assurer d'une activité de 60 secondes.

Code source version assembleur

Code source version C

Code source version Pascal

Aucun commentaire:

Publier un commentaire