Problème avec le port 0x60 qui fait des faire des beeps

Signaler
Messages postés
33
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
19 avril 2004
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
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.

7 réponses

Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)
Messages postés
33
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
19 avril 2004

-------------------------------
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.
>
Messages postés
33
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
19 avril 2004

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.
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
Oui et alors ????
Un message vide ne m'inspire pas trop tu sais !!!!

Core Breaker :)
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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

et dis moi si ca marche

Core Breaker :)
Messages postés
33
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
19 avril 2004

-----------------------------
prunkdump
-----------------------------

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.
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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?

Core Breaker :)