Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;	
}
Exemplo n.º 4
0
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;
}