?? os_tmr.c
字號:
*perr = OS_ERR_TMR_INACTIVE;
return (OS_FALSE);
default:
OSTmr_Unlock();
*perr = OS_ERR_TMR_INVALID_STATE;
return (OS_FALSE);
}
}
#endif
/*$PAGE*/
/*
************************************************************************************************************************
* STOP A TIMER
*
* Description: This function is called by your application code to stop a timer.
*
* Arguments : ptmr Is a pointer to the timer to stop.
*
* opt Allows you to specify an option to this functions which can be:
*
* OS_TMR_OPT_NONE Do nothing special but stop the timer
* OS_TMR_OPT_CALLBACK Execute the callback function, pass it the callback argument
* specified when the timer was created.
* OS_TMR_OPT_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 ptmr->OSTmrCallbackArg
*
* perr Is a pointer to an error code. '*perr' will contain one of the following:
* OS_ERR_NONE
* OS_ERR_TMR_INVALID 'ptmr' is a NULL pointer
* OS_ERR_TMR_INVALID_TYPE 'ptmr' is not pointing to an OS_TMR
* OS_ERR_TMR_ISR if the function was called from an ISR
* OS_ERR_TMR_INACTIVE if the timer was not created
* OS_ERR_TMR_INVALID_OPT if you specified an invalid option for 'opt'
* OS_ERR_TMR_STOPPED if the timer was already stopped
* OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
* OS_ERR_TMR_NO_CALLBACK if the timer does not have a callback function defined
*
* Returns : OS_TRUE If the call was successful (if the timer is already stopped, we also return OS_TRUE)
* OS_FALSE If not
************************************************************************************************************************
*/
#if OS_TMR_EN > 0
BOOLEAN OSTmrStop (OS_TMR *ptmr,
INT8U opt,
void *callback_arg,
INT8U *perr)
{
OS_TMR_CALLBACK pfnct;
#if OS_ARG_CHK_EN > 0
if (perr == (INT8U *)0) { /* Validate arguments */
return (OS_FALSE);
}
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 > 0) { /* See if trying to call from an ISR */
*perr = OS_ERR_TMR_ISR;
return (OS_FALSE);
}
OSTmr_Lock();
switch (ptmr->OSTmrState) {
case OS_TMR_STATE_RUNNING:
OSTmr_Unlink(ptmr); /* Remove from current wheel spoke */
*perr = OS_ERR_NONE;
switch (opt) {
case OS_TMR_OPT_CALLBACK:
pfnct = ptmr->OSTmrCallback; /* Execute callback function if available ... */
if (pfnct != (OS_TMR_CALLBACK)0) {
(*pfnct)((void *)ptmr, ptmr->OSTmrCallbackArg); /* Use callback arg when timer was created */
} else {
OSTmr_Unlock();
*perr = OS_ERR_TMR_NO_CALLBACK;
return (OS_FALSE);
}
break;
case OS_TMR_OPT_CALLBACK_ARG:
pfnct = ptmr->OSTmrCallback; /* Execute callback function if available ... */
if (pfnct != (OS_TMR_CALLBACK)0) {
(*pfnct)((void *)ptmr, callback_arg); /* ... using the 'callback_arg' provided in call */
} else {
OSTmr_Unlock();
*perr = OS_ERR_TMR_NO_CALLBACK;
return (OS_FALSE);
}
break;
case OS_TMR_OPT_NONE:
break;
default:
OSTmr_Unlock();
*perr = OS_ERR_TMR_INVALID_OPT;
return (OS_FALSE);
}
OSTmr_Unlock();
return (OS_TRUE);
case OS_TMR_STATE_COMPLETED: /* Timer has already completed the ONE-SHOT or ... */
case OS_TMR_STATE_STOPPED: /* ... timer has not started yet. */
OSTmr_Unlock();
*perr = OS_ERR_TMR_STOPPED;
return (OS_TRUE);
case OS_TMR_STATE_UNUSED: /* Timer was not created */
OSTmr_Unlock();
*perr = OS_ERR_TMR_INACTIVE;
return (OS_FALSE);
default:
OSTmr_Unlock();
*perr = OS_ERR_TMR_INVALID_STATE;
return (OS_FALSE);
}
}
#endif
/*$PAGE*/
/*
************************************************************************************************************************
* SIGNAL THAT IT'S TIME TO UPDATE THE TIMERS
*
* Description: This function is typically called by the ISR that occurs at the timer tick rate and is used to signal to
* OSTmr_Task() that it's time to update the timers.
*
* Arguments : none
*
* Returns : OS_ERR_NONE The call was successful and the timer task was signaled.
* OS_ERR_SEM_OVF If OSTmrSignal() was called more often than OSTmr_Task() can handle the timers.
* This would indicate that your system is heavily loaded.
* OS_ERR_EVENT_TYPE Unlikely you would get this error because the semaphore used for signaling is created
* by uC/OS-II.
* OS_ERR_PEVENT_NULL Again, unlikely you would ever get this error because the semaphore used for signaling
* is created by uC/OS-II.
************************************************************************************************************************
*/
#if OS_TMR_EN > 0
INT8U OSTmrSignal (void)
{
INT8U err;
err = OSSemPost(OSTmrSemSignal);
return (err);
}
#endif
/*$PAGE*/
/*
************************************************************************************************************************
* ALLOCATE AND FREE A TIMER
*
* Description: This function is called to allocate a timer.
*
* Arguments : none
*
* Returns : a pointer to a timer if one is available
************************************************************************************************************************
*/
#if OS_TMR_EN > 0
static OS_TMR *OSTmr_Alloc (void)
{
OS_TMR *ptmr;
if (OSTmrFreeList == (OS_TMR *)0) {
return ((OS_TMR *)0);
}
ptmr = (OS_TMR *)OSTmrFreeList;
OSTmrFreeList = (OS_TMR *)ptmr->OSTmrNext;
ptmr->OSTmrNext = (OS_TCB *)0;
ptmr->OSTmrPrev = (OS_TCB *)0;
OSTmrUsed++;
OSTmrFree--;
return (ptmr);
}
#endif
/*
************************************************************************************************************************
* RETURN A TIMER TO THE FREE LIST
*
* Description: This function is called to return a timer object to the free list of timers.
*
* Arguments : ptmr is a pointer to the timer to free
*
* Returns : none
************************************************************************************************************************
*/
#if OS_TMR_EN > 0
static void OSTmr_Free (OS_TMR *ptmr)
{
ptmr->OSTmrState = OS_TMR_STATE_UNUSED; /* Clear timer object fields */
ptmr->OSTmrOpt = OS_TMR_OPT_NONE;
ptmr->OSTmrPeriod = 0;
ptmr->OSTmrMatch = 0;
ptmr->OSTmrCallback = (OS_TMR_CALLBACK)0;
ptmr->OSTmrCallbackArg = (void *)0;
#if OS_TMR_CFG_NAME_SIZE > 1
ptmr->OSTmrName[0] = '?'; /* Unknown name */
ptmr->OSTmrName[1] = OS_ASCII_NUL;
#endif
ptmr->OSTmrPrev = (OS_TCB *)0; /* Chain timer to free list */
ptmr->OSTmrNext = OSTmrFreeList;
OSTmrFreeList = ptmr;
OSTmrUsed--; /* Update timer object statistics */
OSTmrFree++;
}
#endif
/*$PAGE*/
/*
************************************************************************************************************************
* INITIALIZATION
* INITIALIZE THE FREE LIST OF TIMERS
*
* Description: This function is called by OSInit() to initialize the free list of OS_TMRs.
*
* Arguments : none
*
* Returns : none
************************************************************************************************************************
*/
#if OS_TMR_EN > 0
void OSTmr_Init (void)
{
#if OS_EVENT_NAME_SIZE > 10
INT8U err;
#endif
INT16U i;
OS_TMR *ptmr1;
OS_TMR *ptmr2;
OS_MemClr((INT8U *)&OSTmrTbl[0], sizeof(OSTmrTbl)); /* Clear all the TMRs */
OS_MemClr((INT8U *)&OSTmrWheelTbl[0], sizeof(OSTmrWheelTbl)); /* Clear the timer wheel */
ptmr1 = &OSTmrTbl[0];
ptmr2 = &OSTmrTbl[1];
for (i = 0; i < (OS_TMR_CFG_MAX - 1); i++) { /* Init. list of free TMRs */
ptmr1->OSTmrType = OS_TMR_TYPE;
ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
ptmr1->OSTmrNext = (void *)ptmr2; /* Link to next timer */
#if OS_TMR_CFG_NAME_SIZE > 1
ptmr1->OSTmrName[0] = '?'; /* Unknown name */
ptmr1->OSTmrName[1] = OS_ASCII_NUL;
#endif
ptmr1++;
ptmr2++;
}
ptmr1->OSTmrType = OS_TMR_TYPE;
ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */
ptmr1->OSTmrNext = (void *)0; /* Last OS_TMR */
#if OS_TMR_CFG_NAME_SIZE > 1
ptmr1->OSTmrName[0] = '?'; /* Unknown name */
ptmr1->OSTmrName[1] = OS_ASCII_NUL;
#endif
OSTmrTime = 0;
OSTmrUsed = 0;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -