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; }
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; }
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); }
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; }
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; }
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; }