Utilisation d’une interruption sur timer avec le PRUSS

Il y a quelques temps, je cherchais à lancer une fonction toutes les n millisecondes avec une bonne précision.
Le but de tout ceci étant de pouvoir faire un dérivation des données collectées en fonction du temps. Et au lieu de mesurer le temps entre chaque donnée, je fixe l’intervalle de temps pour simplifier les calculs.

Ce que je faisais au début: compter le nombre de cycles de la fonction et ajouter des boucles pour perdre du temps. Ça avait un petit désavantage, car dans ma fonction, avec des conditions, le temps d’exécution pouvait être variable, de pas grand chose, certes, mais 50ns sur un nombre important d’itérations, ça peut faire beaucoup, donc jouer sur la précision.

Dans les bouts de code dans les exemples de texane ici: https://github.com/texane/pru_sdk il y a quelquechose qui y ressemble https://github.com/texane/pru_sdk/tree/master/example/pruss_iep

Un extrait du code:

Comme on peut le voir, il fait du polling, en allant regarder dans le registre ou en est le compteur.
Il y a une deuxième façon de faire: en attendant l’interruption.

Donc, j’ai trouvé ici: https://github.com/jstampfl/PruIEP_Int dans l’exemple iepx.p.

C’est aussi du polling, mais sur le bit d’interruption.

Dans son code, j’aime moins la façon dont il va paramétrer les registres car les adresses sont codées en dur au lieu d’être mises en constantes, une affaire de goût.

J’ai fait un test rapide en faisant un petit mix des deux.
Ce bout de code va générer une interruption toutes les secondes, incrémenter deux compteur, générer une interruption pour le programme en C tournant sur le Beagle Bone, qui va ensuite aller chercher ces compteurs et les afficher.

Ça donne ceci pour le coté PRUSS:

et coté BBB:

C’est fait en vitesse, donc pas très beau, mais c’est fonctionnel.
J’essayerais de formater le code un peu plus tard.

This article was written by Cédric

Menu