/* |------------------+------------------------------------------------------------| */ StatusType ReleaseResource ( ResourceType ResID ) { StatusType ercd = E_OK; RESCB *rescb; PRI ceilpri,oldpri; OS_CHECK_EXT(!in_indp(),E_OS_CALLEVEL); //add as share resource with ISR was not supported OS_CHECK_EXT((ResID < cfgOSEK_RESOURCE_NUM),E_OS_ID); rescb = &knl_rescb_table[ResID]; OS_CHECK_EXT((knl_ctxtsk->resque.prev == &rescb->resque),E_OS_NOFUNC); oldpri = rescb->tskpri; ceilpri = knl_gres_table[ResID]; OS_CHECK_EXT((ceilpri <= knl_ctxtsk->itskpri),E_OS_ACCESS); BEGIN_CRITICAL_SECTION; knl_ctxtsk->priority = oldpri; QueRemove(&rescb->resque); QueInit(&rescb->resque); if(oldpri > knl_ready_queue.top_priority) { knl_preempt(); } END_CRITICAL_SECTION; Error_Exit: #if(cfgOS_ERROR_HOOK == STD_ON) if(E_OK != ercd) { BEGIN_CRITICAL_SECTION; _errorhook_svcid = OSServiceId_ReleaseResource; _errorhook_par1.resid = ResID; CallErrorHook(ercd); END_CRITICAL_SECTION; } #endif /* cfgOS_ERROR_HOOK */ return ercd; }
/* |------------------+------------------------------------------------------------| */ StatusType ReleaseResource ( ResourceType ResID ) { StatusType ercd = E_OK; RESCB *rescb; PRI newpri,oldpri; OS_CHECK_EXT((ResID < cfgOSEK_RESOURCE_NUM),E_OS_ID); rescb = &knl_rescb_table[ResID]; if(in_indp()) /* Interrupt level */ { /* not supported */ } else { OS_CHECK_EXT((knl_ctxtsk->resque.prev == &rescb->resque),E_OS_NOFUNC); oldpri = knl_gres_table[ResID]; newpri = rescb->tskpri; OS_CHECK_EXT((newpri > oldpri),E_OS_ACCESS); BEGIN_CRITICAL_SECTION; if(oldpri < 0) { /* Task share resource with ISR */ /* should change IPL */ /* not supported */ } else { knl_ctxtsk->priority = newpri; QueRemove(&rescb->resque); QueInit(&rescb->resque); if(newpri > knl_ready_queue.top_priority) { knl_preempt(); } } END_CRITICAL_SECTION; } Error_Exit: #if(cfgOS_ERROR_HOOK == STD_ON) if(E_OK != ercd) { BEGIN_CRITICAL_SECTION; _errorhook_svcid = OSServiceId_ReleaseResource; _errorhook_par1.resid = ResID; CallErrorHook(ercd); END_CRITICAL_SECTION; } #endif /* cfgOS_ERROR_HOOK */ return ercd; }
/* |------------------+------------------------------------------------------------| */ StatusType ReleaseResource ( ResourceType ResID ) { StatusType ercd = E_OK; OS_EXT_VALIDATE((0 == knl_taskindp),E_OS_CALLEVEL); //add as share resource with ISR was not supported OS_EXT_VALIDATE((ResID < cfgOS_S_RES_NUM),E_OS_ID); OS_EXT_VALIDATE(knl_tcb_resque[knl_curtsk] == ResID,E_OS_NOFUNC); OS_EXT_VALIDATE((knl_rcb_priority[ResID] >= knl_tcb_ipriority[knl_curtsk]),E_OS_ACCESS); BEGIN_CRITICAL_SECTION(); knl_tcb_curpri[knl_curtsk] = knl_rcb_tskpri[ResID]; // remove it at head knl_tcb_resque[knl_curtsk] = knl_rcb_next[ResID]; knl_rcb_tskpri[ResID] = INVALID_PRIORITY; if(knl_tcb_curpri[knl_curtsk] > knl_rdyque.top_pri) { knl_preempt(); } END_CRITICAL_SECTION(); OS_VALIDATE_ERROR_EXIT() OsErrorProcess1(ReleaseResource,resid,ResID); return ercd; }