OSTmrCreate
Description
OSTmrCreate()
allows the user to create a software timer. The timer can be configured to run continuously (opt
set to OS_TMR_OPT_PERIODIC
), or only once (opt
set to OS_TMR_OPT_ONE_SHOT
). When the timer counts down to 0
(from the value specified in period
), an optional “callback” function can be executed. The callback can be used to signal a task that the timer expired, or perform any other function. However, it is recommended to keep the callback function as short as possible.
The timer is created in the “stop” mode and therefore the user must call OSTmrStart()
to actually start the timer. If configuring the timer for ONE-SHOT mode, and the timer expires, you need to call OSTmrStart()
to retrigger the timer, call OSTmrDel()
to delete the timer if it is not necessary to retrigger it, or not use the timer anymore. Note: you can use the callback function to delete the timer if using the ONE-SHOT mode.
PERIODIC MODE (see “opt
”) – dly
> 0, period
> 0
PERIODIC MODE (see “opt
”) – “dly == 0, period > 0
ONE-SHOT MODE (see “opt
”) – dly
> 0, period
== 0
Files
os.h/os_tmr.c
Prototype
void OSTmrCreate (OS_TMR *p_tmr, CPU_CHAR *p_name, OS_TICK dly, OS_TICK period, OS_OPT opt, OS_TMR_CALLBACK_PTR p_callback, void *p_callback_arg, OS_ERR *p_err)
Arguments
p_tmr
is a pointer to the timer-control block of the desired timer. It is assumed that storage for the timer will be allocated in the application. In other words, you should declare a “global” variable as follows, and pass a pointer to this variable to OSTmrCreate()
:
OS_TMR MyTmr;
p_name
is a pointer to an ASCII string (NUL
terminated) used to assign a name to the timer. The name can be displayed by debuggers or µC/Probe.
dly
specifies the initial delay (specified in timer tick units) used by the timer (see drawing above). If the timer is configured for ONE-SHOT mode, this is the timeout used. If the timer is configured for PERIODIC mode, this is the timeout to wait before the timer enters periodic mode. The units of this time depends on how often the user will call OSTmrSignal()
(see OSTimeTick()
). If OSTmrSignal()
is called every 1/10 of a second (i.e., OS_CFG_TMR_TASK_RATE_HZ
set to 10), dly
specifies the number of 1/10 of a second before the delay expires.
period
specifies the period repeated by the timer if configured for PERIODIC mode. You would set the “period
” to 0 when using ONE-SHOT mode. The units of time depend on how often OSTmrSignal()
is called. If OSTmrSignal()
is called every 1/10 of a second (i.e., OS_CFG_TMR_TASK_RATE_HZ
set to 10), the period specifies the number of 1/10 of a second before the timer repeats.
opt
is used to specify whether the timer is to be ONE-SHOT or PERIODIC:
OS_OPT_TMR_ONE_SHOT
specifies
ONE-SHOT modeOS_OPT_TMR_PERIODIC
specifies
PERIODIC mode
p_callback
is a pointer to a function that will execute when the timer expires (ONE-SHOT mode), or every time the period expires (PERIODIC mode). A NULL
pointer indicates that no action is to be performed upon timer expiration. The callback function must be declared as follows:
void MyCallback (OS_TMR *p_tmr, void *p_arg);
When called, the callback will be passed the pointer to the timer as well as an argument (p_callback_arg
), which can be used to indicate to the callback what to do. Note that the user is allowed to call all of the timer related functions (i.e., OSTmrCreate()
, OSTmrDel()
, OSTmrStateGet()
, OSTmrRemainGet()
, OSTmrStart()
, and OSTmrStop()
) from the callback function.
Do not make blocking calls within callback functions.
p_callback_arg
is an argument passed to the callback function when the timer expires (ONE-SHOT mode), or every time the period expires (PERIODIC mode). The pointer is declared as a “void *
” so it can point to any data.
p_err
is a pointer to a variable that contains an error code returned by this function.
OS_ERR_NONE
If the call was successful.
OS_ERR_ILLEGAL_CREATE_RUN_TIME
If OS_SAFETY_CRITICAL_IEC61508
is defined: you called this after calling OSStart()
and thus you are no longer allowed to create additional kernel objects.
OS_ERR_OBJ_PTR_NULL
If OS_CFG_ARG_CHK_EN
is set to DEF_ENABLED
in os_cfg.h
: if p_tmr
is a NULL
pointer.
OS_ERR_OPT_INVALID
If OS_CFG_ARG_CHK_EN
is set to DEF_ENABLED
in os_cfg.h
: if not specifying a valid option.
OS_ERR_TMR_INVALID_CALLBACK
If OS_CFG_ARG_CHK_EN
is set to DEF_ENABLED
in os_cfg.h
: if p_callback
is a NULL
pointer.
OS_ERR_TMR_INVALID_DLY
If OS_CFG_ARG_CHK_EN
is set to DEF_ENABLED
in os_cfg.h
: if specifying an invalid delay in ONE-SHOT mode. In other words, it is not allowed to delay for 0
in ONE-SHOT mode.
OS_ERR_TMR_INVALID_PERIOD
If OS_CFG_ARG_CHK_EN
is set to DEF_ENABLED
in os_cfg.h
: if specifying an invalid period in PERIODIC mode. It is not allowed to have a 0
period in PERIODIC.
OS_ERR_TMR_ISR
If OS_CFG_CALLED_FROM_ISR_CHK_EN
set to DEF_ENABLED
in os_cfg.h
: if calling this function from an ISR.
Returned Values
None.
Required Configuration
OS_CFG_TMR_EN
must be enabled in os_cfg.h
. Refer to µC-OS-III Configuration Manual.
Callers
Application.
Notes/Warnings
- Do not call this function from an ISR.
- The timer is not started when it is created. To start the timer, simply call
OSTmrStart()
. - Do not make blocking calls within callback functions.
- Keep callback functions as short as possible.
Example Usage
OS_TMR CloseDoorTmr; void Task (void *p_arg) { OS_ERR err; (void)&p_arg; while (DEF_ON) { OSTmrCreate(&CloseDoorTmr, /* p_tmr */ "Door close", /* p_name */ 10, /* dly */ 100, /* period */ OS_OPT_TMR_PERIODIC, /* opt */ DoorCloseFnct, /* p_callback */ 0, /* p_callback_arg */ &err); /* p_err */ /* Check "err" */ : : } } void DoorCloseFnct (OS_TMR *p_tmr, void *p_arg) { /* Close the door! */ }