#include #include #include // sched_setscheduler #define NS_PER_SECOND 1000000000 #define PERIOD 2000000 // 2 ms static void set_SCHED_RR() { struct sched_param param = { 0 }; param.sched_priority = 80; if (sched_setscheduler(0, SCHED_RR, ¶m) != 0) perror("SCHED_RR"); } int main(void) { set_SCHED_RR(); struct timespec deadline, curr_spec; if (clock_gettime(CLOCK_MONOTONIC, &deadline) < 0) perror("clock_gettime"); curr_spec = deadline; for (int i=0; i < 1000; ++i) { printf("CURRSPEC=%ld.%09ld\n", curr_spec.tv_sec, curr_spec.tv_nsec); printf("DEADLINE=%ld.%09ld\n", deadline.tv_sec, deadline.tv_nsec); puts("+++++"); if ((deadline.tv_nsec += PERIOD) >= NS_PER_SECOND) { deadline.tv_nsec -= NS_PER_SECOND; ++deadline.tv_sec; } if (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &deadline, NULL) < 0) { perror("clock_nanosleep"); } clock_gettime(CLOCK_MONOTONIC, &curr_spec); } return 0; }