在以前的书中都不会出现这个模块的讲解。自己做个笔记。同时也拿出来和网友讨论。
uCOSII中os_tmr时间管理模块
功能块:os_tmr
是一个软核定时器,该功能有单独的数据结构OS_TMR data structure。而os_time是实现任务的延时挂起等功能。软核定时器,当定时时间到的时候会调用专门的函数void MyCallback (OS_TMR *ptmr, void *p_arg);实现一定的功能。
该软核定时器有两种模式,一种是单次模式,只定时一次。一种是周期连续模式。
#if OS_TMR_EN > 0u
OS_TMR *OSTmrCreate (INT32U dly,
INT32U period,
INT8U opt,
OS_TMR_CALLBACK callback,
void *callback_arg,
INT8U *pname,
INT8U *perr)
参数:dly :就是timeout 也就是溢出时间,等待超时
Period :周期,若设为周期连续模式,则该参数为每次软核定时的时间
Opt: 选择两种模式,该数为下列的值
OS_TMR_OPT_ONE_SHOT The timer counts down only once
OS_TMR_OPT_PERIODIC The timer counts down and then reloads itself
Callback:是一个函数指针,当定时时间到的时候,指向我们要调用的函数的地址,而且该函数必须为下列格式。不能自己定义。
void MyCallback (OS_TMR *ptmr, void *p_arg);
callback_arg:传递给函数MyCallback()的参数
pname: 给该定时器起个名字
perr: 调用该定时器时返回的一些信息,为下列值。和前面调用别的模块类似。
OS_ERR_NONE
OS_ERR_TMR_INVALID_DLY you specified an invalid delay
OS_ERR_TMR_INVALID_PERIOD you specified an invalid period
OS_ERR_TMR_INVALID_OPT you specified an invalid option
OS_ERR_TMR_ISR if the call was made from an ISR
OS_ERR_TMR_NON_AVAIL if there are no free timers from the timer pool
返回值:返回一个指针指向该软核定时器的数据结构。该返回值会被其他的函数调用。
当然创建了定时器,还不能用,必须由BOOLEAN OSTmrStart (OS_TMR *ptmr,
INT8U *perr)
来开启该定时器。
Ptmr:就是指向定时器创建函数OSTmrCreate()返回的指针。
Perr:就是调用该函数返回的一些信息
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
返回值:OS_TRUE 定时器开启
* OS_FALSE 开启定时器出错
例子:
定义的被软核定时器调用的函数
void AppLED3TmrCallBack (OS_TMR *p_tmr,
void *p_arg);
创建一个定时器:注意该参数里面的被调用函数,当定时到的时候就会调用该函数,而执行该函数里面的任务。
AppLED3Tmr = OSTmrCreate((INT32U ) 4,
(INT32U ) 400,
(INT8U ) OS_TMR_OPT_PERIODIC,
(OS_TMR_CALLBACK ) AppLED3TmrCallBack,
(void *) 0,
(INT8U *) "LEDTimer3",
(INT8U *) &os_err);
下面是被调用函数的具体实现
void AppLED3TmrCallBack (OS_TMR *p_tmr,
void *p_arg)
{
OSSemPost((OS_EVENT *)AppLED3Sem);
}
最后在函数里开启定时器
status = OSTmrStart(AppLED3Tmr, &os_err);
if (status != DEF_OK) {
while (DEF_TRUE) {
;
}