Je ne connais pas du tout le moded protégé, est il possible sous windows comme sous DOS de détourner des interruptions ?
Blustuff.
Je ne connais pas du tout le moded protégé, est il possible sous windows comme sous DOS de détourner des interruptions ?
Blustuff.
Salut,
tous est possible... mais ca risque de faire certaines chose non desire !
tu desire developper tes propre int sous Win ? quelle version ca a une grand importance !
- Win 9x
Win NT, 2000, XP ?
a+
JB![]()
ben mon code doit etre le plus portable possible a priori. mais a priori ca a pas trop l'air prevu pour ca. On m'a fait comprendre qu'en fait c'etait pas possible et que windows pouvait fonctionner qu'en asynchrone. (Je veux pas creer des ints, mais détourner des ints) Moi je demandait pas grand chose, que windows traite ses !RQs et qu'il donne le contrtole a une fonction utilisateur a la fin de l'interruption.
Je comprends pas, comment fait DirectInput pour fonctionner en mode Buffered ?? C'est l'hardware qui buffered tout ou alors DirectInput demande a Windows de mettre les donénes dans un tampon et il les recuperes ensuite dans un prog utilisateur ?
Blustuff
oups sous Windows,
bon en principe les fonctions DirectTruc rend apres l'appel des infos...
je ne comprend pas vraiment ce que tu desire...
tu desire bien detourner une interruption logiciels pour y loger une autre ?
en gros j'aurais vboulmu creer comme sous DOS, cad par ex. détourner le l'int du timer. Si tu veux mieux comprendre, je programme un émulateur x86. Pour emuler le timer du pc, je peux pas me permettre d'arreter l'emulation pour verifier si il faut que j'emule un appel a l'int 08h. Alors j'aurais voulu pouvoir détourner une interruption windows pour que si necessaire j'interrompe l'emulation pour emuler une IRQ
(euh je sais pas si je suis clair)
Blustuff.
j'ai deja fait ca voici (plus bas) un petit code:Envoyé par Blustuff
l'int 8... c'est pas top! je ne comprend pas le fonctionnement de ton emulateur... tu emule ou tu controle l'execution sur le processeur ?Si tu veux mieux comprendre, je programme un émulateur x86. Pour emuler le timer du pc, je peux pas me permettre d'arreter l'emulation pour verifier si il faut que j'emule un appel a l'int 08h.
OK, mais pourquoi passer par l'assembleur ?Alors j'aurais voulu pouvoir détourner une interruption windows pour que si necessaire j'interrompe l'emulation pour emuler une IRQ(euh je sais pas si je suis clair)
il existe des fonctions de gestion des timer en C sous Windows:
j'ai utilise il y a quelques annees ce genre de fonction :
SetTimer et KillTimer
c'est amplement suffisant (c'etait pour controler des acces synchro a des moteurs pas a pas via le port //)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 if( V.Var_Etat_suivi_automatique == ok ) { V.Var_Etat_asuivi = ok ; CheckMenuItem(hMenu, 4400 , 0x0000 | 0x0008 ); lpfnMyTimerProc = (TIMERPROC)MakeProcInstance( (FARPROC)MyTimerProc , hInst); ActiveTimer = SetTimer( hwnd, IniTimer , FlipTime , lpfnMyTimerProc);} else { V.Var_Etat_asuivi = NULL ; CheckMenuItem(hMenu, 4400 , 0x0000 | 0x0000 ); sprintf(szBuff,"Le suivi n'est pas actif"); SetWindowText( hwnd, szBuff ); // Imprime dans le titre de la fenetre KillTimer( hwnd, ActiveTimer); // tue le timer ActiveTimer = 0L ; }
a+
JB![]()
Houla, c'est pas lent ca l'utilisation des timers Windows ??? (Il faut traiter les messages pour que TimerProc soit appelé non ?) Et ca n'a pas une tès bonne resolution (ms je crois ?)
J'emule totalement, instruction par instruction.
Blustuff
en effet ca fonctionne au niveau des ms sans trop de derive(a condition de ne par charger le processeur avec d'autre grosse taches...
voir sur le site de MicroSoft:
la declaration est sans appel en ms !
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Timers/TimerReference/TimerFunctions/SetTimer.asp
mais il existe peut etre une solution regarde ca:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Timers.asp
mais autrement, j'ai decrit la modification de l'IRQ0:
http://www.developpez.net/forums/viewtopic.php?t=38443
mais est ce applicable sous Windows...
j'ai des doutes !
a+
JB![]()
merci :) mais je sait déja detourner les IRQs, c'est pas ca le pbl. Mais pour que TimerProc soit appelé il faut que quelque part il y ait traitement des messages. Utiliser les Timers serait bien plus long que l'utilisation d'un compteur de performance je crois.
(Ce problème a été abordé dans une autre de mes questions sur le forum)
Blustuff.
il ne te reste que le mode protege... et la gestion des tes propres timers, genre de compteurs!
Moui, sinon autre question e nrapport avec les IRQ :
J'ai vu qu'il y a des priorités pour les IRQ, mais je n'ai pas de precision dessus. Comment ca marche en fait ? Si une IRQ de priorité plus importante est en cours de traitement, les autres IRQ sont ignorées ? mises de coté ? Et est-ce qu'il y a une table pour les priorité ? comment on sait quelle IRQ a plus d'importance qu'une autre ?
Blustuff.
merci beaucoup, ca explique déja un point, mais ca nexplique pas ce qui se passe lorsque une IRQ esrt appellée alors qu'une dede priorité plus elevée est en cours de traitement. (Elle est mise dee coté temporairment pour etre appelée plus tard ?)
Blustuff.
En fait ta phrase est mal formulée.Envoyé par Blustuff
Une interruption matérielle (IRQ) est un évènement extérieur au microprocesseur, il peut y avoir plusieurs sources d'interruptions, comme c'est le cas sur architecture x86 il y a un contrôleur d'interruption. Le rôle du contrôleur d'interruption est donc de gérer les différentes sources d'IRQ en fonction des priorités qui leur ont été affectées par programmation ou bien intrinsèquement par câblage.
Donc (pour en revenir à ta question) une interruption de niveau N est en cours de traitement si une interruption de niveau inférieur se présente celle-ci ne sera pas transmise au micro par le contrôleur d'IT car son niveau est inférieur au niveau courant. Le mécanisme est quasiment le même lorsque le micro gère lui même les ITs et qu'il possède plusieurs niveaux de priorité.
Voilou, est-ce plus clair ?
oui, sauf que si l'irq est de la même priorité il se passe quoi ? Donc en pratique si on appuie sur une touche du clavier tant que 20h n'est pas envoyé sur le port 20h l'int 08h ne sera pas appelé par l'IRQ0 ? (si j'ai bien tout compris, j'espère que je dit pas trop n'importe quoi). A moins que ce soit le contraire, tant que 20h ne sera pas envoyé après appel de l'int 08h appelé par l'IRQ0, il sera impossible ded traiter les informations venant du clavier ?
Blustuff
Si l'IRQ est de même niveau elle n'est donc pas plus prioritaire.Envoyé par Blustuff
C'est en effet vrai qu'il faille acquitter l'IRQ au niveau du contrôleur avec le outportb 20h,20h (si ma mémoire est bonne car c'est vieux tout ça).
merci.
Mais en fait j'ai toujours pas compris si l'IRQ 0 a une priorité plus forte ou plus faible que l'IRQ1 ??? Parce que le shema est pas très clair, j'ai pas compris dans quel sens vont les priorités
Blustuff
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager