📄 os_tmr.c
字号:
case OS_TMR_STATE_UNUSED:
OSSchedUnlock(&err);
*p_err = OS_ERR_TMR_INACTIVE;
return ((OS_TICK)0);
default:
OSSchedUnlock(&err);
*p_err = OS_ERR_TMR_INVALID_STATE;
return ((OS_TICK)0);
}
}
/*$PAGE*/
/*
************************************************************************************************************************
* START A TIMER
*
* Description: This function is called by your application code to start a timer.
*
* Arguments : p_tmr Is a pointer to an OS_TMR
*
* p_err Is a pointer to an error code. '*p_err' will contain one of the following:
*
* OS_ERR_NONE
* OS_ERR_OBJ_TYPE if 'p_tmr' is not pointing to a timer
* OS_ERR_TMR_INVALID
* OS_ERR_TMR_INACTIVE if the timer was not created
* OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
* OS_ERR_TMR_ISR if the call was made from an ISR
*
* Returns : DEF_TRUE is the timer was started
* DEF_FALSE if not or upon an error
*
* Note(s) : 1) When starting/restarting a timer, regardless if it is in PERIODIC or ONE-SHOT mode, the timer is
* linked to the timer wheel with the OS_OPT_LINK_DLY option. This option sets the initial expiration
* time for the timer. For timers in PERIODIC mode, subsequent expiration times are handled by
* the OS_TmrTask().
************************************************************************************************************************
*/
CPU_BOOLEAN OSTmrStart (OS_TMR *p_tmr,
OS_ERR *p_err)
{
OS_ERR err;
#ifdef OS_SAFETY_CRITICAL
if (p_err == (OS_ERR *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return (DEF_FALSE);
}
#endif
#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
if (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* See if trying to call from an ISR */
*p_err = OS_ERR_TMR_ISR;
return (DEF_FALSE);
}
#endif
#if OS_CFG_ARG_CHK_EN > 0u
if (p_tmr == (OS_TMR *)0) {
*p_err = OS_ERR_TMR_INVALID;
return (DEF_FALSE);
}
#endif
#if OS_CFG_OBJ_TYPE_CHK_EN > 0u
if (p_tmr->Type != OS_OBJ_TYPE_TMR) { /* Make sure timer was created */
*p_err = OS_ERR_OBJ_TYPE;
return (DEF_FALSE);
}
#endif
OSSchedLock(&err);
switch (p_tmr->State) {
case OS_TMR_STATE_RUNNING: /* Restart the timer */
OS_TmrUnlink(p_tmr); /* ... Stop the timer */
OS_TmrLink(p_tmr, OS_OPT_LINK_DLY); /* ... Link timer to timer wheel (see Note #1). */
OSSchedUnlock(&err);
*p_err = OS_ERR_NONE;
return (DEF_TRUE);
case OS_TMR_STATE_STOPPED: /* Start the timer */
case OS_TMR_STATE_COMPLETED:
OS_TmrLink(p_tmr, OS_OPT_LINK_DLY); /* ... Link timer to timer wheel (see Note #1). */
OSSchedUnlock(&err);
*p_err = OS_ERR_NONE;
return (DEF_TRUE);
case OS_TMR_STATE_UNUSED: /* Timer not created */
OSSchedUnlock(&err);
*p_err = OS_ERR_TMR_INACTIVE;
return (DEF_FALSE);
default:
OSSchedUnlock(&err);
*p_err = OS_ERR_TMR_INVALID_STATE;
return (DEF_FALSE);
}
}
/*$PAGE*/
/*
************************************************************************************************************************
* FIND OUT WHAT STATE A TIMER IS IN
*
* Description: This function is called to determine what state the timer is in:
*
* OS_TMR_STATE_UNUSED the timer has not been created
* OS_TMR_STATE_STOPPED the timer has been created but has not been started or has been stopped
* OS_TMR_COMPLETED the timer is in ONE-SHOT mode and has completed it's timeout
* OS_TMR_RUNNING the timer is currently running
*
* Arguments : p_tmr Is a pointer to the desired timer
*
* p_err Is a pointer to an error code. '*p_err' will contain one of the following:
*
* OS_ERR_NONE
* OS_ERR_OBJ_TYPE if 'p_tmr' is not pointing to a timer
* OS_ERR_TMR_INVALID 'p_tmr' is a NULL pointer
* OS_ERR_TMR_INVALID_STATE if the timer is not in a valid state
* OS_ERR_TMR_ISR if the call was made from an ISR
*
* Returns : The current state of the timer (see description).
************************************************************************************************************************
*/
OS_STATE OSTmrStateGet (OS_TMR *p_tmr,
OS_ERR *p_err)
{
OS_STATE state;
CPU_SR_ALLOC();
#ifdef OS_SAFETY_CRITICAL
if (p_err == (OS_ERR *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return (OS_TMR_STATE_UNUSED);
}
#endif
#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
if (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* See if trying to call from an ISR */
*p_err = OS_ERR_TMR_ISR;
return (OS_TMR_STATE_UNUSED);
}
#endif
#if OS_CFG_ARG_CHK_EN > 0u
if (p_tmr == (OS_TMR *)0) {
*p_err = OS_ERR_TMR_INVALID;
return (OS_TMR_STATE_UNUSED);
}
#endif
#if OS_CFG_OBJ_TYPE_CHK_EN > 0u
if (p_tmr->Type != OS_OBJ_TYPE_TMR) { /* Make sure timer was created */
*p_err = OS_ERR_OBJ_TYPE;
return (OS_TMR_STATE_UNUSED);
}
#endif
CPU_CRITICAL_ENTER();
state = p_tmr->State;
switch (state) {
case OS_TMR_STATE_UNUSED:
case OS_TMR_STATE_STOPPED:
case OS_TMR_STATE_COMPLETED:
case OS_TMR_STATE_RUNNING:
*p_err = OS_ERR_NONE;
break;
default:
*p_err = OS_ERR_TMR_INVALID_STATE;
break;
}
CPU_CRITICAL_EXIT();
return (state);
}
/*$PAGE*/
/*
************************************************************************************************************************
* STOP A TIMER
*
* Description: This function is called by your application code to stop a timer.
*
* Arguments : p_tmr Is a pointer to the timer to stop.
*
* opt Allows you to specify an option to this functions which can be:
*
* OS_OPT_TMR_NONE Do nothing special but stop the timer
* OS_OPT_TMR_CALLBACK Execute the callback function, pass it the callback argument
* specified when the timer was created.
* OS_OPT_TMR_CALLBACK_ARG Execute the callback function, pass it the callback argument
* specified in THIS function call
*
* callback_arg Is a pointer to a 'new' callback argument that can be passed to the callback function
* instead of the timer's callback argument. In other words, use 'callback_arg' passed in
* THIS function INSTEAD of p_tmr->OSTmrCallbackArg
*
* p_err Is a pointer to an error code. '*p_err' will contain one of the following:
* OS_ERR_NONE
* OS_ERR_OBJ_TYPE if 'p_tmr' is not pointing to a timer
* OS_ERR_OPT_INVALID if you specified an invalid option for 'opt'
* OS_ERR_TMR_INACTIVE if the timer was not created
* OS_ERR_TMR_INVALID 'p_tmr' is a NULL pointer
* OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
* OS_ERR_TMR_ISR if the function was called from an ISR
* OS_ERR_TMR_NO_CALLBACK if the timer does not have a callback function defined
* OS_ERR_TMR_STOPPED if the timer was already stopped
*
* Returns : DEF_TRUE If we stopped the timer (if the timer is already stopped, we also return DEF_TRUE)
* DEF_FALSE If not
************************************************************************************************************************
*/
CPU_BOOLEAN OSTmrStop (OS_TMR *p_tmr,
OS_OPT opt,
void *p_callback_arg,
OS_ERR *p_err)
{
OS_TMR_CALLBACK_PTR p_fnct;
OS_ERR err;
#ifdef OS_SAFETY_CRITICAL
if (p_err == (OS_ERR *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return (DEF_FALSE);
}
#endif
#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u
if (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* See if trying to call from an ISR */
*p_err = OS_ERR_TMR_ISR;
return (DEF_FALSE);
}
#endif
#if OS_CFG_ARG_CHK_EN > 0u
if (p_tmr == (OS_TMR *)0) {
*p_err = OS_ERR_TMR_INVALID;
return (DEF_FALSE);
}
#endif
#if OS_CFG_OBJ_TYPE_CHK_EN > 0u
if (p_tmr->Type != OS_OBJ_TYPE_TMR) { /* Make sure timer was created */
*p_err = OS_ERR_OBJ_TYPE;
return (DEF_FALSE);
}
#endif
OSSchedLock(&err);
switch (p_tmr->State) {
case OS_TMR_STATE_RUNNING:
OS_TmrUnlink(p_tmr); /* Remove from current wheel spoke */
*p_err = OS_ERR_NONE;
switch (opt) {
case OS_OPT_TMR_CALLBACK:
p_fnct = p_tmr->CallbackPtr; /* Execute callback function ... */
if (p_fnct != (OS_TMR_CALLBACK_PTR)0) { /* ... if available */
(*p_fnct)((void *)p_tmr, p_tmr->CallbackPtrArg); /* Use callback arg when timer was created */
} else {
*p_err = OS_ERR_TMR_NO_CALLBACK;
}
break;
case OS_OPT_TMR_CALLBACK_ARG:
p_fnct = p_tmr->CallbackPtr; /* Execute callback function if available ... */
if (p_fnct != (OS_TMR_CALLBACK_PTR)0) {
(*p_fnct)((void *)p_tmr, p_callback_arg); /* .. using the 'callback_arg' provided in call */
} else {
*p_err = OS_ERR_TMR_NO_CALLBACK;
}
break;
case OS_OPT_TMR_NONE:
break;
default:
OSSchedUnlock(&err);
*p_err = OS_ERR_OPT_INVALID;
return (DEF_FALSE);
}
OSSchedUnlock(&err);
return (DEF_TRUE);
case OS_TMR_STATE_COMPLETED: /* Timer has already completed the ONE-SHOT or */
case OS_TMR_STATE_STOPPED: /* ... timer has not started yet. */
OSSchedUnlock(&err);
*p_err = OS_ERR_TMR_STOPPED;
return (DEF_TRUE);
case OS_TMR_STATE_UNUSED: /* Timer was not created */
OSSchedUnlock(&err);
*p_err = OS_ERR_TMR_INACTIVE;
return (DEF_FALSE);
default:
OSSchedUnlock(&err);
*p_err = OS_ERR_TMR_INVALID_STATE;
return (DEF_FALSE);
}
}
/*$PAGE*/
/*
************************************************************************************************************************
* CLEAR TIMER FIELDS
*
* Description: This function is called to clear all timer fields.
*
* Argument(s): p_tmr is a pointer to the timer to clear
* -----
*
* Returns : none
*
* Note(s) : 1) This function is INTERNAL to uC/OS-III and your application MUST NOT call it.
************************************************************************************************************************
*/
void OS_TmrClr (OS_TMR *p_tmr)
{
p_tmr->State = OS_TMR_STATE_UNUSED; /* Clear timer fields */
p_tmr->Type = OS_OBJ_TYPE_NONE;
p_tmr->NamePtr = (CPU_CHAR *)((void *)"?TMR");
p_tmr->Dly = (OS_TICK )0;
p_tmr->Match = (OS_TICK )0;
p_tmr->Remain = (OS_TICK )0;
p_tmr->Period = (OS_TICK )0;
p_tmr->Opt = (OS_OPT )0;
p_tmr->CallbackPtr = (OS_TMR_CALLBACK_PTR)0;
p_tmr->CallbackPtrArg = (void *)0;
p_tmr->NextPtr = (OS_TMR *)0;
p_tmr->PrevPtr = (OS_TMR *)0;
}
/*$PAGE*/
/*
************************************************************************************************************************
* ADD/REMOVE TIMER TO/FROM DEBUG TABLE
*
* Description: These functions are called by uC/OS-III to add or remove a timer to/from a timer debug table.
*
* Arguments : p_tmr is a pointer to the timer to add/remove
*
* Returns : none
*
* Note(s) : These functions are INTERNAL to uC/OS-III and your application should not call it.
************************************************************************************************************************
*/
#if OS_CFG_DBG_EN > 0u
void OS_TmrDbgListAdd (OS_TMR *p_tmr)
{
p_tmr->DbgPrevPtr = (OS_TMR *)0;
if (OSTmrDbgListPtr == (OS_TMR *)0) {
p_tmr->DbgNextPtr = (OS_TMR *)0;
} else {
p_tmr->DbgNextPtr = OSTmrDbgListPtr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -