Les interruptions en simultanées

Le langage C permet de créer des programmes rapides et proches de la machine

Modérateur : Francois

Avatar du membre
FEFE_CMC
Messages : 22
Enregistré le : mar. 21 avr. 2015 10:34

Les interruptions en simultanées

Message par FEFE_CMC » mar. 12 mai 2015 15:11

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
"Si vous voulez trouver les secrets de l’univers, pensez en termes d’énergie, de fréquence, d’information et de vibration." Nikola Tesla

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Les interruptions en simultanées

Message par guillaume9344 » mar. 12 mai 2015 20:17

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

@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Avatar du membre
FEFE_CMC
Messages : 22
Enregistré le : mar. 21 avr. 2015 10:34

Re: Les interruptions en simultanées

Message par FEFE_CMC » mer. 13 mai 2015 08:26

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/
"Si vous voulez trouver les secrets de l’univers, pensez en termes d’énergie, de fréquence, d’information et de vibration." Nikola Tesla

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Les interruptions en simultanées

Message par guillaume9344 » mer. 13 mai 2015 13:27

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.
@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Avatar du membre
FEFE_CMC
Messages : 22
Enregistré le : mar. 21 avr. 2015 10:34

Re: Les interruptions en simultanées

Message par FEFE_CMC » mer. 13 mai 2015 14:24

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 .....
"Si vous voulez trouver les secrets de l’univers, pensez en termes d’énergie, de fréquence, d’information et de vibration." Nikola Tesla

guillaume9344
Raspinaute
Messages : 629
Enregistré le : mar. 6 janv. 2015 19:44
Localisation : finistere

Re: Les interruptions en simultanées

Message par guillaume9344 » mer. 13 mai 2015 18:14

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 .
@+
rpi b+ ,osmc, motioneyes
rpi 2 raspbian , server minecraft 24h/24 , utilisation gpio
orange pi pc debian ,utilisation gpio, motion cam

Avatar du membre
FEFE_CMC
Messages : 22
Enregistré le : mar. 21 avr. 2015 10:34

Re: Les interruptions en simultanées

Message par FEFE_CMC » lun. 18 mai 2015 08:14

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?

@ +
"Si vous voulez trouver les secrets de l’univers, pensez en termes d’énergie, de fréquence, d’information et de vibration." Nikola Tesla

Korhm
Raspinaute
Messages : 232
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Toulouse

Re: Les interruptions en simultanées

Message par Korhm » lun. 18 mai 2015 11:58

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.

Avatar du membre
FEFE_CMC
Messages : 22
Enregistré le : mar. 21 avr. 2015 10:34

Re: Les interruptions en simultanées

Message par FEFE_CMC » lun. 18 mai 2015 14:11

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
"Si vous voulez trouver les secrets de l’univers, pensez en termes d’énergie, de fréquence, d’information et de vibration." Nikola Tesla

Korhm
Raspinaute
Messages : 232
Enregistré le : ven. 19 sept. 2014 08:13
Localisation : Toulouse

Re: Les interruptions en simultanées

Message par Korhm » lun. 18 mai 2015 15:10

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.

Répondre

Retourner vers « C / C++ »