Bonjour, Je cherche à vérifier mon calcul théorique du temps d'exécution d'une portion de code assembleur PIC12F508. J'utilise l'assembleur du MPLAB v8.46 (le dernier) et je n'ai pas trouvé de compteur de cycles utilisable en mode debug. Savez-vous s'il existe un tel compteur ou connaissez-vous une astuce pour savoir combien de cycles se déroulent entre 2 points du code ? Merci. Pascal.
Comptage de cycles PIC 12F508
Apr 09, 2010
15 Replies
On Apr 9, 5:54=A0pm, "CoolAuMiers"
Le plus simple est d'utiliser un compteur interne dont l'horloge est d=E9riv=E9e directement du quartz d'horloge du PIC (bonne pr=E9cision) Tu valides ce compteur en entr=E9e de ton code, et tu le d=E9valides en sortie. Si d=E9passement de capacit=E9, utiliser une IT pour incr=E9menter une variable.
Il me semble que le nb de cycles est indiqué dans le tableau de synthèse des codes opératoires de la spec.
c'est en gros un cycle par instruction ou adresse mémoire balayée, les exceptions sont les intruction de test btfss, ... qui comptent 2 instructions si le test est faux, l'instruction sautée est simplement lue mais non executée, ce qui explique le cycle supplementaire. les call et return font aussi 2 cycles.
après, tu n'a plus qu'a compter à la main..
n'oublie pas que l'horlogue du PIC est celle du quartz divisée par 4.
jj
CoolAuMiers a écrit :
"jj" a écrit dans le message de news:4bbf79d6$0$28931$ snipped-for-privacy@reader.news.orange.fr...
Oui je sais tout ça, c'est ce qui m'a servit pour mon calcul. Mais mon problème c'est de valider mon calcul un peu compliqué car le code est relativement complexe avec des boucles, des tests, etc. L'idéal serait pour moi d'encadrer la partie du code que je veux 'mesurer' par 2 breakpoints, de lancer l'exécution et de récupérer le nombre de cycles effectués réellement une fois arrivé sur le 2 ème breakpoint. Pascal.
"Jean-Christophe" a écrit dans le message de news: snipped-for-privacy@r36g2000yqm.googlegroups.com... On Apr 9, 5:54 pm, "CoolAuMiers"
Le plus simple est d'utiliser un compteur interne dont l'horloge est dérivée directement du quartz d'horloge du PIC (bonne précision) Tu valides ce compteur en entrée de ton code, et tu le dévalides en sortie. Si dépassement de capacité, utiliser une IT pour incrémenter une variable.
Hmmm, ça veut dire modifier mon code, non ? Mon but est de compter le nombre de cycles exact entre 2 points de mon code. Si je le modifie cela va fausser le compte ? Mais je vais réfléchir à votre suggestion. Merci. Pascal.
On Apr 9, 8:55=A0pm, "CoolAuMiers"
code
er'
de cycles
Bis repetita placent : Utiliser un compteur interne dont l'horloge est d=E9riv=E9e directement du quartz d'horloge du PIC (bonne pr=E9cision) Tu valides ce compteur en entr=E9e de ton code, et tu le d=E9valides en sortie. Si d=E9passement de capacit=E9 du compteur, utilise une IT pour incr=E9menter une variable.
De plus, si ton code fait des tests, les valeurs ne seront valables que sur un grand nombre de mesures.
On Apr 9, 8:58=A0pm, "CoolAuMiers"
Oui.
de.
Non, parce-que tu valides le comptage AVANT d'entrer dans ton code, et tu l'arretes APRES. C'est le uC qui incr=E9mente le compteur directement dans le hardawre, donc =E0 l'interieur de ton code la modif est invisible.
Sinon, le plus rapide et le moins intrusif est de lever un bit de sortie =E0 UN avant d'entrer dans ton code et de le baisser =E0 ZERO en sortie du code. Sur la pinouille de sorite de ton PIC tu peux mesurer au scope le delta T.
On Apr 9, 8:58 pm, "CoolAuMiers"
Oui.
de.
Non, parce-que tu valides le comptage AVANT d'entrer dans ton code, et tu l'arretes APRES. C'est le uC qui incr=E9mente le compteur directement dans le hardware, donc =E0 l'interieur de ton code la modif est invisible.
Sinon, le plus rapide et le moins intrusif est de lever un bit de sortie =E0 UN avant d'entrer dans ton code et de le baisser =E0 ZERO en sortie du code. Sur la pinouille de sorite de ton PIC tu peux mesurer au scope le delta T.
J'utilise le compteur du simulateur de mplab. Très pratique, tu mets un breakpoint au niveau du code qui t'interesse, tu reset le compteur, tu mets un breakpoint après le code, puis tu lances. Quand ça s'arrête de nouveau, tu auras le nombre de cycles et le temps en seconde et sous-multiples.
Il suffit de choisir "mplab sim" dans le menu "debugger".
-- cLx
1ere technique rapide : tu utilises une sortie que tu mets à 1 en entrée et à 0 en sortie, avec un scope tu mesures le temps. précision=celle du scope (qq %) perturbation : 2 cycles
2eme methode plus complexe : tu utilises un timer sur 16 bits, tu lis et stocke la valeur en entrée, idem en sortie, le plus compliqué, selon les cas, c'est d'afficher la valeur, si ton montage comprte un afficheur, c'est facile. précision = au cycle près, avec un risque de dépassement du compteur, perturbation: pas mal de cycles ajoutés
personellement, j'utilise la première méthode.
JJ
CoolAuMiers a écrit :
"Jean-Christophe" a écrit dans le message de news: snipped-for-privacy@8g2000yqz.googlegroups.com... On Apr 9, 8:58 pm, "CoolAuMiers"
Hmmm merci mais comme il s'agit de boucles un peu complexes et qui doivent durer longtemps ce n'est pas applicable il faudrait plutôt un compteur/chrono sur plusieurs secondes. Pascal.
"cLx" > de compteur de cycles utilisable en mode debug.
Bonjour, Bravo, c'est ça que je cherchais, j'ai en effet mis un BP avant et après mon code à chronométrer mais je n'ai pas trouvé de compteur de cycles. Vous pourriez être plus précis sur la méthode pour créer un 'compteur du simulateur de mplab' ? Pascal.
"cLx" breakpoint au niveau du code qui t'interesse, tu reset le compteur, tu
Oups, pardon j'avais pas vu le 'Il suffit...' je vais creuser. Pascal.
"cLx" > de compteur de cycles utilisable en mode debug.
Ca y est j'ai trouvé, en fait c'est facile, il suffit d'afficher le 'Stop Watch' du menu 'Debugger'. Super. Merci. Pascal.
Bah de rien :)
J'avoue que le truc est pas super flagrant au début, mais tellement pratique pour ce genre d'utilisations...
-- cLx
"cLx" > Super.
Absolument, et c'est quand même plus sympa que d'analyser les différents cas possibles d'exécution et de compter les cycles... Pascal.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required