IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Appel d'une routine via IRQ_9


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut Appel d'une routine via IRQ_9
    Salut ,

    J'ai un problème Hard au niveau de l'interruption Timer sur une carte PC. Pour palier à ce problème je souhaite utiliser l'interruption IRQ_9. l'IRQ_9 correspond d'après ma doc tech. au n° d'IT 0x71. Je souhaite donc employé la fonction "setvec()", mais je comprend pas tout a fais son fonctionnement malgrès l'aide de C++ builder .

    Si quelqu'un peu m'aider ou m'orienté

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Appel d'une routine via IRQ_9
    Citation Envoyé par mickael777
    J'ai un problème Hard au niveau de l'interruption Timer sur une carte PC. Pour palier à ce problème je souhaite utiliser l'interruption IRQ_9. l'IRQ_9 correspond d'après ma doc tech. au n° d'IT 0x71. Je souhaite donc employé la fonction "setvec()", mais je comprend pas tout a fais son fonctionnement malgrès l'aide de C++ builder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
      ____________________________
      ¦_dos_getvect, _dos_setvectÌ
      ¦getvect, et setvect       Ì         <DOS.H>
      ____________________________
      Renvoie l'adresse contenue dans le vecteur d'interruption
     spécifiée ou la modifie.
     
      Déclaration:
       _ void interrupt (*getvect(int interruptno))();
       _ void setvect(int interruptno, void interrupt (*isr) ( ));
       _ void interrupt(*_dos_getvect(unsigned interruptno)) ();
       _ void _dos_setvect(unsigned interruptno, void interrupt (*isr) ());
     
      Description:
     _ _dos_getvect et getvect lisent la valeur du vecteur interruptno et la
     renvoient comme un pointeur FAR sur une fonction d'interruption.
     
     _ _dos_setvect et setvect forcent la valeur du vecteur interruptno avec isr,
     (un pointeur FAR donnant l'adresse d'une fonction).
     
     Tous les processeurs de la famille 80x86 possèdent un jeu de vecteurs
     d'interruption numérotés de 0 à 255. La valeur sur quatre octets de chaque
     vecteur est une adresse, l'emplacement de la fonction d'interruption.
     
       Argument    ¦ Description
      -------------Ï-------------------------------------------------------------
       interruptno ¦ Vecteur d'interruption (entre 0 et 255). Le contenu est
                   ¦ l'adresse d'une fonction d'interruption.
       isr         ¦ Pointeur FAR donnant l'adresse de la nouvelle interruption.
     
     L'adresse de la routine C ne peut être transmise que si la fonction a été
     déclarée de type interrupt.
     
     Si vous prenez les prototypes déclarés dans DOS.H, il suffit de passer
     l'adresse de la fonction à setvect ou _dos_setvect , quel que soit le modèle
     mémoire.
     
      Valeur Renvoyée:
       _ getvect et _dos_getvect renvoient la valeur sur 4 octets
         trouvée dans le vecteur interruptno.
       _ setvect et _dos_setvect ne renvoient rien.
     
      Portabilité:
      + DOS Ð UNIX Ð ANSI C Ð C++ Seul +
      ¦ Oui ¦      ¦        ¦          ¦
      +-----¤------¤--------¤----------+
    <Non standard>

    D'abord, c'est pas sûr que ton système te laisse jouer avec cette fonction...

    En admettant que ce soit permi, il suffit de définir un nouveau handler d'interruption (fonction sans paramètres avec mot clé 'interrupt') et de passer l'adresse de cette fonction à setvect() avec le bon numéro de vecteur d'interruption.
    Rien de compliqué. Il est préférable de bloquer les IT pendant la manip (disable() enable())
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    Tout d'abord merci por ton aide , mais j'ais encore un petit soucis...

    Voila j'ai crée un handler, mais quand je l'appel avec cette fameuse fonction 'setvect', une erreur de syntaxe apparait lors de la compilation.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <conio.h>
    #include <stdio.h>
    #include <dos.h>
    #define IRQ_9 0x71                    //----N° de l'IT Irq_9
     
     
    void interrupt Irq9()
      {
      disable();                                     //----Inhibe tous les IRQ
     
      printf("L'interruption IRQ 9 est détectée");
      getch();
     
      enable();
      }
     
    main()
    {
    setvect(IRQ_9,Irq9);
    return 0;
    }
    Si quelqu'un comprend mon erreur .

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    Je viens de trouvé mon erreur , la syntaxe est bon a condition de compiler avec un .c et non avec un .cpp. Mais j'ai tjrs un dernier pb:

    - Si je lance mon .exe compilé avec le code ci-dessus sous DOS, rien ne se passe quelque soit le niveau logique envoyé a l'IRQ_9.

    A l'aide !

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mickael777
    Voila j'ai crée un handler, mais quand je l'appel avec cette fameuse fonction 'setvect', une erreur de syntaxe apparait lors de la compilation.
    Quelle erreur ? Où ? On est pas devins...
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <conio.h>
    #include <stdio.h>
    #include <dos.h>
    #define IRQ_9 0x71                    //----N° de l'IT Irq_9
     
     
    void interrupt Irq9()
      {
      disable();                                     //----Inhibe tous les IRQ
     
      printf("L'interruption IRQ 9 est détectée");
      getch();
     
      enable();
      }
     
    main()
    {
    setvect(IRQ_9,Irq9);
    return 0;
    }
    Si quelqu'un comprend mon erreur .
    Le disable() / enable() , c'est à mettre autour de setvect().
    Faut pas mettre de printf dans une interrution. Essaye cprintf() (<conio.h>) éventuellement...

    Autre problème, c'est que quand tu quittes, l'ancien handler n'est pas réinstallé... Pour le lire : getvect().
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    Merci pour ton aide Emmanuel Delahaye !

    Mais sa ne marche toujours pas... Je ne rentre jamais en intérruption quelque soit le niveau logique envoyé sur l'IRQ 9. Pourtant mon code semble être bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <conio.h>
    #include <stdio.h>
    #include <dos.h>
    #define IRQ_9 0x71                    //----N° de l'I.T. Irq_9
     
    int PassInterrupt=0;
     
    void interrupt ( *AncVectIt)();
     
    void interrupt Irq9()
      {
      PassInterrupt++;
      }
     
    main()
      {
      AncVectIt = getvect(IRQ_9);  //--Valeur de l'ancien vecteur d'I.T
     
      printf("la valeur de l'ancien vecteur est %d\n",AncVectIt);
      printf("Le nombre d'I.T. Irq 9 est : %d\n\n",PassInterrupt);
     
      disable();												 //----Inhibe tous les IRQ
      setvect(IRQ_9,Irq9);
      enable();
     
      return 0;
      }
    Je ne vois pas ou peut être l'erreur...

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mickael777
    Mais sa ne marche toujours pas... Je ne rentre jamais en intérruption quelque soit le niveau logique envoyé sur l'IRQ 9. Pourtant mon code semble être bon...
    <...>
    Je ne vois pas ou peut être l'erreur...
    J'ai ressorti quelques parchemins poussiereux:

    - Le clavier c'est IRQ1
    - IRQ1 est mappé en INT9

    http://docsrv.sco.com/HW_config/configparamsC.interrupt_vectors.html

    Donc il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #define INT_KBD 9
     
    <...>
     
       /* Valeur de l'ancien vecteur d'I.T */
       AncVectIt = getvect(INT_KBD);
    etc.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    J'ai ressorti quelques parchemins poussiereux
    Citation Envoyé par Sur le site, il y
    © 1999 The Santa Cruz Operation, Inc. Tous droits réservés
    UnixWare 7 - version 7.1 - 19 mars 1999
    Faut peut être pas pousser

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    Sympa les parchemins poussièreux,

    Mais je suis pas intéressé par l'IRQ 1 qui est déjà utilisé par le clavier, mais par l'IRQ 9 qui est normalement non utilisé, le pb c'est que je suis pas sur de son N° d'I.T.

    Si quelqu'un peux me le confirmer...

    de + d'après l'aide de Borland la valeur renvoyé par la fonction getvect ne devrais pas être supérieur a 255 hors cette fonction me retour pour l'IRQ9 (qui a pour valeur 0x71) la valeur 6695 !?

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mickael777
    Mais je suis pas intéressé par l'IRQ 1 qui est déjà utilisé par le clavier, mais par l'IRQ 9 qui est normalement non utilisé, le pb c'est que je suis pas sur de son N° d'I.T.

    Si quelqu'un peux me le confirmer...
    C'est bien 0x71

    http://www.qsl.net/f6flv/docbios.html

    Ok, j'avais mal compris ton besoin. Il faut aussi autoriser l'IT dans le PIC (le bon, celui des IRQ 9 à 15) et acquitter l'IT dans le PIC quand celle-ci est servie.

    T'es en train d'écrire un driver ou quoi ?

    de + d'après l'aide de Borland la valeur renvoyé par la fonction getvect ne devrais pas être supérieur a 255 hors cette fonction me retour pour l'IRQ9 (qui a pour valeur 0x71) la valeur 6695 !?
    Euh non. getvect() renvoi une adresse sur 4 octets (far)
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par mickael777
    Je viens de trouvé mon erreur , la syntaxe est bon a condition de compiler avec un .c et non avec un .cpp.
    En mode de compilation C++, il faut déclarer ta fonction d'interruption ainsi si je me souviens bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void interrupt Irq9(...) {
      ...
    }
    Tu remarqueras les trois points en lieu et place des paramètres. La fonction est à utiliser comme si elle était déclarée en "Irq9 ( void )".
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    Merci Emmanuel pour la confirmation .

    Je viens de résoudre grâce a ton aide une parti de mon pb (c'était pas bien dur mais je qu'un simple débutant). Voici le code source pour vérifié le bon fonctionnement des interruptions de base comme l'I.T. clavier (0x09) ou l'I.T. Timer (0x08) appelé 18,2 fois par sec. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <conio.h>
    #include <stdio.h>
    #include <dos.h>
    #define IRQ_0 0x08                    //----N° de l'I.T. Irq_0
     
    int CptInterrupt=0,FinBoucleInfini=0;
    void interrupt ( *AncVectIt)();
     
    void interrupt Irq9()
      {
      CptInterrupt++;
      AncVectIt();
      }
     
    main()
      {
      AncVectIt = getvect(IRQ_0);  //--Valeur de l'ancien vecteur d'I.T
     
      printf("la valeur de l'ancien vecteur est %d\n",AncVectIt);
     
      disable();	         //----Inhibe tous les IRQ
      setvect(IRQ_0,Irq9);
      enable();
     
    while (CptInterrupt < 20 && FinBoucleInfini<6000)
    {printf("Le nombre d'I.T. Irq 9 est : %d\n",CptInterrupt);  FinBoucleInfini++;}
     
    //--------------Initialisation du vecteur d'I.T. a son ancienne valeur--------//
      disable();	      //----Inhibe tous les IRQ
      setvect(IRQ_0,AncVectIt);
      enable();
    //------------------------------------------------------------------------------//
     
      return 0;
      }

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    Ok, j'avais mal compris ton besoin. Il faut aussi autoriser l'IT dans le PIC (le bon, celui des IRQ 9 à 15) et acquitter l'IT dans le PIC quand celle-ci est servie.
    J'ai la doc. tech d'Intel (82c59) mais je ne sais pas ou sont adressés les registres pour les modifier.

    T'es en train d'écrire un driver ou quoi ?
    Non. Je souhaite entrée dans une routine tous les 1ms pour sécurisé un robo. Le problème c'est que mon IT temps réel IRQ_8 (0x70) est défaillante au niveau Hard donc je souhaite provoqué une I.T. via une IRQ libre et un sighal logicique sur la PIN corespondante de mon port PC/104.

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mickael777
    Merci Emmanuel pour la confirmation .

    Je viens de résoudre grâce a ton aide une parti de mon pb (c'était pas bien dur mais je qu'un simple débutant). Voici le code source pour vérifié le bon fonctionnement des interruptions de base comme l'I.T. clavier (0x09) ou l'I.T. Timer (0x08) appelé 18,2 fois par sec. :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <conio.h>
    #include <stdio.h>
    #include <dos.h>
    #define IRQ_0 0x08                    //----N° de l'I.T. Irq_0
     
    int CptInterrupt=0,FinBoucleInfini=0;
    void interrupt ( *AncVectIt)();
     
    void interrupt Irq9()
      {
      CptInterrupt++;
      AncVectIt();
      }
     
    main()
      {
      AncVectIt = getvect(IRQ_0);  //--Valeur de l'ancien vecteur d'I.T
     
      printf("la valeur de l'ancien vecteur est %d\n",AncVectIt);
     
      disable();	         //----Inhibe tous les IRQ
      setvect(IRQ_0,Irq9);
      enable();
     
    while (CptInterrupt < 20 && FinBoucleInfini<6000)
    {printf("Le nombre d'I.T. Irq 9 est : %d\n",CptInterrupt);  FinBoucleInfini++;}
     
    //--------------Initialisation du vecteur d'I.T. a son ancienne valeur--------//
      disable();	      //----Inhibe tous les IRQ
      setvect(IRQ_0,AncVectIt);
      enable();
    //------------------------------------------------------------------------------//
     
      return 0;
      }
    Dérouter une IT matérielle existante, c'est pas trop méchant (elle est déjà active dans le PIC), bien qu'il reste le problème de l'acquittement de l'IT dans le PIC.

    Tu as résolu ce problème en appelant l'ancien handler qui se charge de ce travail.

    Pour l'IRQ9 qui est 'vierge', tu dois tous faire toi même :

    - installation
    - autorisation dans le PIC

    et dans l'IT

    - traitement
    - acquittement dans le PIC.

    Je ne recommande pas le mode EOI qui acquitte tout d'un coup, à moins que ton handler traite toutes les interruptions, ce qui n'est probablement pas le cas.

    Il faut donc acquitter IRQ 9 individuellement dans le le registre qui va bien (pour les détails Google est ton ami, je n'ai pas écrit de driver DOS depuis 1994)
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mickael777
    Ok, j'avais mal compris ton besoin. Il faut aussi autoriser l'IT dans le PIC (le bon, celui des IRQ 9 à 15) et acquitter l'IT dans le PIC quand celle-ci est servie.
    J'ai la doc. tech d'Intel (82c59) mais je ne sais pas ou sont adressés les registres pour les modifier.
    C'est bien le 8250.
    • Le PIC 0 (IRQ 0 à 7) est basé à l'I/O 0x0020.
    • Le PIC 1 (IRQ 8 à 15) est basé à l'I/O 0x00A0.

    T'es en train d'écrire un driver ou quoi ?
    Non. Je souhaite entrer dans une routine tous les 1ms pour sécuriser un robot. Le problème c'est que mon IT temps réel IRQ_8 (0x70) est défaillante au niveau Hard donc je souhaite provoqué une I.T. via une IRQ libre et un sighal logique sur la PIN corespondante de mon port PC/104.
    Ah, c'est un PC/104, OK.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 101
    Points : 59
    Points
    59
    Par défaut
    J'ai finalement trouvé une solution a mon problème, elle pourra peut être aider certain.

    Sur ma carte PC visiblement seul l'IRQ 11 et 12 sont libre et accessible.

    Voici le code source pour générer une routine lors de l'envoi d'un front montant sur le port physique de l'IRQ 11 (ou 12):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #include <stdlib.h>
    #include <conio.h>
    #include <stdio.h>
    #include <dos.h>
    #define IRQ_11 0x73		//----N° de l'I.T. IRQ_11
     
    int CptInterrupt=0,FinBoucleInfini=0,AncMaskItMaitre=0,
    AncMaskItEsclave=0;
     
    void interrupt ( *AncVectIt)();
     
    void interrupt Irq11()
      {
      CptInterrupt++;
      //AncVectIt();
      outport(0xA0,0x20);           //---Marque la fin de l'interruption Esclave
      outport(0x20,0x20);           //---Marque la fin de l'interruption Maitre
      }
     
    main()
      {
      AncVectIt = getvect(IRQ_11);  	//--Valeur de l'ancien vecteur d'I.T
      printf("la valeur de l'ancien vecteur est %d\n",AncVectIt);
      AncMaskItEsclave 	= inport(0xA1);
     
      disable();	         //----Inhibe tous les IRQ
      outport(0xA1,247);      //---Permet de générer un masque sur l'esclave activant seulement l'Irq 11 (on met un 0 sur le bit correspondant)
      setvect(IRQ_11,Irq11);
      enable();
     
    while (CptInterrupt < 20 && FinBoucleInfini<6000)   //---Attente d'un signal d'I.T.
    {printf("Le nombre d'I.T. Irq 11 est : %d\n",CptInterrupt); FinBoucleInfini++;}
     
    //--------------Initialisation du vecteur d'I.T. a son ancienne valeur----------//
      disable();		 //----Inhibe tous les IRQ
      setvect(IRQ_11,AncVectIt);
      enable();
    //------------------------------------------------------------------------------//
     
      outport(0xA1,AncMaskItEsclave);
      printf("la valeur de l'ancien masque esclave est %d\n",AncMaskItEsclave);
     
      NvVectIt = getvect(IRQ_11);  //--Valeur du nouveau vecteur d'I.T
      printf("la valeur du nouveau vecteur est %d\n",NvVectIt);
     
     
      return 0;
      }
    Je tiens a remercier Emmanuel pour son aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une routine dans une étape DATA
    Par jobvince dans le forum SAS Base
    Réponses: 9
    Dernier message: 17/09/2012, 17h51
  2. Appel d'une fonction via l'invite de commande
    Par Pascale38 dans le forum Général Java
    Réponses: 5
    Dernier message: 09/12/2009, 18h12
  3. wsdl : appel d'une methode via le navigateur
    Par Adonis91 dans le forum Services Web
    Réponses: 2
    Dernier message: 29/01/2009, 15h24
  4. Appel d'une routine à partir d'un userform
    Par Blord dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/11/2008, 03h53
  5. Appel d'une méthode via une variable.
    Par seiryujay dans le forum Général Java
    Réponses: 7
    Dernier message: 14/11/2006, 09h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo