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 :

interruption d'horloge en c


Sujet :

C

  1. #1
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut interruption d'horloge en c
    salut tout le monde
    Je suis un peu pressé et stressé depuis quelque jour. je suis en train de développer une application TR en C sous turbo C++ pour faire des acquisitions des informations venant des capteurs pour commencer le prof ma donnée l’exemple du help de turbo C sur les fonctions getvect et setvect. Mais je n’arrive pas à comprendre le fonctionnement !
    Pourriez-vous m’aidez s'il vous plait.
    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
    #include <stdio.h>
    #include <dos.h>
    #include <conio.h>
     
    #define INTR 0X1C    /* est ce que  « 0X1C » c’est le numéro de l’interruption dans le vecteur des interruptions */ 
     
    #ifdef __cplusplus /* selon mes recherche sur internet, __cplusplus  définie uniquement dans le cas d'une compilation C++  et on pourra utiliser cette chaîne de remplacement pour distinguer les parties de code écrites en C++ de celles écrites en C */
        #define __CPPARGS ... /* pourquoi cette instruction */
    #else
        #define __CPPARGS /*si elle n’est pas défini alors en la définir maintenant mais elle sert a quoi */
    #endif
    Le grand problème et la :
    void interrupt ( *oldhandler)(__CPPARGS); /*l’utilisation de la fonction interrupt et  différente de la déclaration dans le help du turbo C a cause du  (__CPPARGS); ! */
    int count=0; /*la réinitialisation  du compteur appartient à la procédure void interrupt oldhandler ? Si oui pour quoi on n’utilise pas  accolades {} de la fonction void */
    void interrupt handler (__CPPARGS)
    {
    /* increase the global counter */
       count++; // il est ou le temps!
     
    /* call the old routine */
       oldhandler();
    }
    int main(void)
    {
    /* save the old interrupt vector */
       oldhandler = getvect(INTR);
     
    /* install the new interrupt handler */
       setvect(INTR, handler);
     
    /* loop until the counter exceeds 20 */
       while (count < 20) /*comment se fait l'incrémentation selon quel critère ' je c'est qui'il comptepar l'instruction c++; mais je veux que la fonction dure 30 seconde*/
          printf("count is %d\n",count);
     
    /* reset the old interrupt handler */
       setvect(INTR, oldhandler);
     
       return 0;
    }
    Cordialement.

  2. #2
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut
    bonjour
    est ce que j'ai commis une erreur concernant les règlement du forum ?
    sinon j'ai avancé de ma part INTR c'est interruption de timer 18,2 fois par seconde

  3. #3
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Bonjour,
    si je comprends bien, la fonction interrupt handler est appelée à chaque interruption d'horloge (comme par exemple à l'affichage d'une information à l'écran). Cette fonction incrémente la variable globale count.

    Dans votre main, vous affichez la valeur de ladite variable tant que celle-ci est inférieure à 20. Mais le fait de l'afficher provoque une (ou plusieurs) interruption qui est interceptée et qui incrémente count.

    Cordialement,

  4. #4
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut
    bonsoir,
    tout d'abord merci pour votre réponse.
    alors ,si je peux dire ,lorsque count++ atteint 20 j'aurai 20 * 18,5 a peu plus qu'une secondes ?

  5. #5
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Aucune idée pour le coté temporel de la chose (en revanche, le nom de la variable est "count", "count++" est l'instruction double qui retourne la valeur de count puis incrémente cette variable).

  6. #6
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut
    bonjour ,
    merci prgasp pour me répondre ,peu:
    être j'ai mal exprimé mon problème, bon l'objectif et le suivant, je doit faire deux lecture du port 0x3F8 et 0x3F7:
    1-chaque 30 seconde par exécution de la fonction inp(0x3F8)
    2-chaque 45 seconde par exécution de la fonction inp(0x3F7)
    les lecture elle sont assuré par une "synchronisation si je peux dire ou activation par une les interruption matériel du clock " a traver les fonctions handler,oldHandler,setVect() et getVect().
    bon comme solution j'ai abouti a cette idée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #define CNT_C1 546  // = 18.2 * 30 secondes
    #define CNT_C2 819  // = 18.2 * 45 secondes
    void ....{
    volatile int count_c1 = CNT_C1;
    volatile int count_c2 = CNT_C2;
    volatile int flag_c1 = 0;
    volatile int flag_c2 = 0;
    }
    if (--count_c1 == 0)   // Quand on arrive à 0, ça veut dire que 30 secondes sont passées.
    je lance la lecture par un flag  .

  7. #7
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut
    salut tout le monde ,
    vous avez dit que la fonction interrupt handler est appelée à chaque interruption d'horloge . pour moi c'est une bonne nouvelle "je peux placé ma fonction interrupt n'importe ou dans la main" mais je veux comprendre le comportement (+/-) exacte de se type de programme ,comment ça se passe malgré le fonctionnement séquentiel des instructions !

  8. #8
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Tu n'auras pas ta réponse sur un forum 'C', c'est quasiment du niveau hardware. Quand l'interruption se produit de façon matérielle, le contexte est sauvé dans la pile et le programme va sauter à l'adresse contenue dans le vecteur. L'instruction "fin d'interruption" est invisible en 'C' mais est implémentée à la fin de chaque fonction de type interrupt. Quand cette instruction arrive, le contexte est restauré et le processeur reprend son travail normal exactement là où il s'était arrêté. Je te conseille un livre sur un processeur simple comme le Z80 ou la famille 8031. Ces concepts y sont abondamment expliqués.

    A+

    Pfeuh

  9. #9
    Membre confirmé
    Développeur Web
    Inscrit en
    Novembre 2008
    Messages
    146
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2008
    Messages : 146
    Par défaut
    maintenant je comprend pourquoi j'avais pas des réponses. DSL a tout le monde pour l'ouverture de ce sujet dans un forum C ! ,malgré mon problème aborde la façon avec la quel un programme C fonctionne ,autrement la logique séquentiel dans la fonction main() en présence des interruption "au sens large de terme"
    je vous remercie vraiment pour les réponse
    cordialement

    Echap

Discussions similaires

  1. interruption d'horloge sous windows
    Par mumuri dans le forum Windows
    Réponses: 5
    Dernier message: 11/07/2006, 22h56
  2. interruption clavier
    Par pyrostan dans le forum C
    Réponses: 4
    Dernier message: 13/01/2003, 17h33
  3. Tracer une ligne droite sans les interruptions
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 25/11/2002, 01h22
  4. Bouquins d'Assembleur - interruptions matérielles
    Par Stef784ever dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/11/2002, 21h23
  5. [VB6] [Interface] Horloge 7 segments
    Par selenay dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 07/10/2002, 16h15

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