int main(void) { struct sched_param mysched; mysched.sched_priority = sched_get_priority_max(SCHED_FIFO); if( sched_setscheduler( 0, SCHED_FIFO, &mysched ) == -1 ) { puts(" ERROR IN SETTING THE SCHEDULER UP"); perror("errno"); exit(0); } rt_grow_and_lock_stack(20000); #ifdef ONE_SHOT rt_set_oneshot_mode(); #endif start_rt_timer(nano2count(TICK_PERIOD)); firing_time = rt_get_time(); period = nano2count(1000000); prt = rt_init_timer(); rt_insert_timer(prt, 1, firing_time, period, prh, 0, 1); rt_tasklet_use_fpu(prt, 1); seqt = rt_init_timer(); rt_insert_timer(seqt, 0, firing_time, 0, seqh, 0, 1); while(!end) sleep(1); stop_rt_timer(); rt_delete_timer(prt); rt_delete_timer(seqt); return 0; }
int init_module(void) { #ifdef ONE_SHOT rt_set_oneshot_mode(); #endif firing_time = rt_get_time() + nano2count(100000000); period = nano2count(TICK_PERIOD); start_rt_timer(period); rt_insert_timer(&prt, 1, firing_time, period, prh, 0xAAAAAAAA, 0); rt_insert_timer(&ost, 0, firing_time, nano2count(PERIODIC_BUDDY*TICK_PERIOD/2), osh, 0xBBBBBBBB, 0); return 0; }
void osh(unsigned long data) { if (ostloops++ < LOOPS) { rt_printk("\nFIRED BUDDY: %3d, %lx", ostloops, data); #if PERIODIC_BUDDY == 0 rt_insert_timer(&ost, 0, firing_time += nano2count(TICK_PERIOD/2), 0, osh, 0xBBBBBBBB, 0); #endif } else { rt_printk("\n"); rt_remove_timer(&ost); } }
RTAI_SYSCALL_MODE void rt_ptimer_settime(timer_t timer, const struct itimerspec *value, unsigned long data, long flags) { struct rt_tasklet_struct *tasklet; RTIME now; tasklet = posix_timer[timer].timer; rt_remove_timer(tasklet); now = rt_get_time(); if (flags == TIMER_ABSTIME) { if (timespec2count(&(value->it_value)) < now) { now -= timespec2count (&(value->it_value)); }else { now = 0; } } if (timespec2count ( &(value->it_value)) > 0) { if (data) { rt_insert_timer(tasklet, 0, now + timespec2count ( &(value->it_value) ), timespec2count ( &(value->it_interval) ), NULL, data, -1); } else { rt_insert_timer(tasklet, 0, now + timespec2count ( &(value->it_value) ), timespec2count ( &(value->it_interval) ), tasklet->handler, tasklet->data, 0); } } }
void seqh(unsigned long data) { switch (opcod) { case 0: { rt_printk("- SEQUENCER FIRED FOR A FAST POLLING\n"); rt_insert_timer(seqt, 10, rt_get_time() + nano2count(500000), nano2count(500000), seqh, 0, 1); opcod = 1; } break; case 1: { if (poloops++ < LOOPS) { if (poloops == 1) { rt_printk("- SEQUENCER BEGINS FAST POLLING\n"); } } else { rt_printk("- SEQUENCER FAST POLLING ENDED, TIMED FOR A LATER FINAL OPERATION\n"); rt_set_timer_firing_time(seqt, rt_get_time() + nano2count(50000000)); opcod = 2; } } break; case 2: { rt_printk("- SEQUENCER EXECUTES FINAL OPERATION, ... THEN\n SLOWLY POLLS WAITING FOR THE END OF THE PERIODIC COMPUTATIONAL TASKLET\n"); opcod = 3; } break; case 3: { if (endp) { rt_printk("- PERIODIC COMPUTATIONAL TASKLET GONE, SEQUENCER ENDS IT ALL\n"); rt_remove_timer(seqt); end = 1; } else { // rt_printk("\nSEQUENCER WAITING FOR PERIODIC TIMER END"); } } break; } }