#include #include #include void main(int argc,char **argv) { struct timespec begin_time,end_time,next_step,end_time2; struct sched_param sp; const int width=520000; const int pulses=30; sp.sched_priority=99; // to make this work, sudo setcap CAP_SYS_NICE=eip clock sched_setscheduler(0,SCHED_RR,&sp); clock_gettime(CLOCK_REALTIME,&begin_time); clock_gettime(CLOCK_REALTIME,&next_step); for (int i=0;i 1000000000UL) { next_step.tv_nsec -= 1000000000UL; ++next_step.tv_sec; } int rc = clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &next_step, NULL); if (rc) { printf("problems: %d\n",rc); } } clock_gettime(CLOCK_REALTIME,&end_time); clock_gettime(CLOCK_REALTIME,&end_time2); printf("began at %ld.09%ld\n",begin_time.tv_sec,begin_time.tv_nsec); printf("ended at %ld.09%ld\n",end_time.tv_sec,end_time.tv_nsec); printf("ended at %ld.09%ld\n",end_time2.tv_sec,end_time2.tv_nsec); long elapsed = end_time.tv_nsec - begin_time.tv_nsec; printf("elapsed: %ld\n",elapsed); printf("error: %ld\n",elapsed-(pulses*width)); }