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 :

les interruptions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Inscrit en
    Novembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2005
    Messages : 97
    Par défaut les interruptions
    Bon jour

    Qu'elle est la fonction qui permer d'éxecuter(ou déclancher)une interruption materiel sous C/C++

    pour les interruptions logiciels, il ya plusieurs fonctions définit dans la bibliothèque "Dos.h",ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    asm
    int numero_interruption_logiciel;
    mais pour les interruptione materiels ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: les interruptions
    Citation Envoyé par sofiane44
    Qu'elle est la fonction qui permer d'éxecuter(ou déclancher)une interruption materiel sous C/C++
    Il n'y a pas de C/C++.
    Ce n'est pas possible en C standard.
    pour les interruptions logiciels, il ya plusieurs fonctions définit dans la bibliothèque "Dos.h",ou bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    asm
    int numero_interruption_logiciel;
    mais pour les interruptione materiels ?
    Par définition, une interruption matérielle ne peut être déclenchée que par ... le matériel.

    En fait certaines architectures acceptent de déclencher un 'TRAP' (Motorola/Freescale) ou un 'INT' (Intel) correspondant à une interruption matérielle si elle est vectorisée, mais le résultat est imprévisible. En effet, rien ne dit que le code va s'exécuter au bon moment... avec le hard, on ne fait pas n'importe quoi...

    Bref, ce que tu veux faire relève de la haute voltige (et n'a rien à voir avec le langage C).

    Que veux tu faire exactement ? Dans quel contexte (machine, système) ?

  3. #3
    Membre confirmé

    Inscrit en
    Novembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2005
    Messages : 97
    Par défaut
    le but:
    j'ai changé les adresses des interruptions matériels dans la table d'interrution,et j'ai mettre des adresse vers mes sous-programmes

    alors lorsqu'une interruption materiel est declanché,le gestionnaire d'interrution va envoyé l'adresse de mon ous-porgramme qui traite cette interrution declanché par le materiel concerné pour le executer par le CPU

    la but : la porgrammation de PIC:

    j'ai immmplémenté les fonctions qui manipulent la gestion du controleur d'interruptions(PIC):

    -acceder au registre IRR(interrupt request register):pour obtenir les interrution materiels en attentes

    -acceder au registre ISR(interrupt service register):pour obtenir l'interruption materiel en cours d'execution par le CPU

    -acceder au registre IMR(interrupt Mask register):pour ontenir les interrution marteriel maské
    -maské et demaské les interruptions materiels

    touts ça est fait.

    et le porbleme c'est : comment declancher ces interrution materiels
    pour fonctioner le travail des 3 registes sdu PIC(IMR,IRR,ISR) avec les fonctions immplémentés

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sofiane44
    le but:
    j'ai changé les adresses des interruptions matériels dans la table d'interrution,et j'ai mettre des adresse vers mes sous-programmes
    qui sont bien sûr définis avec le qualificateur 'interrupt' ou équivallent de ton implémentation, et qui n'admettent pas de paramètres...
    alors lorsqu'une interruption materiel est declanché,le gestionnaire d'interrution va envoyé l'adresse de mon ous-porgramme qui traite cette interrution declanché par le materiel concerné pour le executer par le CPU
    Ok, et bien sûr, tu gères la fin d'interruption correctement et dans le bon ordre...
    la but : la porgrammation de PIC:

    j'ai immmplémenté les fonctions qui manipulent la gestion du controleur d'interruptions(PIC):

    -acceder au registre IRR(interrupt request register):pour obtenir les interrution materiels en attentes

    -acceder au registre ISR(interrupt service register):pour obtenir l'interruption materiel en cours d'execution par le CPU

    -acceder au registre IMR(interrupt Mask register):pour ontenir les interrution marteriel maské
    -maské et demaské les interruptions materiels

    touts ça est fait.
    OK. Attention, dans un PC moderne, il y a 2 PICs... un pour le int 0-7 et l'autre pour 8-15...

    Et pour pouvoir bricoler tout ça, je suppose que tu es sous DOS... Borland C?
    et le porbleme c'est : comment declancher ces interrution materiels
    pour fonctioner le travail des 3 registes sdu PIC(IMR,IRR,ISR) avec les fonctions immplémentés
    Pas possible. Il faudrait ecrire dans un port annexe (OUT2 de la carte série, par exemple) qui commanderait physiquement l'IRQ. Il y a du cablage à faire, je ne recommande pas.

    Qu'est ce qui t'empeche de déclencher les interruptions physiques 'naturellement' ? Tu es chez toi en simulation, c'est ça ? Pas de panique, tu feras ça demain au labo...

    Bref, on est complètement hors-sujet...

  5. #5
    Membre confirmé

    Inscrit en
    Novembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2005
    Messages : 97
    Par défaut
    On peut déclancher les interruptions materiels,natureulement
    par exemlpes:
    accéder au disquette,appuyer sur une touche clavier,.....

    on peut citer 16 interruptions materiels reliant avec 2 pics en cascade(pic maitre,et pic esclave)

    les adresse des 8 interruptions matriels dans la tables d'interruptions sont:
    pour un pics maitre: 8h,9h,10h,....,24h
    pour un pics esclave: 70h,71h,.....,8Ch

    est ce que: un appelle d'interruption par logiciel :

    asm
    int 8h;

    peut declancher l'interruption materiel 8h(Timer)
    puisque ont la meme adresse!!

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sofiane44
    est ce que: un appelle d'interruption par logiciel :
    peut declancher l'interruption materiel 8h(Timer)
    puisque ont la meme adresse!!
    Techniquement, c'est possible, mais comme le matériel n'a pas bougé, son état est imprévisible. Le comportement est indéfini.

    Par exemple :

    Quel va être l'effet d'acquitter une interruption qui ne s'et pas declenchée ?
    Dans quel état sera le PIC ?

    Les interruption 'soft' (INT x), c'est pas fait pour simuler des interruptions déclenchées par hard. C'est fait pour implémenter des fonctions systèmes.

    Je n'arrive toujours pas à cerner ce que tu veux faire. Si tu pouvais l'expliquer... Je sens qu'il y a une erreur de conception quelque part.

  7. #7
    Membre confirmé Avatar de gijy
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 136
    Par défaut
    Je te post un exemple ecrit en borland pour une platforme PC ca peut aider.
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <conio.h>
    #include <stdio.h>
    #include <dos.h>
    /* Interrupt management */
    #define DISABLE() asm { CLI }
    #define ENABLE() asm { STI }
     
    #define OUTB(p,v) outp(p,v)
    #define OUTW(p,v) outpw(p,v)
    #define INB(p)    inp(p)
    #define INW(p)    inpw(p)
     
    #define LONGTOPOINTEUR(l) MK_FP((int)(0xFFFF&(l>>4)), (int)(0xF&l))
    #define POINTEURTOLONG(p) (((long)FP_SEG(p))<<4) + FP_OFF(p)
     
    #define _clearir1(irno) OUTB(0x20, 0x60+irno)
    #define _clearir2(irno) OUTB(0xa0, 0x58+irno), OUTB(0x20, 0x62)
    #define CLEARIR(irno) irno < 8 ? _clearir1(irno) : _clearir2(irno)
     
    #define SETVECT(v,r) setvect(v,r)
    #define GETVECT(v)   getvect(v)
     
    #define ENABLEIR(irno) \
    	DISABLE(); \
    	if ( irno >= 8 ) { \
    		OUTB(0x21, INB(0x21) & ~(1<<2)); \
    		OUTB(0xa1, INB(0xa1) & ~(1<<(irno&7))); \
    	} else { \
    		OUTB(0x21, INB(0x21) & ~(1<<(irno&7))); \
    	} \
    	ENABLE(); \
     
    #define DISABLEIR(irno) \
    	DISABLE(); \
    	if ( irno >= 8 ) { \
    		OUTB(0xa1, INB(0xa1) | (1<<(irno&7))); \
    	} else { \
    		OUTB(0x21, INB(0x21) | (1<<(irno&7))); \
    	} \
    	ENABLE();
    #define IT_CAN 0x7
    int cpt;
     
    void interrupt can(void)
    {
     DISABLEIR(IT_CAN);
     cpt++;
     ENABLEIR(IT_CAN);
     CLEARIR(IT_CAN);
    };
     
    main()
    {
    char far *ptr;
    int i;
     
    cpt=0;
    setvect(IT_CAN+8,can);
    ENABLEIR(IT_CAN);
    CLEARIR(IT_CAN);
     
    while(kbhit()==0)
    {
    	gotoxy(0,20);
    	printf("cpt %i\n",cpt);
    }
     return 0;
    }
    Attention c'est juste un bout de code pour jouer avec les it hards.
    Dans l'absolue il faudrait sauvegarder l'ancien vecteur et le restituer en fin de pgm.
    Pour test ta routine it tu peut eventuellement la lancer avec cette fonction
    portable pour dos et win16 uniquement.
    #include <dos.h>
    void intr(int intno, struct REGPACK *preg);

Discussions similaires

  1. Erreur dans BosoKernel pour les interruptions ?
    Par Edouard Kaiser dans le forum Autres architectures
    Réponses: 8
    Dernier message: 05/11/2017, 09h27
  2. Comment le SE Windows Gère les interruptions ?
    Par elmessoussi dans le forum Windows
    Réponses: 2
    Dernier message: 16/10/2005, 23h29
  3. Les interruptions + ring 0 ?
    Par MonsieurAk dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 29/09/2003, 08h51
  4. Les interruptions sous Windows et Linux
    Par Descartes dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 07/06/2003, 22h42
  5. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22

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