Bonjour à tous.
Voici en bref mon problème assez pointu:
Je boote sur une clé USB en DOS 6.22 et je fais tourner une application Turbo Pascal 7. Application "temps réel", ça veut dire que je me fais interrompre par un périphérique externe à des fréquences de plusieurs dizaines voire centaines de Khz. Quand l'interruption arrive, elle doit être désservie dans les quelques µs (oui micro-secondes!) qui suivent. Autant vous dire que ça doit "gazer". Pour ce faire je met toutes les autres interruptions à genou via les masques d'inhibition (port[$21] et port[$A1] des 2 contrôleurs d'Irq).
Cette application tournait à merveille depuis 15 ans sur HDD. Avec l'arrivée de ces fabuleuses clé USB, l'application peut prendre une allure beaucoup embarquée qu'avant... seulement voilà: j'ai mis en évidence que cette configuration m'interrompt tout de même pour des durées de +- 250µs, ce qui représente une éternité pour moi... Tout est relatif!
Selon la programmation de Papa, quand on inhibe à ce point toutes les Irq sauf la sienne, on ne craint rien ni personne. Et bien maintenant c'est foutu, et je cherche à comprendre pourquoi??? Je perd la main pendant 250µs, mon application ne tourne plus pendant tout ce temps et c'est catastrophique!!
J'ai fait un programme test qui va lire en boucle le Timer 0 du PC et qui me donne la statistique après 1 millions de lectures. Le timer fait plusieurs fois le tour évidemment mais j'ai l'habitude de gérer ces valeurs qui repassent de 0 à 65536. Pendant ce temps de test j'inhibe absolument toutes les interruptions via les masques et via Clear Interrupt. Je détourne l'Interruption Non Masquable NMI vers un vecteur nul pour qu'elle ne fasse rien, si jamais...
Et bien volià le résultat: sur HDD l'intervale de valeur entre 2 lectures est très constant et vaut +- 5µs. C'est le temps minimum nécessaire qu'il faut pour aller lire ce timer. Il varie très peu d'un PC à l'autre car il est essentiellement lié au temps d'accès à la puce. En bootant sur la clé USB j'ai 999.977 temps de 5µs et 23 temps "morts" de +-250µs. Donc l'USB m'interrompt pendant tout ce temps. Aucune autre condition n'est changée entre les 2 tests.
J'ai essayé sur plusieurs cartes-mères. A part des valeurs légèrement différentes les résultats sont identiques.
Ma question: comment donc mettre à genou cet USB pendant le temps qu'il me faut pour servir mon application temps réel???
Merci d'avance de toutes vos suggestions...
Partager