/***************************************************************************/ /* Programm zur Berechnung der Abweichung der Systemfunktion "nanosleep()" */ /* bei verschiedenen Wartezeiten (von 0 bis 50 Millisekunden). */ /* Jede Messung wird 30 Mal durchgeführt. */ /* */ /* (c) 2005, J. Quade. */ /***************************************************************************/ #include #include #include #include // Zum Test mit Realzeitprioritaet muss das Programm mit // dem Define RT_PRIO compiliert und als Superuser gestartet // werden. //#define RT_PRIO // XXX - Umrechnung von "struct timeval" in Mikrosekunden. // Moeglicherweise entstehende Ueberlaeufe bleiben unberuecksichtigt. static inline unsigned long time_in_usec( struct timeval *tv ) { return (tv->tv_sec*1000000)+tv->tv_usec; } int main( int argc, char **argv ) { int i; struct timespec delay; struct timeval tvstart, tvend; unsigned long timediff, maxdiff=0, shouldbetime; unsigned long mindiff; #if RT_PRIO struct sched_param SchedulingParameter; SchedulingParameter.sched_priority = 50; if( sched_setscheduler( 0, SCHED_RR, &SchedulingParameter )!= 0 ) { perror( "Set Scheduling Priority" ); return -1; } #endif for( shouldbetime=0; shouldbetime<51000;shouldbetime+=1000 ) { maxdiff = 0; mindiff = 0xffffffff; for( i=0; i<30; i++ ) { delay.tv_sec = 0; delay.tv_nsec = shouldbetime*1000; // in nsec gettimeofday(&tvstart,NULL); nanosleep( &delay, NULL ); gettimeofday(&tvend,NULL); timediff = time_in_usec(&tvend)-time_in_usec(&tvstart); timediff -= shouldbetime; if( (timediff>maxdiff)&&i>0 ) maxdiff = timediff; if( (timediff0 ) mindiff = timediff; } printf("sleep %7.1ld[us] diff: %ld - %ld\n", shouldbetime, maxdiff, mindiff ); } return 0; }