créer un petit retard dans un gestionnaire d’interruptions Linux

Je travaille sur un gestionnaire d’interruptions avec un groupe de conception de matériel et nous essayons de déterminer où se trouve un bogue. Je lis une puce sur le bus SPI à 5khz. La puce charge 4 octets et déclenche une broche de préparation des données.

Mon gestionnaire d’interruption se réveille et lit 4 octets sur le bus SPI et stocke les données dans une mémoire tampon. Curieusement, chaque 17ème lecture donne 4 octets de tous les 0, ce qui n’est pas correct. L’une des options que nous explorons est que la puce n’est pas toujours prête lorsqu’elle envoie le signal de disponibilité des données.

Je sais donc que je ne peux pas dormir dans un gestionnaire d’interruptions, mais j’aimerais essayer d’introduire un délai de 10 ou 20 microsecondes. À l’heure actuelle, j’ai une boucle for qui compte jusqu’à 100 000, puis traite l’interruption. Je n’ai vu aucun changement, alors j’ai pensé voir si quelqu’un a une meilleure technique pour attendre. Ou du moins une meilleure façon de déterminer le nombre d’itérations de boucle que je devrais effectuer, car je ne sais pas combien de temps cela prend, ou si le compilateur optimise simplement le tout.

Je ne sais pas si vous avez access à des bibliothèques de génération de nombres pseudo-aléatoires sur votre périphérique intégré, mais une multiplication en grand nombre suivie de mod prendra certainement quelques cycles. Au lieu d’append simplement 1 (qui est très rapide au niveau matériel et que le compilateur peut optimiser pour passer au décalage puisque vous le faites un nombre de fois statique), utilisez une valeur de départ aléatoire (le système at-il access à une horloge? ) si disponible et que vous effectuez des opérations factorielles ou de multiplication de grand nombre, module, la division des nombres négatifs prend également pour toujours. N’oubliez pas que la division prend le plus de temps au niveau matériel. Utilisez cela à votre avantage.

Je suppose que votre compilateur va supprimer une boucle simple.

Vous devriez utiliser volatile.

volatile unsigned long i; for (i=0;i< 1000000; i++) continue; 

Je suppose aussi que cela ne résoudra pas le problème et ne vous aidera pas.

Je ne peux pas croire qu'un périphérique SPI ait un tel bogue .

Mais il est possible que vous lisiez pour ralentir les données du SPI-Fifo.
Ainsi, certaines des données reçues seront supprimées.

Vous devez vérifier les indicateurs d'erreur du module SPI et vérifier les drapeaux complets RX vierges du SPI.