2011-07-12 3 views
2

J'ai un programme C qui fonctionne sur x86 (sans système d'exploitation) en mode protégé. J'ai besoin de retarder l'exécution du programme pendant un certain temps. À l'heure actuelle, je fais ceci:Comment retarder l'exécution pendant une durée spécifiée de millisecondes en mode protégé?

for(p=0; p<1000000; ++p) asm("pause"); 

Mais cela semble très très mal (je reçois un retard, mais apparemment, je n'ai pas de contrôle réel sur la durée: la durée de la « pause » est non défini) . Maintenant, je ne suis pas vraiment expérimenté avec des choses à un niveau aussi bas, et j'ai cherché des solutions sur le net, mais jusqu'à présent, le seul que j'ai trouvé impliquait des interruptions du BIOS, qui ne fonctionnent pas en pmode (ou alors on m'a dit). Alors, comment retarder l'exécution en mode protégé?

+0

Qu'avez-vous mis en service à ce stade? Le PIT aiderait. Sinon, il y a probablement des ports que vous pouvez lire qui ont un timing prévisible (bien que je n'en connaisse aucun). Peut-être que l'attente de rafraîchissement vertical pourrait fonctionner (bien sûr, cela ne fonctionnera pas pour des délais très courts). – user786653

+0

Si vous n'avez pas d'OS, pourquoi devez-vous courir en mode protégé? –

Répondre

5

La manière typique d'implémenter des retards est d'utiliser le temporisateur du système, également appelé PIT sur x86 (Programmable Interval Timer) pour générer une interruption. Vous devez configurer le temporisateur système (matériel IRQ0) pour déclencher une interruption après un certain temps, écrire le gestionnaire d'interruption pour définir un registre ou un indicateur sur l'interruption et, lorsque vous devez retarder l'exécution, faire une boucle sur le registre ou le drapeau le gestionnaire d'interruption le définit.

+1

... et si votre code est privilégié, vous pouvez exécuter 'HLT' dans la boucle en attente de l'interruption. – caf

Questions connexes