ER ref_alm(ID almid, T_RALM *pk_ralm) { ALMCB *p_almcb; ER ercd; LOG_REF_ALM_ENTER(almid, pk_ralm); CHECK_TSKCTX_UNL(); CHECK_ALMID(almid); p_almcb = get_almcb(almid); t_lock_cpu(); if (p_almcb->p_alminib->almatr == TA_NOEXS) { ercd = E_NOEXS; } else { if (p_almcb->almsta) { pk_ralm->almstat = TALM_STA; pk_ralm->lefttim = tmevt_lefttim(&(p_almcb->tmevtb)); } else { pk_ralm->almstat = TALM_STP; } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_REF_ALM_LEAVE(ercd, pk_ralm); return(ercd); }
/* * アラームベースの参照 */ StatusType GetAlarmBase(AlarmType almid, AlarmBaseRefType p_info) { StatusType ercd = E_OK; CounterType cntid; LOG_GETALB_ENTER(almid, p_info); CHECK_CALLEVEL(TCL_TASK | TCL_ISR2 | TCL_ERROR | TCL_PREPOST); CHECK_ALMID(almid); cntid = alminib_cntid[almid]; p_info->maxallowedvalue = cntinib_maxval[cntid]; p_info->ticksperbase = cntinib_tickbase[cntid]; p_info->mincycle = cntinib_mincyc[cntid]; exit: LOG_GETALB_LEAVE(ercd); return(ercd); error_exit: lock_cpu(); _errorhook_par1.almid = almid; _errorhook_par2.p_info = p_info; call_errorhook(ercd, OSServiceId_GetAlarmBase); unlock_cpu(); goto exit; }
ER ista_alm(ID almid, RELTIM almtim) { ALMCB *p_almcb; ER ercd; LOG_ISTA_ALM_ENTER(almid, almtim); CHECK_INTCTX_UNL(); CHECK_ALMID(almid); CHECK_PAR(almtim <= TMAX_RELTIM); p_almcb = get_almcb(almid); i_lock_cpu(); if (p_almcb->p_alminib->almatr == TA_NOEXS) { ercd = E_NOEXS; } else if (p_almcb->almsta) { tmevtb_dequeue(&(p_almcb->tmevtb)); } else { p_almcb->almsta = true; } tmevtb_enqueue(&(p_almcb->tmevtb), almtim, (CBACK) call_almhdr, (void *) p_almcb); ercd = E_OK; i_unlock_cpu(); error_exit: LOG_ISTA_ALM_LEAVE(ercd); return(ercd); }
ER istp_alm(ID almid) { ALMCB *p_almcb; ER ercd; LOG_ISTP_ALM_ENTER(almid); CHECK_INTCTX_UNL(); CHECK_ALMID(almid); p_almcb = get_almcb(almid); i_lock_cpu(); if (p_almcb->p_alminib->almatr == TA_NOEXS) { ercd = E_NOEXS; } else if (p_almcb->almsta) { p_almcb->almsta = false; tmevtb_dequeue(&(p_almcb->tmevtb)); } ercd = E_OK; i_unlock_cpu(); error_exit: LOG_ISTP_ALM_LEAVE(ercd); return(ercd); }
/* * cancle the alarm * */ StatusType CancelAlarm(AlarmType almid) { StatusType ercd = E_OK; LOG_CANALM_ENTER(almid); CHECK_CALLEVEL(TCL_TASK | TCL_ISR2); CHECK_ALMID(almid); lock_cpu(); if (almcb_next[almid] == almid) { ercd = E_OS_NOFUNC; goto d_error_exit; } dequeue_alarm(almid, alminib_cntid[almid]); /* * set alarm cycle to zero * if something wrong with dequeue_alarm() not really cancel * this alarm, the Zero value of alarm cycle will make sure * it will be auto-cancled at the next expiry value when SignalCounter() */ almcb_cycle[almid] = 0u; exit: unlock_cpu(); LOG_CANALM_LEAVE(ercd); return(ercd); error_exit: lock_cpu(); d_error_exit: _errorhook_par1.almid = almid; call_errorhook(ercd, OSServiceId_CancelAlarm); goto exit; }
ER sta_alm(ID almid , RELTIM almtim) { ER ercd; uint_t index = INDEX_ALM(almid); LOG_STA_ALM_ENTER(almid, almtim); CHECK_TSKCTX_UNL(); CHECK_ALMID(almid); t_lock_cpu(); if((almcb_almact & ALMACT_BIT(index)) != 0U) { time_event_dequeue(ALM_EVTID(almid)); } else { almcb_almact |= ALMACT_BIT(index); } time_event_enqueue(ALM_EVTID(almid) , current_time + (EVTTIM)almtim , (CBACK)call_almhdr , index); ercd = E_OK; t_unlock_cpu(); error_exit: LOG_STA_ALM_LEAVE(ercd); return ercd; }
/* * アラームの設定(絶対値) */ StatusType SetAbsAlarm(AlarmType almid, TickType start, TickType cycle) { StatusType ercd = E_OK; CounterType cntid; TickType maxval, start2; LOG_SETABS_ENTER(almid, start, cycle); CHECK_CALLEVEL(TCL_TASK | TCL_ISR2); CHECK_ALMID(almid); cntid = alminib_cntid[almid]; maxval = cntinib_maxval[cntid]; CHECK_VALUE(start <= maxval); CHECK_VALUE((cycle == 0u) || ((cntinib_mincyc[cntid] <= cycle) && (cycle <= maxval))); lock_cpu(); if (almcb_next[almid] != almid) { ercd = E_OS_STATE; goto d_error_exit; } start2 = start + maxval + 1; if (cntcb_curval[cntid] <= maxval) { if (start <= cntcb_curval[cntid]) { almcb_almval[almid] = start2; } else { almcb_almval[almid] = start; } } else { if (start2 <= cntcb_curval[cntid]) { almcb_almval[almid] = start; } else { almcb_almval[almid] = start2; } } almcb_cycle[almid] = cycle; enqueue_alarm(almid, cntid); exit: unlock_cpu(); LOG_SETABS_LEAVE(ercd); return(ercd); error_exit: lock_cpu(); d_error_exit: _errorhook_par1.almid = almid; _errorhook_par2.start = start; _errorhook_par3.cycle = cycle; call_errorhook(ercd, OSServiceId_SetAbsAlarm); goto exit; }
/* * アラームの設定(相対値) */ StatusType SetRelAlarm(AlarmType almid, TickType incr, TickType cycle) { StatusType ercd = E_OK; CounterType cntid; TickType maxval; LOG_SETREL_ENTER(almid, incr, cycle); CHECK_CALLEVEL(TCL_TASK | TCL_ISR2); CHECK_ALMID(almid); cntid = alminib_cntid[almid]; maxval = cntinib_maxval[cntid]; CHECK_VALUE((0u < incr) && (incr <= maxval)); CHECK_VALUE((cycle == 0u) || ((cntinib_mincyc[cntid] <= cycle) && (cycle <= maxval))); lock_cpu(); if (almcb_next[almid] != almid) { ercd = E_OS_STATE; goto d_error_exit; } almcb_almval[almid] = add_tick(cntcb_curval[cntid], incr, cntinib_maxval2[cntid]); almcb_cycle[almid] = cycle; enqueue_alarm(almid, cntid); exit: unlock_cpu(); LOG_SETREL_LEAVE(ercd); return(ercd); error_exit: lock_cpu(); d_error_exit: _errorhook_par1.almid = almid; _errorhook_par2.incr = incr; _errorhook_par3.cycle = cycle; call_errorhook(ercd, OSServiceId_SetRelAlarm); goto exit; }
/* * アラームの状態参照 */ StatusType GetAlarm(AlarmType almid, TickRefType p_tick) { StatusType ercd = E_OK; CounterType cntid; TickType curval; LOG_GETALM_ENTER(almid, p_tick); CHECK_CALLEVEL(TCL_TASK | TCL_ISR2 | TCL_ERROR | TCL_PREPOST); CHECK_ALMID(almid); lock_cpu(); if (almcb_next[almid] == almid) { ercd = E_OS_NOFUNC; goto d_error_exit; } cntid = alminib_cntid[almid]; curval = cntcb_curval[cntid]; if (curval < almcb_almval[almid]) { *p_tick = almcb_almval[almid] - curval; } else { *p_tick = (cntinib_maxval2[cntid] - curval) + 1 + almcb_almval[almid]; } exit: unlock_cpu(); LOG_GETALM_LEAVE(ercd); return(ercd); error_exit: lock_cpu(); d_error_exit: _errorhook_par1.almid = almid; _errorhook_par2.p_tick = p_tick; call_errorhook(ercd, OSServiceId_GetAlarm); goto exit; }
ER stp_alm(ID almid) { ALMCB *p_almcb; ER ercd; LOG_STP_ALM_ENTER(almid); CHECK_TSKCTX_UNL(); CHECK_ALMID(almid); p_almcb = get_almcb(almid); t_lock_cpu(); if (p_almcb->almsta) { p_almcb->almsta = false; tmevtb_dequeue(&(p_almcb->tmevtb)); } ercd = E_OK; t_unlock_cpu(); error_exit: LOG_STP_ALM_LEAVE(ercd); return(ercd); }
ER stp_alm(ID almid) { ER ercd; uint_t index = INDEX_ALM(almid); LOG_STP_ALM_ENTER(almid); CHECK_TSKCTX_UNL(); CHECK_ALMID(almid); t_lock_cpu(); if((almcb_almact & ALMACT_BIT(index)) != 0U) { almcb_almact &= ~ALMACT_BIT(index); time_event_dequeue(ALM_EVTID(almid)); } ercd = E_OK; t_unlock_cpu(); error_exit: LOG_STP_ALM_LEAVE(ercd); return ercd; }
/* * アラームのキャンセル * */ StatusType CancelAlarm(AlarmType almid) { StatusType ercd = E_OK; LOG_CANALM_ENTER(almid); CHECK_CALLEVEL(TCL_TASK | TCL_ISR2); CHECK_ALMID(almid); lock_cpu(); if (almcb_next[almid] == almid) { ercd = E_OS_NOFUNC; goto d_error_exit; } dequeue_alarm(almid, alminib_cntid[almid]); /* * アラームコールバックの中から,自アラームを SetRelAlarm/ * SetAbsAlarm した後に CancelAlarm した状況(OSEK仕様では許 * されていないが,TOPPERS/OSEKカーネルでは許している)で,自 * アラームがアラームキューに再挿入されるのを防ぐために, * almcb_cycle[almid] を 0 にしておく. */ almcb_cycle[almid] = 0u; exit: unlock_cpu(); LOG_CANALM_LEAVE(ercd); return(ercd); error_exit: lock_cpu(); d_error_exit: _errorhook_par1.almid = almid; call_errorhook(ercd, OSServiceId_CancelAlarm); goto exit; }
ER del_alm(ID almid) { ALMCB *p_almcb; ALMINIB *p_alminib; ER ercd; LOG_DEL_ALM_ENTER(almid); CHECK_TSKCTX_UNL(); CHECK_ALMID(almid); p_almcb = get_almcb(almid); t_lock_cpu(); if (p_almcb->p_alminib->almatr == TA_NOEXS) { ercd = E_NOEXS; } else if (ALMID(p_almcb) > tmax_salmid) { if (p_almcb->almsta) { p_almcb->almsta = false; tmevtb_dequeue(&(p_almcb->tmevtb)); } p_alminib = (ALMINIB *)(p_almcb->p_alminib); p_alminib->almatr = TA_NOEXS; queue_insert_prev(&free_almcb, ((QUEUE *) &(p_almcb->tmevtb))); ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_DEL_ALM_LEAVE(ercd); return(ercd); }