Page 1 sur 2

Les interruptions en simultanées

Posté : mar. 12 mai 2015 15:11
par FEFE_CMC
Bonjour, me voici de retour pour une nouvelle questions .

Cette fois ci j'ai fais le code ci dessous avec la librairie wiringPi.

Code : Tout sélectionner

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>




// the event counter 
volatile int eventCounter = 0;
volatile int eventCounter1 = 0;

// -------------------------------------------------------------------------
// myInterrupt:  called every time an event occurs
void myInterrupt(void) 
{
   eventCounter++;
}

void myInterrupt2(void) 
{
   eventCounter1++;
}

// -------------------------------------------------------------------------
// main
int main(void) 
{
  wiringPiSetupPhys();
  wiringPiISR (37, INT_EDGE_FALLING, &myInterrupt);
  wiringPiISR (38, INT_EDGE_FALLING, &myInterrupt2);

  while ( 1 ) 
  {
    printf( " compteur 1 :%d\ncompteur 2 :%d\n", eventCounter,eventCounter1 );
    eventCounter = 0, eventCounter1 = 0;
    delay( 1000 ); // wait 1 second
  }

  return 0;
}
 


Je voulais savoir si mes 2 interruptions dans le cas present s'excute en meme temps ou l'une apres l'autre ?

En effectuant quelques test avec des delay j'ai l'impression qu'elles s'execute bien en meme temps mais pouvez vous me le confirmer ?

CDT

FEFE_CMC

Re: Les interruptions en simultanées

Posté : mar. 12 mai 2015 20:17
par guillaume9344
A l 'échelle humaine , les interruptions sont simultanées, à l 'échelle des µcontroleurs, elles sont traités les une après les l'autre. pour avoir plus de détaille il faudrait avoir les sources de wringpi, mais je soupçonne une détection par "polling"
une boucle sans fin qui scrute en continu les entrées du pi

@+

Re: Les interruptions en simultanées

Posté : mer. 13 mai 2015 08:26
par FEFE_CMC
Oui je sais qu'a l'echelle humaine les interruptions sont simultanées mais cependant je dois traiter un signal se repetant au maximum toutes les 500ns donc environ 2Mhz afin d'optimiser ma progra je voulais savoir si il existait un moyen d'executé plusieurs interruptions en simultané au cas ou mais interruptions se presenterai au meme moment a l'echelle humaine!

Source wiringPI : http://wiringpi.com/reference/priority- ... d-threads/

Re: Les interruptions en simultanées

Posté : mer. 13 mai 2015 13:27
par guillaume9344
Non on ne peut pas executer plusieures interuption en meme temps.c est plur cela que les programmew d interuptions
doiveng etre tres cours dt redonner la main le plus vite possible, pour pouvoir traiter d autre interuptionw qui interviendraient
. Dans votre cas il prendre en compte le temps de detection et aussi le temps de traitement, qui pourait depassdr 500 ns.
Il faudrait faire des essais en hard pour connaitre le temps de reaction.
@+

Re: Les interruptions en simultanées

Posté : mer. 13 mai 2015 14:24
par FEFE_CMC
Je sais bien j'ai deja fait l'erreur de vouloir programmer en python.... La frequence de clignotement de ma led etait de 72khz environ.
En C avec la librairie wiringPi on montait a 4Mhz et avec la librairie native jusqu'a 5.2Mhz ..... Le signal que j'ai a analyser ayant une frequence max de 2Mhz ca devrait le faire ?

je pense que cela est possible regardez le lien que je vous ai passé, dans la parti concurent processing (Multi-threading) c'est en anglais et mon anglais est approximatif mais il me semble bien que c'est possible .....

Re: Les interruptions en simultanées

Posté : mer. 13 mai 2015 18:14
par guillaume9344
J y bite pas plus que vous en peau-rouge, avec les thread on touche à la programmation du coeur de raspbian et mes compétences s' arrêtent ici.
Il faut voir avec les moustachus de linux.
Il faudrait nous en dire plus sur ce mystérieux signal (bon depuis deux sujets différent on sais qu il se répéte au max toutes les 500ns) mais d' ou provient il, quelle est ca forme , quelles actions sont à effectuer après detection de ce signal
.en gros nous expliquer un peux votre projet. Parfois une solution alternative est parfois possible mais on y pense tout simplement pas .
@+

Re: Les interruptions en simultanées

Posté : lun. 18 mai 2015 08:14
par FEFE_CMC
Pour faire simple en gros...
Mon systeme d'acquisition de données vient de capteurs dont le signal est deja traité c'est capteur releve un evenement aleatoire symbolisé par une impulsion TTL 0-5V. Et chaques impulsions incremente un compteur qui sert a un algorythme de calcul pour determiner different seuil de detection.

P.S : De quelles informations necessaire avez vous besoin?

@ +

Re: Les interruptions en simultanées

Posté : lun. 18 mai 2015 11:58
par Korhm
Bonjour,

d'après ce que je comprends de la documentation fourni, la fonction wiringPiISR() ne peut traiter un maximum que de deux interruptions en même temps : celle en cours, et une nouvelle qui arrive. Si une interruption arrive, la fonction indiqué sera appelée (dans ton cas myInterrupt() ). Si dans le même temps une deuxième interruption arrive, il faudra attendre que myInterrupt() soit terminée pour la prendre en compte. Pendant ce temps là toute autre interruption sera ignorée.

Pour être sûr de ne rater aucune interruption, on peut jouer avec le multithreading.
Quelque chose du genre pourrait fonctionner (non tester (ça fait longtemps que je n'ai pas fait de C), et probablement améliorable en faisant passer un pointeur vers le compteur désiré plutôt que de dupliquer les fonctions)

Code : Tout sélectionner

.....
PI_THREAD(incrementCounter1)
{
    eventCounter1++;
}

void myInterrupt(void) {
    piThreadCreate(incrementCounter1);
}

// -------------------------------------------------------------------------
// main
int main(void) 
{
  wiringPiSetupPhys();
  wiringPiISR (37, INT_EDGE_FALLING, &myInterrupt);
  wiringPiISR (38, INT_EDGE_FALLING, &myInterrupt2);

  while ( 1 ) 
  {
    printf( " compteur 1 :%d\ncompteur 2 :%d\n", eventCounter,eventCounter1 );
    eventCounter = 0, eventCounter1 = 0;
    delay( 1000 ); // wait 1 second
  }

  return 0;
}
 

Mais dans ton cas, le contenu des fonctions myInterruptX() est tellement basic et rapide & exécuté, que je ne pense pas qu'il soit nécessaire de multithreader. A moins que t'es interruptions arrivent à une fréquence de l'ordre des millisecondes.

Re: Les interruptions en simultanées

Posté : lun. 18 mai 2015 14:11
par FEFE_CMC
La est le probleme le signal ce repetant au maximum toutes les 500ns il faut que ma programation soit le plus optimisé possible . je vais quelques test avec le multithreading ....

Une question le multithreading peut s'utiliser sans la fonction wiringPiISR () ?

Si oui de quelle maniere car je n'ai pas tres bien compris la doc ......

Le multi thread s'utilise de cette maniere ?

Code : Tout sélectionner

//Declaration de la fonction 
PI_THREAD(incrementCounter1)
{
    eventCounter1++;
}

//Appel de la fonction
piThreadCreate(incrementCounter1);
et comment la declenché sur un niveau ou un front peu importe c'est pareil cela change juste quelques lignes je pense ?....

Mais je ne vois aucun bit de flag ni de pin mentionné dans la doc ?

Et ceci est un programme test mon interruption integrera aussi un algo de calcul

Re: Les interruptions en simultanées

Posté : lun. 18 mai 2015 15:10
par Korhm
FEFE_CMC a écrit : Une question le multithreading peut s'utiliser sans la fonction wiringPiISR () ?
Si oui de quelle maniere car je n'ai pas tres bien compris la doc ......
Le multi thread s'utilise de cette maniere ?

Code : Tout sélectionner

//Declaration de la fonction 
PI_THREAD(incrementCounter1)
{
    eventCounter1++;
}

//Appel de la fonction
piThreadCreate(incrementCounter1);
Oui Mais dans ce cas là, tu créer un thread qui va être appelé directement, sans attendre une interruption. Pas vraiment d'intérêt dans ton cas.

Pour reprendre l'exemple de code que j'avais mis :
1. Le programme attend un changement d'état sur le PIN indiqué grâce à la fonction wiringPiISR(). Pourquoi veux-tu t'en passer ?
2. Au moment où l'interruption arrive, le programme la prend en compte et libère la place dans le "dispatcher", puis appelle la fonction myInterrupt()
3. Pendant ce temps, le programme ne sait pas traiter d'autre interruption tant que myInterrupt() n'est pas finie. Le dispatcher n'a plus qu'une seule place de libre pour accueillir une nouvelle interruption.
4. On va donc dire au programme de créer un processus à part et en parallèle (grâce piThreadCreate() )pour gérer les calculs, et terminer myInterrut(), afin de pouvoir revenir à l'étape 1.