#include #include #include #include #include #include #include #define DAQ_NAME "/dev/daq" /* example of periodic task */ void timespec_add_ns(struct timespec *t, unsigned long long ns) { int tmp = ns / 1000000000; t->tv_sec += tmp; ns -= tmp * 1000000000; t->tv_nsec += ns; tmp = t->tv_nsec / 1000000000; t->tv_sec += tmp; t->tv_nsec -= tmp * 1000000000; } int main(const int argc, const char * argv[]) { int gfd, voltage, Cycle, Cycle_ms, Period, Off_Cycle; struct timespec timer; struct sched_param param; if ((gfd = open (DAQ_NAME, O_RDWR)) < 0) { perror ("open: " DAQ_NAME); return -1; } Cycle_ms = 3; if (argc > 1) { Period = (int) strtol(argv[1], NULL, 10)/ Cycle_ms; Off_Cycle = (int) strtol(argv[2], NULL, 10) / Cycle_ms; } else { Period = 280 / Cycle_ms; Off_Cycle = 10 / Cycle_ms; } /* set the priority of the task (high priority) */ param.sched_priority = sched_get_priority_max(SCHED_FIFO); sched_setscheduler(0, SCHED_FIFO, ¶m); Cycle = 0; clock_gettime(CLOCK_REALTIME, &timer); for (;;) { if (Cycle == 0) { voltage = 4; write(gfd, &voltage, 2); } else if (Cycle == Off_Cycle) { voltage = 0; write(gfd, &voltage, 2); } timespec_add_ns(&timer, Cycle_ms * 1000000); clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME, &timer, NULL); Cycle++; if (Cycle == Period) Cycle = 0; } return 0; }