/* * 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; }
/* * アラームのキャンセル * */ 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; }