BOOLEAN OSTmrDel (OS_TMR *ptmr, INT8U *perr) { #ifdef OS_SAFETY_CRITICAL if (perr == (INT8U *)0) { OS_SAFETY_CRITICAL_EXCEPTION(); return (OS_FALSE); } #endif #if OS_ARG_CHK_EN > 0u if (ptmr == (OS_TMR *)0) { *perr = OS_ERR_TMR_INVALID; return (OS_FALSE); } #endif if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */ *perr = OS_ERR_TMR_INVALID_TYPE; return (OS_FALSE); } if (OSIntNesting > 0u) { /* See if trying to call from an ISR */ *perr = OS_ERR_TMR_ISR; return (OS_FALSE); } OSSchedLock(); switch (ptmr->OSTmrState) { case OS_TMR_STATE_RUNNING: OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */ OSTmr_Free(ptmr); /* Return timer to free list of timers */ OSSchedUnlock(); *perr = OS_ERR_NONE; return (OS_TRUE); case OS_TMR_STATE_STOPPED: /* Timer has not started or ... */ case OS_TMR_STATE_COMPLETED: /* ... timer has completed the ONE-SHOT time */ OSTmr_Free(ptmr); /* Return timer to free list of timers */ OSSchedUnlock(); *perr = OS_ERR_NONE; return (OS_TRUE); case OS_TMR_STATE_UNUSED: /* Already deleted */ OSSchedUnlock(); *perr = OS_ERR_TMR_INACTIVE; return (OS_FALSE); default: OSSchedUnlock(); *perr = OS_ERR_TMR_INVALID_STATE; return (OS_FALSE); } }
BOOLEAN OSTmrDel (OS_TMR *ptmr, INT8U *perr) { #ifdef OS_SAFETY_CRITICAL if (perr == (INT8U *)0) { OS_SAFETY_CRITICAL_EXCEPTION(); return (OS_FALSE); } #endif #if OS_ARG_CHK_EN > 0u if (ptmr == (OS_TMR *)0) { *perr = OS_ERR_TMR_INVALID; return (OS_FALSE); } #endif if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */ *perr = OS_ERR_TMR_INVALID_TYPE; return (OS_FALSE); } if (OSIntNesting > 0u) { /* See if trying to call from an ISR */ *perr = OS_ERR_TMR_ISR; return (OS_FALSE); } /* 关调度 */ OSSchedLock(); /* 根据定时器的当前状态,使用不同的删除步骤 */ switch (ptmr->OSTmrState) { /* 如果定时器正在运行 */ case OS_TMR_STATE_RUNNING: /* 把定时器控制块从所在的分组链表中移除 */ OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */ /* 释放定时器控制块到空闲定时器控制块链表 */ OSTmr_Free(ptmr); /* Return timer to free list of timers */ /* 允许调度 */ OSSchedUnlock(); *perr = OS_ERR_NONE; return (OS_TRUE); /* 如果定时器是未运行状态,或者是单次定时器的已完成状态 * 直接把定时器控制块释放到空定时器控制块链表 */ case OS_TMR_STATE_STOPPED: /* Timer has not started or ... */ case OS_TMR_STATE_COMPLETED: /* ... timer has completed the ONE-SHOT time */ OSTmr_Free(ptmr); /* Return timer to free list of timers */ /* 允许调度 */ OSSchedUnlock(); *perr = OS_ERR_NONE; return (OS_TRUE); /* 如果定时器控制块是未使用状态,则返回错误信息 */ case OS_TMR_STATE_UNUSED: /* Already deleted */ OSSchedUnlock(); *perr = OS_ERR_TMR_INACTIVE; return (OS_FALSE); default: OSSchedUnlock(); *perr = OS_ERR_TMR_INVALID_STATE; return (OS_FALSE); } }