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

Windows Discussion :

gestion des interruptions en C


Sujet :

Windows

  1. #1
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut gestion des interruptions en C
    Bonjour,

    En embarqué, quelquesoit le microprocesseur ou le microcontrôleur, on peut toujours écrire quelquechose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Timer0_Init(int ticks){
        /*
        Code de l’init
        */
    }
    
    __interrupt void Timer0( void ){
        /*
        Code de l’interruption
        */
    }
    Est-ce possible sous Windows? Si ce n'est pas possible ce que je crains fortement, y a t-il une alternative à cette façon de gérer une interruption timer?

    A+

    Pfeuh

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 593
    Points
    41 593
    Par défaut
    On ne peut pas toucher directement aux interruptions sous Windows.
    Sauf en développant un driver.

    Mais ti tu veux un timer, tu peux en avoir sous Windows (généralement en programmmation fenêtrée, par contre).

  3. #3
    Membre averti Avatar de pascal.barbier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2007
    Messages : 362
    Points : 442
    Points
    442
    Par défaut
    Voir SetTimer
    Effectivement il faut une application fenêtrée ou plus exactement une application qui contient une pompe à message (while getMessage...) car le signal de timer est un message WM_TIMER enfilé dans la file d'attente de l'application.

  4. #4
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut;

    Merci pour vos réponses. En fait il y a quelques années, j'avais fait en VB une boite à rythmes. Je convertissais les BPM (avec une résolution de 96 pas par noire) en ticks et j'appelais une fonction d'une dll windows (dont j'ai oublié le nom...), il suffisait de lui passer le nombre de ticks et l'adresse (callback) de ma routine à exécuter tous les xx millisecondes.

    Pour un autre projet, entièrement en C MInGW + SDL, j'aimerai utiliser cette interruption timer qui me convient tout à fait. Quelqu'un aurait le nom de la dll et éventuellement le nom de la fonction? Merci d'avance, je m'en vais de ce pas jeter un oeil sur le tutoriel API Windows, on ne sait jamais, il y a peut-être un exemple d'appel en C...

    Pfeuh.

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 483
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 483
    Points : 20 736
    Points
    20 736
    Par défaut
    On peut également utiliser QueryPerformanceCounter et GetTickCount

  6. #6
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,
    Citation Envoyé par Mat.M Voir le message
    On peut également utiliser QueryPerformanceCounter et GetTickCount
    Sauf erreur de ma part, ces 2 fonctions servent à mesurer le temps, or je voudrais exécuter une fonction toutes les xxx millisecondes. Une interruption timer, en fait.

    A+

    Pfeuh

  7. #7
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    je voudrais exécuter une fonction toutes les xxx millisecondes
    Dans ce cas tu dois te tourner vers les horloges de temporisation.
    voir CreateWaitableTimer() et SetWaitableTimer() dans la msdn.
    Cordialement.

  8. #8
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,
    Citation Envoyé par nicolas.sitbon Voir le message
    Dans ce cas tu dois te tourner vers les horloges de temporisation.
    voir CreateWaitableTimer() et SetWaitableTimer() dans la msdn.
    Cordialement.
    Merci, je dois pouvoir me débrouiller avec la fonction SetWaitableTimer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BOOL WINAPI SetWaitableTimer(
      __in      HANDLE hTimer,
      __in      const LARGE_INTEGER* pDueTime,
      __in      LONG lPeriod,
      __in_opt  PTIMERAPCROUTINE pfnCompletionRoutine,
      __in_opt  LPVOID lpArgToCompletionRoutine,
      __in      BOOL fResume
    );
    Si j'ai bien compris, ma routine s'appellant par ex. myInt, il me faudrait écrire quelquechose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SetWaitableTimer(???, ticks,???,&myInt,???);
    
    void myInt (void){
        /*
        mon code d'interruption
       /*
    }
    Il ne me reste plus qu'a trouver de la doc sur les paramètres et le nom de la dll à inclure... Ca fait un peu "course à l'échalotte", mais bon, j'avance!

    Encore merci et bonne journée a tous!

    Pfeuh

  9. #9
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Je viens de retrouver le "multimedia timer" que j'avais utilisé pour la boite à rythmes.

    Multimedia Timers

    The multimedia timer is quite a different creature. It does not post any messages to message queues, but instead calls the specified callback function directly (or, alternatively, it can set or pulse the specific event, but that option will not be covered in this article). Therefore, it is more accurate than the standard Win32 timer, but also more dangerous. Here, we do not have a message queue to protect us if we specify short elapse time.


    beaucoup plus de détails ici, dans le chapitre MULTIMEDIA TIMER
    http://www.codeproject.com/system/ti...select=1324357

    A+

    Pfeuh

  10. #10
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut Exemple de code C
    Bonjour,

    Voici un exemple de code d'appel d'un "multimedia timer" en C. Le compilateur est MinGW. l'interruption incrémente un compteur, le programme principal affiche le contenu du compteur. Le code qui suit est ASIS à titre d'exemple.
    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 <windows.h>
    #include <stdio.h>
    
    unsigned long ticks = 0;
    unsigned int IdTimer = 0;
    
    // cette fonction incremente simplement un compteur
    void CALLBACK myInt(unsigned int arg1, unsigned int arg2, int arg3, DWORD arg4, DWORD arg5){
    	ticks++;
    }
    
    int main(int argc, unsigned char** argv){
    
    	// definition de la periode de l'it, 47 millisecondes, 21 Hz a peu pres 
    	#define PERIODE 47
    
    	// calcul de la resolution maximum
    	TIMECAPS tc;
    	timeGetDevCaps(&tc, sizeof(TIMECAPS));
    	DWORD resolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
    	timeBeginPeriod(resolution);
    
    	// configuration d'une interruption appelant "myInt" toutes les 47 millisecondes
    	IdTimer = timeSetEvent(PERIODE, resolution, (LPTIMECALLBACK) myInt, (DWORD)0, TIME_PERIODIC);
    	// numero du process-timer pour pouvoir le detruire en sortant
    	printf("Id du timer : %u\n",IdTimer);
    
    	//affichage pendant 5 secondes des ticks incrementes par l'interruption
    	while (ticks < 5000 / PERIODE){
    		printf("\r%u",ticks);
    	}
    
    	// destruction du timer
    	timeKillEvent(IdTimer);
    
    	// retour au programme appelant
    	return (0);
    }
    commande de compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc main.c -lwinmm -o main
    A+

    Pfeuh

  11. #11
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 483
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 483
    Points : 20 736
    Points
    20 736
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Salut,

    Sauf erreur de ma part, ces 2 fonctions servent à mesurer le temps, or je voudrais exécuter une fonction toutes les xxx millisecondes. Une interruption timer, en fait.
    Pfeuh
    oui tu as raison ; mais il suffit de calculer le delta entre 2 appels à GetTickCount() pour appeler des fonctions.

    Tu écris utiliser SDL; il faut prendre les fonctions de SDL SDL_GetTicks() je crois sinon ça risque de ne pas fonctionner correctement.
    Aller dans la FAQ SDL

  12. #12
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    sous SDL, la fonction SDL_AddTimer permet de créer un nouveau timer avec son callback associé, ça s'utilise exactement comme je le voulais dans mon premier post... A la différence qu'on peut passer des paramètres au callback. A mon avis, sous Windows, la fonction SDL_AddTimer est une simple encapsulation d'un multimedia timer windows.

    A+

    Pfeuh

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

Discussions similaires

  1. Gestion des interruptions MATLAB
    Par dadouwhite dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 15/04/2011, 00h00
  2. gestion des interruptions
    Par jsebfranck dans le forum Langage
    Réponses: 2
    Dernier message: 06/07/2007, 10h15
  3. Gestion des interruptions du µProcesseur
    Par herve13 dans le forum Assembleur
    Réponses: 3
    Dernier message: 22/08/2005, 21h51
  4. Gestion des interruptions du microprocesseur sous XP
    Par herve13 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 20/08/2005, 19h29
  5. Réponses: 7
    Dernier message: 02/03/2005, 15h45

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