Esempio n. 1
0
int8_t nrk_sem_post(nrk_sem_t *rsrc)
{
	int8_t id=nrk_get_resource_index(rsrc);	
	int8_t task_ID;
	if(id==-1) { _nrk_errno_set(1); return NRK_ERROR;}
	if(id==NRK_MAX_RESOURCE_CNT) { _nrk_errno_set(2); return NRK_ERROR; }

	if(nrk_sem_list[id].value<nrk_sem_list[id].count)
	{
		// Signal RSRC Event		
		nrk_int_disable();

		nrk_sem_list[id].value++;
		sc = system_ceiling();
		nrk_cur_task_TCB->elevated_prio_flag=0;

		for (task_ID=0; task_ID < NRK_MAX_TASKS; task_ID++){
			if(nrk_task_TCB[task_ID].event_suspend==RSRC_EVENT_SUSPENDED)
				if((nrk_task_TCB[task_ID].active_signal_mask == id))
				{
					nrk_task_TCB[task_ID].task_state=SUSPENDED;
					nrk_task_TCB[task_ID].next_wakeup=0;
					nrk_task_TCB[task_ID].event_suspend=0;
					nrk_task_TCB[task_ID].active_signal_mask=0;
				}   

		}
		nrk_int_enable();
	}
		
return NRK_OK;
}
Esempio n. 2
0
int8_t nrk_sem_pend(nrk_sem_t *rsrc )
{
	int8_t id;
	id=nrk_get_resource_index(rsrc);  
	if(id==-1) { _nrk_errno_set(1); return NRK_ERROR;}
	if(id==NRK_MAX_RESOURCE_CNT) { _nrk_errno_set(2); return NRK_ERROR; }
	
	nrk_int_disable();
	if(nrk_sem_list[id].value==0)
	{
		nrk_cur_task_TCB->event_suspend|=RSRC_EVENT_SUSPENDED;
		nrk_cur_task_TCB->active_signal_mask=id;
		// Wait on suspend event
		nrk_int_enable();
		nrk_wait_until_ticks(0);
	}

	nrk_sem_list[id].value--;	
		sc = system_ceiling();
	nrk_cur_task_TCB->task_prio_ceil=nrk_sem_list[id].resource_ceiling;
	nrk_cur_task_TCB->elevated_prio_flag=1;
	nrk_int_enable();

	return NRK_OK;
}
Esempio n. 3
0
int8_t nrk_sem_query(nrk_sem_t *rsrc )
{
	int8_t id;
	id=nrk_get_resource_index(rsrc);
	if(id==-1) { _nrk_errno_set(1); return NRK_ERROR;}
	if(id==NRK_MAX_RESOURCE_CNT) { _nrk_errno_set(2); return NRK_ERROR; }

	return(nrk_sem_list[id].value);
}
Esempio n. 4
0
int8_t  nrk_sem_delete(nrk_sem_t *rsrc)
{
int8_t id=nrk_get_resource_index(rsrc);
	int8_t task_ID;
	if(id==-1) { _nrk_errno_set(1); return NRK_ERROR;}
	if(id==NRK_MAX_RESOURCE_CNT) { _nrk_errno_set(2); return NRK_ERROR; }

	nrk_sem_list[id].count=-1;
	nrk_sem_list[id].value=-1;
	nrk_sem_list[id].resource_ceiling=-1;
	_nrk_resource_cnt--;
return NRK_OK;
}
Esempio n. 5
0
int8_t nrk_sem_pend(nrk_sem_t *rsrc )
{
	int8_t id;
	id=nrk_get_resource_index(rsrc);
	if(id==-1) { _nrk_errno_set(1); return NRK_ERROR;}
	if(id==NRK_MAX_RESOURCE_CNT) { _nrk_errno_set(2); return NRK_ERROR; }

	/* if (_nrk_system_ceiling > nrk_sem_list[id].resource_ceiling) */
	/* { */
	/* 	nrk_wait_until_ticks(0); */
	/* } */
	//get access to the semaphore
	nrk_int_disable();
	nrk_sem_list[id].value--;
        if(_nrk_system_ceiling < rsrc->resource_ceiling)
	  _nrk_system_ceiling = rsrc->resource_ceiling;
	_nrk_ceiling_stack[++_nrk_ceiling_tos]= nrk_sem_list[id].resource_ceiling;
	nrk_int_enable();
	//nrk_wait_until_ticks(0);
	return NRK_OK;
}
Esempio n. 6
0
int8_t nrk_sem_post(nrk_sem_t *rsrc)
{
	int8_t id=nrk_get_resource_index(rsrc);
	int8_t task_ID;
	if(id==-1) { _nrk_errno_set(1); return NRK_ERROR;}
	if(id==NRK_MAX_RESOURCE_CNT) { _nrk_errno_set(2); return NRK_ERROR; }

	if(nrk_sem_list[id].value<nrk_sem_list[id].count)
	{
		// Signal RSRC Event
		nrk_int_disable();

		nrk_sem_list[id].value++;
		//nrk_cur_task_TCB->elevated_prio_flag=0;

		//should not be blocking under srp
		/*
		for (task_ID=0; task_ID < NRK_MAX_TASKS; task_ID++){
			if(nrk_task_TCB[task_ID].event_suspend==RSRC_EVENT_SUSPENDED)
				if((nrk_task_TCB[task_ID].active_signal_mask == id))
				{
					nrk_task_TCB[task_ID].task_state=SUSPENDED;
					nrk_task_TCB[task_ID].next_wakeup=0;
					nrk_task_TCB[task_ID].event_suspend=0;
					nrk_task_TCB[task_ID].active_signal_mask=0;
				}

				}*/
		if(_nrk_system_ceiling == _nrk_ceiling_stack[_nrk_ceiling_tos--])
		  _nrk_system_ceiling= _nrk_ceiling_stack[_nrk_ceiling_tos];
		nrk_int_enable();
		nrk_wait_until_ticks(0);
	}

return NRK_OK;
}