Problème avec le port 0x60 qui fait des faire des beeps
prunkdump
Messages postés33Date d'inscriptionvendredi 21 février 2003StatutMembreDernière intervention19 avril 2004
-
21 avril 2003 à 22:18
CoreBreaker
Messages postés540Date d'inscriptiondimanche 23 mars 2003StatutMembreDernière intervention 5 octobre 2007
-
26 avril 2003 à 00:05
voilà lorsque j'utilise le port I\O 0x60 pour voir l'etat du clavier d'abord tout fonctionne bien puis au bout d'un moment le pc fait des beeps, comment faire pour éviter cela?
Merci.
A voir également:
Problème avec le port 0x60 qui fait des faire des beeps
CoreBreaker
Messages postés540Date d'inscriptiondimanche 23 mars 2003StatutMembreDernière intervention 5 octobre 20071 22 avril 2003 à 23:28
Les beeps sont produits comme tu le sais lorsque le buffer clavier est plein. Ce buffer est géré par l'interruption 8 (interruption clavier) Il faut soit rediriger l'interruption 8 (au rique que d'autres applications ne fonctionne plus correctement mais c'est un risque qui peut être évité si ton interruption est bien programmé en permettant que les autres applis puisse chopper toute de même les touches du clavier lorsque ton appli n'en a pas besoin.
Tu peux aussi éviter que l'interruption 8 se déclenche en désactivant la ligne d'IRQ en programmant le contrôleur d'interruption matérielles.
Tu peux aussi et c'est ce que je préfère masquer temporairement les interruptions matérielles car ainsi c'est plus proche d'un multitâche préemptif en faisant:
prunkdump
Messages postés33Date d'inscriptionvendredi 21 février 2003StatutMembreDernière intervention19 avril 2004 25 avril 2003 à 20:27
-------------------------------
Réponse au message :
-------------------------------
> Les beeps sont produits comme tu le sais lorsque le buffer clavier est plein. Ce buffer est géré par l'interruption 8 (interruption clavier) Il faut soit rediriger l'interruption 8 (au rique que d'autres applications ne fonctionne plus correctement mais c'est un risque qui peut être évité si ton interruption est bien programmé en permettant que les autres applis puisse chopper toute de même les touches du clavier lorsque ton appli n'en a pas besoin.
>
> Tu peux aussi éviter que l'interruption 8 se déclenche en désactivant la ligne d'IRQ en programmant le contrôleur d'interruption matérielles.
>
> Tu peux aussi et c'est ce que je préfère masquer temporairement les interruptions matérielles car ainsi c'est plus proche d'un multitâche préemptif en faisant:
>
> cli
> récuperer_infos_sur_port_60h
> sti
>
> Core Breaker :)
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > voilà lorsque j'utilise le port I\O 0x60 pour voir l'etat du clavier d'abord tout fonctionne bien puis au bout d'un moment le pc fait des beeps, comment faire pour éviter cela?
> >
> > Merci.
>
prunkdump
Messages postés33Date d'inscriptionvendredi 21 février 2003StatutMembreDernière intervention19 avril 2004 25 avril 2003 à 20:35
Tout d'abord merci pour votre réponce, mais j'ai encore un petit problême.
voila ce que j'ai fait:
j'ai dévié l'interruption 0x09 sur ma procédure que voici:
fonction:
in al, 0x60
mov [touche], al
mov al, 0x20
out 0x20, al
iret
Je lis l'état du clavier, je place le scan code dans un buffer, j'envoi au PIC la comfirmation de l'interruption.
Mais voilà utiliser cette routine fait des buggs sur l'écran (en mode graphique), et il y à quelque défaut dans l'interractivité des touches. Pourriez vous m'expliquer comment enlever ce problème.
CoreBreaker
Messages postés540Date d'inscriptiondimanche 23 mars 2003StatutMembreDernière intervention 5 octobre 20071 25 avril 2003 à 22:07
Excuse mon ignorance à ton sujet je vois que tu maitrise un peu le sujet et excuse mon erreur c'est effectivement l'interruption 9 et pas la 8 comme je te l'avais indiqué.
Sinon essai:
fonction:
cli
in al, 0x60
mov [touche], al
mov al, 0x20
out 0x20, al
sti
iret
Excuse pour le message vide je suis un peu un andicapé du forum, j'espère que celui là il marchera.
Désactiver les interruptions s'a ne marche pas mais ces buggs sont vraiment étranges j'ai des ligne blanche qui apparoissent sur l'écran et des fois l'orsque j'appuis sur la touche l'action ne se déclenche pas instantanement, je pense que c'est du à mon utilisation du PIC. Faut il vraiment envoyer un message au PIC à chaque appel de l'interruption. Je n'ose pas trop m'attaquer aux interruptions du mode protégé de windows grâce à la table IDT car là si je me plante je fout tout en l'air.
CoreBreaker
Messages postés540Date d'inscriptiondimanche 23 mars 2003StatutMembreDernière intervention 5 octobre 20071 26 avril 2003 à 00:05
Tu programmes en 32bits alors ? (tu parle de l'IDT)
en principe un cli désactive la ligne d'IRQ du processeur central donc si tu l'utilise et que tu dis que ça marche pas ça ne te servira à rien de désactiver au niveau du PIC tu auras le même problème. Mais le cli/sti reste nécessaire pour éviter d'avoir une interruption réentrante. L'action au PIC reste inutile car si tu marque l'IRQ du controleur clavier tu auras les même problème puisque les autres IRQ restent actives.
Je ne pense pas que ça vient du PIC si la réaction à une touche n'est pas instantanée c'est qu'il y a une tache quite consomme trop de temps processeur.
De toute façon, je ne pense pas non plus que tu puisses passer par l'IDT car la zone mémoire de cette table doit être de RPL de niveau 0 (donc au niveau du noyau), tu n'y aurras pas accès comme ça, il te faut pour la manipuler un code docile s'il est exécuté en DPL de niveau 3. Ce qui sera le cas puisque par défaut un code exécuté est en DPL 3. Et puis ce n'est pas simple d'avoir un code exécuté en DPL 0, 1 ou 2 car il te faut rajouter un descipteur dans la GDT ou la LDT, c'est un serpent qui se mord la queue. Seul le noyau ne pourra t'accorder un DPL < 3 à l'exécution. Mais bon on peut toujour essayer.
Si tu veux, envoi moi ton source à metaos@free.fr, je verrai ce que je pourrais faire.
C'est l'action sur une touche qui provoque les lignes blanches?