Service d'interruption

Les interruptions sont importantes pour éviter de monopoliser un micropocesseur pour scruter une touche de clavier par exemple (ce qui est le cas en poolling).

Dans un mode interruption, un évenement est associé à une structure matérielle ou logicielle. Si la structure est activée (bouton pressé par exemple) l'évènement déclenche un sous programme d'interruption.


Exemple de code (sources : https://github.com/WiringPi/WiringPi/blob/master/examples/isr.c)


// * Copyright (c) 2013 Gordon Henderson.

// La patte générant les interruptions est associée à la patte 11 du connecteur du RaspBerry


#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <stdlib.h>

#include <wiringPi.h>


#define        BUTTON_PIN        0 //PIN 0  = GPIO0


static volatile int globalCounter = 0 ; //on utilise un compteur d'évènements


// la procedure recevant les interruptions. Placer ici le code de traitement

void myInterrupt (void)

{

 ++globalCounter ;//Dans cet exemple on ne fait qu'incrémenter un compteur

}


// main


int main (void)

{

 int myCounter = 0 ;


 if (wiringPiSetup () < 0)

 { //la bibliothèque n'a pas pu s'initialiser

   fprintf (stderr, "Unable to setup wiringPi: %s\n", strerror (errno)) ;

   return 1 ;

 }


 if (wiringPiISR (BUTTON_PIN, INT_EDGE_FALLING, &myInterrupt) < 0)

 { //ici on associe la procedure à la patte qui déclenche l'évènement

   fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;

   return 1 ;

 }



 for (;;)

 {

   printf ("Waiting ... ") ;

fflush (stdout) ;//

       //on attend que quelque chose se passe (que global counter changer ce qui signifie qu'un evènement est        //arrivé

   while (myCounter == globalCounter)

     delay (100) ;

   printf (" Done. counter: %5d\n", globalCounter) ;

   myCounter = globalCounter ;

 }

 return 0 ;

}