Bonjour à tous,
j'exécute une séquence de calcul toutes les 10ms. Afin d'avoir une bonne précision de temps au niveau de la boucle de calcul, j'ai réglé un timer (via setitimer) qui est responsable de l'émission d'un signal SIGALRM récupéré par une routine qui incrémente un compteur. Dès que ce compteur est incrémenté, on recommence les calculs. Une fois terminé, on se met en pause() et on attend que le timer arrive à 0 à nouveau, pour réémettre un SIGALRM qui incrémentera à nouveau le compteur etc... En bref, voici le code :
void IncrementLoop () // signal
{
k=k+1;
}
struct itimerval controlloop;
struct timeval delay, offset;
int main(int argc, char *argv[])
{
delay.tv_sec = 0;
delay.tv_usec = 10000;
offset.tv_sec = 0;
offset.tv_usec = 100;
controlloop.it_interval = delay;
controlloop.it_value = offset;
setitimer(ITIMER_REAL,&controlloop,NULL);
signal(SIGALRM, IncrementLoop);
k = 0;
kold = 0;
while(flag == 1) {
while(k == kold) pause();
kold = k;
/* séquence de calculs qui va modifier le flag si nécessaire pour sortir
de cette boucle de calcul */
}
}
Ce programme fonctionne, mais il a la mauvaise habitude de parfois générer une SEGFAULT et de se couper en plein milieu de la boucle de calcul... A la compilation, il n'y pas d'erreurs. J'ai égalament utilisé Valgrind pour débugger, mais cela ne m'a rien apporté comme informations supplémentaires.
Ce que j'aimerais savoir, c'est si le temps de calcul dépasse les 10ms réglés avec le timer, est-ce que ça pourrait générer l'erreur de segmentation et faire planter le programme ?
Je suis nouveau sur le forum, s'il manque des infos n'hésitez pas à me le signaler.
Merci
Partager