RTAI_SYSCALL_MODE int rt_delete_tasklet(struct rt_tasklet_struct *tasklet) { int thread; rt_remove_tasklet(tasklet); tasklet->handler = 0; rt_copy_to_user(tasklet->usptasklet, tasklet, sizeof(struct rt_usp_tasklet_struct)); rt_task_resume(tasklet->task); thread = tasklet->thread; rt_free(tasklet); return thread; }
RTAI_SYSCALL_MODE int rt_ptimer_delete(timer_t timer, long space) { struct rt_tasklet_struct *tasklet; int rtn = 0; tasklet = posix_timer[timer].timer; gvb_ptimer_indx(timer); rt_remove_tasklet(tasklet); if (space) { tasklet->handler = 0; rt_copy_to_user(tasklet->usptasklet, tasklet, sizeof(struct rt_usp_tasklet_struct)); rt_task_resume(tasklet->task); rtn = tasklet->thread; } rt_free(tasklet); return rtn; }
int rt_delete_tasklet(struct rt_tasklet_struct *tasklet) { int pid, thread; rt_remove_tasklet(tasklet); tasklet->handler = 0; pid = ((tasklet->task)->lnxtsk)->pid; copy_to_user(tasklet->usptasklet, tasklet, sizeof(struct rt_tasklet_struct)); rt_task_resume(tasklet->task); while (find_task_by_pid(pid)) { current->state = TASK_INTERRUPTIBLE; schedule_timeout(2); } thread = tasklet->thread; sched_free(tasklet); return thread; }
int main(void) { RT_TASK *maint; int maxcnt; printf("GIVE THE NUMBER OF INTERRUPTS YOU WANT TO COUNT: "); scanf("%d", &maxcnt); start_rt_timer(0); if (!(maint = rt_task_init(nam2num("MAIN"), 1, 0, 0))) { printf("CANNOT INIT MAIN TASK > MAIN <\n"); exit(1); } if (!(dspsem = rt_sem_init(nam2num("DSPSEM"), 0))) { printf("CANNOT INIT SEMAPHORE > DSPSEM <\n"); exit(1); } tasklet = rt_init_tasklet(); mlockall(MCL_CURRENT | MCL_FUTURE); rt_insert_tasklet(tasklet, 0, timer_handler, 111, nam2num("TSKLET"), 1); rt_request_irq_task(TIMER_IRQ, tasklet, RT_IRQ_TASKLET, 1); rtc_start(TIMER_FRQ); rtc_enable_irq(TIMER_IRQ, TIMER_FRQ); while (intcnt < maxcnt) { rt_sem_wait(dspsem); printf("OVERRUNS %d, INTERRUPT COUNT %d\n", ovr, intcnt); } rtc_stop(); rt_release_irq_task(TIMER_IRQ); printf("TEST ENDS\n"); rt_remove_tasklet(tasklet); rt_delete_tasklet(tasklet); rt_sem_delete(dspsem); rt_task_delete(maint); return 0; }