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 :

probleme precision timer


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut probleme precision timer
    Bonjour,

    J'ai ecrit un code qui doit tourner en temps reel "je vais faire le patch XENOMAI le probleme qu'il presente trop de fluctuations pour un fonctionnement en ordonnancement FIFO.
    J'ai essayé avec un sleep et avec un timer(solution en commentaire) sans ameliorations, on dirait que lorsque je tourne en ordonnancement FIFO ça change rien. Pour une periode 2000 j'obtient des durée variant entre 2100 et 2300 !!!
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    #define _GNU_SOURCE
    #include <pthread.h>
    #include <stdio.h>
    #include <sched.h>
    #include <stdlib.h>
    #include <string.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/time.h>
    #define NBR_CYCLE 10
    #define NBR_TRAME 5
    #define PTU 2000           // 2ms
    #define HIGHEST_PRIORITY 99
     int sync_counter=0;
    ////////////////////////////////////////////////////////////////////
    typedef struct signaux_thread
    {
     
      int sync ;
      char *(*schedule_table)[NBR_TRAME];
     
    }signaux_thread;
     
    //////////////////// THREAD GESTIONNAIRE
    void sync_sig(int numero)
    {
    	sync_counter++;
    }
    //////////////////FONCTION DU THREAD
     
    void *func_thread (void *arg)
    {
    	int j;
    	struct signaux_thread * signal= (struct signaux_thread *)arg;
    	fprintf(stderr,"sync frame number: %d\n ",signal->sync);
     
    	for (j=0;j<NBR_TRAME;j++)
    	{
    		fprintf(stderr,"la trame %s est envoyée\n",signal->schedule_table[signal->sync][j]);	   
    	}
    }
    ///////////////////////////    MAIN
    int main(void)
    {
      int i,j;
      int err,PTU_ms;
    	pid_t pid;
    	pthread_attr_t attr;
    	struct sched_param param_processus;
    	struct sched_param param_thread ;
    	pthread_t thread;
    	char *ScheduleTable[NBR_CYCLE][NBR_TRAME];
    	struct signaux_thread arg;
    	struct timeval elapsed_time ;
    	struct timeval chrono;
    	int priority ;
    	struct sigevent ptu_event;
    	struct itimerspec ptu_period;
    	timer_t ptu_timer;
    	//int sync_counter;
    	///////initialisation du elapsed time
    	gettimeofday(&elapsed_time,NULL);
    	chrono=elapsed_time;
    	fprintf(stdout,"elapsed time= %d \n",elapsed_time.tv_usec-chrono.tv_usec);
     
    	////////////////     AFFECTATION PRIORITE TEMPS REEL FIFO
    		param_processus.sched_priority = HIGHEST_PRIORITY;
    	if (sched_setscheduler(0, SCHED_FIFO, &param_processus) != 0)
    	{
    		perror("sched_setscheduler");
    		exit(EXIT_FAILURE);
    	}
    	/////////////////     AFFECTATION PRIORITE THREAD
    	pthread_attr_init(&attr);
     
    	if ((err=pthread_attr_setschedpolicy(&attr,SCHED_FIFO))!=0)
    	{
    		fprintf(stderr,"setschedpolicy: %s\n",strerror(err));
    		exit(EXIT_FAILURE);
    	}
    	if ((err=pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED))!=0)
    	{
    		fprintf(stderr,"setinheritshed: %s\n",strerror(err));
    		exit(EXIT_FAILURE);
    	}
     
    	param_thread.sched_priority=HIGHEST_PRIORITY;
     
    	if ((err=pthread_attr_setschedparam(&attr,&param_thread))!=0)
    	{
    		fprintf(stderr,"setschedparam: %s\n",strerror(err));
    		exit(EXIT_FAILURE);
    	}
    	/////////////////////////////////////////////////////
    	arg.sync = 0;
    	sync_counter=arg.sync;
    	arg.schedule_table = ScheduleTable;
    	priority=sched_getscheduler(0);
    	switch (priority)
    	{  
    		case SCHED_FIFO :
    			fprintf(stdout,"FIFO PRIORITY IS : %d \n",param_processus.sched_priority);
    			break;
    		case SCHED_RR :
    			fprintf(stdout,"ROUND ROBIN PRIORITY IS : %d \n",param_processus.sched_priority);
    			break;
    		default:
    			fprintf(stdout,"OTHER PRIORITY USED \n");
    			break;
    			} 
    	////////////         REMPLISSAGE SCHEDULE TABLE
    	for ( i=0;i<NBR_CYCLE;i++)
    	{
    		for ( j=0;j<NBR_TRAME;j++)
    		{
    		  ScheduleTable[i][j]=(char*)malloc(3 * sizeof(char));
    		  sprintf(ScheduleTable[i][j],"%d.%d",i,j);
    		}
    	}
    	/////////////////////   CREER UN SIGNAL
     
    	/*	signal(SIGRTMIN,sync_sig);
    	ptu_event.sigev_notify=SIGEV_SIGNAL;
    	ptu_event.sigev_signo=SIGRTMIN;
     
    	PTU_ms=PTU*1000;
    	ptu_period.it_value.tv_sec=PTU_ms/1000000000;
    	ptu_period.it_value.tv_nsec=PTU_ms%1000000000;
    	ptu_period.it_interval=ptu_period.it_value;
    	if(timer_create(CLOCK_REALTIME,&ptu_event,&ptu_timer)!=0)
    	{
    		perror("timer_create");
    		exit(EXIT_FAILURE);
    	}
    	if(timer_settime(ptu_timer,0,&ptu_period,NULL)!=0)
    	{
    		perror("timer_settime");
    		exit(EXIT_FAILURE);
     
    		}*/
     
    	/////////////////////   EXECUTION DU THREAD
    	while(1)
    	  {////////solution avec sleep
    	  if((err=pthread_create(&thread,& attr,func_thread,&arg)!=0))
    	    {
    	      fprintf(stderr,"can't create thread %s \n",strerror(err));
    	      exit(EXIT_FAILURE);
    	    }
     
    	  usleep(PTU);
    	  chrono=elapsed_time;
    	  gettimeofday(&elapsed_time,NULL);
    	  fprintf(stdout,"elapsed time= %d \n",((elapsed_time.tv_usec-chrono.tv_usec)));
     
    	  arg.sync++;
    	  if (arg.sync==NBR_CYCLE)
    	    {arg.sync=0;}
     
    	}
    	/////////////2 eme solution avecun TIMER 
    	/*arg.sync=sync_counter;
    	  	if (arg.sync==NBR_CYCLE)
    		{arg.sync=0;}
    		if((err=pthread_create(&thread,&attr,func_thread,&arg)!=0))
    		{
    			fprintf(stderr,"can't create thread %s \n",strerror(err));
    			exit(EXIT_FAILURE);
    		}
    		chrono=elapsed_time;
    		gettimeofday(&elapsed_time,NULL);
    		fprintf(stdout,"elapsed time= %d \n",(elapsed_time.tv_usec-chrono.tv_usec));
     
    		pause();
    		}*/
     
    }
    et ça donne
    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
    sync frame number: 0
     la trame 0.0 est envoyée
    la trame 0.1 est envoyée
    la trame 0.2 est envoyée
    la trame 0.3 est envoyée
    la trame 0.4 est envoyée
    elapsed time= 2125 
    sync frame number: 1
     la trame 1.0 est envoyée
    la trame 1.1 est envoyée
    la trame 1.2 est envoyée
    la trame 1.3 est envoyée
    la trame 1.4 est envoyée
    elapsed time= 2139 
    sync frame number: 2
     la trame 2.0 est envoyée
    la trame 2.1 est envoyée
    la trame 2.2 est envoyée
    la trame 2.3 est envoyée
    la trame 2.4 est envoyée
    elapsed time= 2188 
    sync frame number: 3
     la trame 3.0 est envoyée
    la trame 3.1 est envoyée
    la trame 3.2 est envoyée
    la trame 3.3 est envoyée
    la trame 3.4 est envoyée
    elapsed time= 2141

  2. #2
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Ne parlerais-tu pas de XENOMAI ?

    Je n'ai pas encore lu la doc... mais es-tu sûr qu'il fait du temps réel strict ?
    Il y a le temps réel strict, et le temps réel souple (qui a l'air d'être ton cas), si je me souviens bien....
    Si XENOMAI est préemptif... alors il est plutôt normal que tu n'ais pas exactement le 2000 souhaité....

    Je ne suis pas expert dans le domaine... je vais lire la doc... tu devrais peut être aussi demander à la communauté XENOMAI ce genre de détails et problèmes.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut
    Bon regardes pour le moment je parle de linux sans patch xenomai...
    Mais est ce que c'est normal d'avoir cette marge de fluctuations ?
    Je sais que je ne peux pas avoir les 2000 exactement car je ne travaille ni en temps réel strict ni en temps réel souple pour le moment mais puisque j'utilise l'ordonnancement FIFO donc pas de préemption et je m'attendais a des résultats plus précises disons +/- 50. vous voyez ??

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je ne saurai que trop te conseiller de lire le blog de Christophe Blaess qui a consacré pas mal d'ailleurs ces derniers temps à Linux RT, Xenomai et autres fluctuations de timers et interruptions.

    Le blog : http://www.blaess.fr/christophe

    Quelques articles en particulier :
    http://www.blaess.fr/christophe/2013...pio-avec-rtdm/
    http://www.blaess.fr/christophe/2012...-raspberry-pi/
    http://www.blaess.fr/christophe/2012...es-de-xenomai/
    http://www.blaess.fr/christophe/2012...x-et-linux-rt/
    http://www.blaess.fr/christophe/2012...-timers-linux/

    Bonne lecture ^^


    Autre question : ton scheduling FIFO ne concerne que les threads de ton programme, et non tous les programmes en cours ?

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut
    Regardez, le probleme ce n'est pas le temps reel lui meme!! C'est plutot la difference du scheduling FIFO qui n'est pas mise en evidence d'apres mes test !! c'est ça le probleme

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Autre question : ton scheduling FIFO ne concerne que les threads de ton programme, et non tous les programmes en cours ?
    Non ça concerne les deux !!! Les threads ainsi que le processus lui meme sont en scheduling FIFO.

  7. #7
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Hmmm...
    Pas mal de documents disent que faire tourner en FIFO des pthreads va à l'encontre de ce que tu recherches...
    FIFO = tant qu'aucun autre thread monte en priorité, le thread courant tourne...
    Tandis qu'en Round Robin (RR), là le slice de temps est beaucoup plus respecté....

    Tu devrais passer en RR plutôt que FIFO si tu tiens à avoir du 2000 et pas du 2300.

    Un lien qui a l'air utile
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

Discussions similaires

  1. Probleme de Timer
    Par Uren dans le forum MATLAB
    Réponses: 3
    Dernier message: 09/02/2011, 12h27
  2. probleme de Timer
    Par faniette dans le forum C++Builder
    Réponses: 4
    Dernier message: 01/07/2008, 08h07
  3. Probleme avec Timer, TimerTask
    Par Microturnip dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 12/05/2008, 23h16
  4. probleme de timer
    Par eseb777 dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 26/01/2007, 09h48
  5. [VB.NET] Probleme de Timer
    Par Aspic dans le forum Windows Forms
    Réponses: 7
    Dernier message: 14/01/2006, 13h41

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