Ejemplo n.º 1
0
__LINK_C error_t sched_cancel_task(task_t task)
{
	check_structs_are_valid();
	error_t retVal;

	start_atomic();
	uint8_t id = get_task_id(task);
	if(id == NO_TASK)
		retVal = EINVAL;
	else if(!is_scheduled(id))
		retVal = EALREADY;
	else
	{
		if (NG(m_info)[id].prev == NO_TASK)
			NG(m_head)[NG(m_info)[id].priority] = NG(m_info)[id].next;
		else
			NG(m_info)[NG(m_info)[id].prev].next = NG(m_info)[id].next;

		if (NG(m_info)[id].next == NO_TASK)
			NG(m_tail)[NG(m_info)[id].priority] = NG(m_info)[id].prev;
		else
			NG(m_info)[NG(m_info)[id].next].prev = NG(m_info)[id].prev;

		NG(m_info)[id].prev = NO_TASK;
		NG(m_info)[id].next = NO_TASK;
		NG(m_info)[id].priority = NOT_SCHEDULED;
		check_structs_are_valid();
		retVal = SUCCESS;
	}
	end_atomic();
	return retVal;
}
Ejemplo n.º 2
0
__LINK_C bool sched_is_scheduled(task_t task)
{
	//INT_Disable();
	start_atomic();
	uint8_t task_id = get_task_id(task);
	bool retVal = false;
	if(task_id != NO_TASK)
		retVal = is_scheduled(task_id);
	//INT_Enable();
	end_atomic();
	return retVal;
}
Ejemplo n.º 3
0
static i32 sched_timer_if_new(struct sw_timer *head)
{
        i32 rv = 0;
        struct hwt_info *hwt = head->hwt_obj;

        if(true == is_scheduled(head)) 
                goto sched_timer_if_new_exit;
        
        /* If HW timer running, then update it othewise start it */        
        rv = hwt_is_running(hwt)?
                hwt_update(hwt, &head->hwt_expires) : 
                hwt_start(hwt, &head->hwt_expires);
        
        if(0 == rv)
                set_scheduled(head, true);
        
 sched_timer_if_new_exit:
        return rv;
}
Ejemplo n.º 4
0
__LINK_C error_t sched_post_task_prio(task_t task, uint8_t priority)
{
	error_t retVal;
	start_atomic();
	check_structs_are_valid();
	uint8_t task_id = get_task_id(task);
	if(task_id == NO_TASK)
		retVal = EINVAL;
	else if(priority > MIN_PRIORITY || priority < MAX_PRIORITY)
		retVal = ESIZE;
	else if (is_scheduled(task_id))
		retVal = EALREADY;
	else
	{
		if(NG(m_head)[priority] == NO_TASK)
		{
			NG(m_head)[priority] = task_id;
			NG(m_tail)[priority] = task_id;
		}
		else
		{
			NG(m_info)[NG(m_tail)[priority]].next = task_id;
			NG(m_info)[task_id].prev = NG(m_tail)[priority];
			NG(m_tail)[priority] = task_id;
		}
		NG(m_info)[task_id].priority = priority;
		//if our priority is higher than the currently known maximum priority
		if((priority < NG(current_priority)))
			NG(current_priority) = priority;
		check_structs_are_valid();
		retVal = SUCCESS;
	}
	end_atomic();
	check_structs_are_valid();
	return retVal;
}