?? os_tmr.c
字號:
* OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
*
* Returns : The length of the string or 0 if the timer does not exist.
************************************************************************************************************************
*/
#if OS_TMR_EN > 0 && OS_TMR_CFG_NAME_SIZE > 0
INT8U OSTmrNameGet (OS_TMR *ptmr,
INT8U *pdest,
INT8U *perr)
{
INT8U len;
#if OS_ARG_CHK_EN > 0
if (perr == (INT8U *)0) {
return (0);
}
if (pdest == (INT8U *)0) {
*perr = OS_ERR_TMR_INVALID_DEST;
return (0);
}
if (ptmr == (OS_TMR *)0) {
*perr = OS_ERR_TMR_INVALID;
return (0);
}
#endif
if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
*perr = OS_ERR_TMR_INVALID_TYPE;
return (0);
}
if (OSIntNesting > 0) { /* See if trying to call from an ISR */
*perr = OS_ERR_NAME_GET_ISR;
return (0);
}
OSTmr_Lock();
switch (ptmr->OSTmrState) {
case OS_TMR_STATE_RUNNING:
case OS_TMR_STATE_STOPPED:
case OS_TMR_STATE_COMPLETED:
len = OS_StrCopy(pdest, ptmr->OSTmrName);
OSTmr_Unlock();
*perr = OS_ERR_NONE;
return (len);
case OS_TMR_STATE_UNUSED: /* Timer is not allocated */
OSTmr_Unlock();
*perr = OS_ERR_TMR_INACTIVE;
return (0);
default:
OSTmr_Unlock();
*perr = OS_ERR_TMR_INVALID_STATE;
return (0);
}
}
#endif
/*$PAGE*/
/*
************************************************************************************************************************
* GET HOW MUCH TIME IS LEFT BEFORE A TIMER EXPIRES
*
* Description: This function is called to get the number of ticks before a timer times out.
*
* Arguments : ptmr Is a pointer to the timer to obtain the remaining time from.
*
* 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 call was made from an ISR
* OS_ERR_TMR_INACTIVE 'ptmr' points to a timer that is not active
* OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
*
* Returns : The time remaining for the timer to expire. The time represents 'timer' increments. In other words, if
* OSTmr_Task() is signaled every 1/10 of a second then the returned value represents the number of 1/10 of
* a second remaining before the timer expires.
************************************************************************************************************************
*/
#if OS_TMR_EN > 0
INT32U OSTmrRemainGet (OS_TMR *ptmr,
INT8U *perr)
{
INT32U remain;
#if OS_ARG_CHK_EN > 0
if (perr == (INT8U *)0) {
return (0);
}
if (ptmr == (OS_TMR *)0) {
*perr = OS_ERR_TMR_INVALID;
return (0);
}
#endif
if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
*perr = OS_ERR_TMR_INVALID_TYPE;
return (0);
}
if (OSIntNesting > 0) { /* See if trying to call from an ISR */
*perr = OS_ERR_TMR_ISR;
return (0);
}
OSTmr_Lock();
switch (ptmr->OSTmrState) {
case OS_TMR_STATE_RUNNING:
remain = ptmr->OSTmrMatch - OSTmrTime; /* Determine how much time is left to timeout */
OSTmr_Unlock();
*perr = OS_ERR_NONE;
return (remain);
case OS_TMR_STATE_STOPPED: /* It's assumed that the timer has not started yet */
switch (ptmr->OSTmrOpt) {
case OS_TMR_OPT_PERIODIC:
if (ptmr->OSTmrDly == 0) {
remain = ptmr->OSTmrPeriod;
} else {
remain = ptmr->OSTmrDly;
}
OSTmr_Unlock();
*perr = OS_ERR_NONE;
break;
case OS_TMR_OPT_ONE_SHOT:
default:
remain = ptmr->OSTmrDly;
OSTmr_Unlock();
*perr = OS_ERR_NONE;
break;
}
return (remain);
case OS_TMR_STATE_COMPLETED: /* Only ONE-SHOT that timed out can be in this state */
OSTmr_Unlock();
*perr = OS_ERR_NONE;
return (0);
case OS_TMR_STATE_UNUSED:
OSTmr_Unlock();
*perr = OS_ERR_TMR_INACTIVE;
return (0);
default:
OSTmr_Unlock();
*perr = OS_ERR_TMR_INVALID_STATE;
return (0);
}
}
#endif
/*$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 : ptmr Is a pointer to the desired timer
*
* 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 call was made from an ISR
* OS_ERR_TMR_INACTIVE 'ptmr' points to a timer that is not active
* OS_ERR_TMR_INVALID_STATE if the timer is not in a valid state
*
* Returns : The current state of the timer (see description).
************************************************************************************************************************
*/
#if OS_TMR_EN > 0
INT8U OSTmrStateGet (OS_TMR *ptmr,
INT8U *perr)
{
INT8U state;
#if OS_ARG_CHK_EN > 0
if (perr == (INT8U *)0) {
return (0);
}
if (ptmr == (OS_TMR *)0) {
*perr = OS_ERR_TMR_INVALID;
return (0);
}
#endif
if (ptmr->OSTmrType != OS_TMR_TYPE) { /* Validate timer structure */
*perr = OS_ERR_TMR_INVALID_TYPE;
return (0);
}
if (OSIntNesting > 0) { /* See if trying to call from an ISR */
*perr = OS_ERR_TMR_ISR;
return (0);
}
OSTmr_Lock();
state = ptmr->OSTmrState;
switch (state) {
case OS_TMR_STATE_UNUSED:
case OS_TMR_STATE_STOPPED:
case OS_TMR_STATE_COMPLETED:
case OS_TMR_STATE_RUNNING:
*perr = OS_ERR_NONE;
break;
default:
*perr = OS_ERR_TMR_INVALID_STATE;
break;
}
OSTmr_Unlock();
return (state);
}
#endif
/*$PAGE*/
/*
************************************************************************************************************************
* START A TIMER
*
* Description: This function is called by your application code to start a timer.
*
* Arguments : ptmr Is a pointer to an OS_TMR
*
* perr Is a pointer to an error code. '*perr' will contain one of the following:
* OS_ERR_NONE
* OS_ERR_TMR_INVALID
* OS_ERR_TMR_INVALID_TYPE 'ptmr' is not pointing to an OS_TMR
* OS_ERR_TMR_ISR if the call was made from an ISR
* OS_ERR_TMR_INACTIVE if the timer was not created
* OS_ERR_TMR_INVALID_STATE the timer is in an invalid state
*
* Returns : OS_TRUE if the timer was started
* OS_FALSE if an error was detected
************************************************************************************************************************
*/
#if OS_TMR_EN > 0
BOOLEAN OSTmrStart (OS_TMR *ptmr,
INT8U *perr)
{
#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: /* Restart the timer */
OSTmr_Unlink(ptmr); /* ... Stop the timer */
OSTmr_Link(ptmr, OS_TMR_LINK_DLY); /* ... Link timer to timer wheel */
OSTmr_Unlock();
*perr = OS_ERR_NONE;
return (OS_TRUE);
case OS_TMR_STATE_STOPPED: /* Start the timer */
case OS_TMR_STATE_COMPLETED:
OSTmr_Link(ptmr, OS_TMR_LINK_DLY); /* ... Link timer to timer wheel */
OSTmr_Unlock();
*perr = OS_ERR_NONE;
return (OS_TRUE);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -