ucos ii从V2.83版本以后加入了软件定时器,软件定时器的最快时钟节拍就等于ucos ii的系统时钟节拍,由一个单独的计数器OSTmrTime计时。功能代码在tmr.c里面,
深入的原理现在我也不懂,以后再补上,直接说函数和用法:
1.创建软件定时器函数OS_TMR *_OSTmrCreate(INT32U dly, INT32Uperiod, INT8Uopt,
OS_TMR_CALLBACK callback, void *callback_arg, INT8U *pname, INT8U *perr);
其中dly表示第一次延时时间节拍数(软件定时器的节拍,不是系统时钟节拍);
period只有在周期定时模式时才有用,表示定时器的周期溢出时间;
opt为定时器的工作模式,有单次定时器和周期定时器两种,值分别为OS_TMR_OPT_ONE_SHOT和OS_TMR_OPT_PERIODIC;
callback是定时器的回调函数,当软件定时器的定时时间到达时,会调用这个函数;
callback_arg是回调函数的参数;
pname是软件定时器的名字;
perr,错误信息。
需要注意的是,回调函数有固定的格式,不能自己随便写,格式如下:
void(*OS_TMR_CALLBACK)(void *ptmr, void *parg)。函数名可以自己写,ptmr一般设置类型为 OS_TMR*类型,parg是回调函数的参数,可以不用,但必须有这个参数。
2.开启软件定时器函数 BOOLEAN OSTmrStart(OS_TMR *ptmr, INT8U *perr);
其中ptmr是软件定时器指针,perr是错误信息。
3.停止软件定时器函数 BOOLEAN OSTmrStop (OS_TMR *ptmr, INT8U opt, void *callback_arg,
INT8U *perr);
其中ptmr是软件定时器指针,opt为停止选项,可以设置的 值和对应的意义为:
OS_TMR_OPT_NONE 直接停止,不做其他处理;
OS_TMR_OPT_ONE_SHOT停止,用初始化的参数执行一次回调函数;
OS_TMR_OPT_PERIODIC停止,用新的参数执行一次回调函数。
然后callback_arg就是新的参数。perr同样是错误信息。
接下来就是简单的例子了
OS_TMR * tmr1; //软件定时器
1OS_TMR * tmr2; //软件定时器2
......
tmr1=OSTmrCreate(10,10,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)tmr1_callback,0,"tmr1",&err);//100ms执行一次
tmr2=OSTmrCreate(10,20,OS_TMR_OPT_PERIODIC,(OS_TMR_CALLBACK)tmr2_callback,0,"tmr2",&err);//200ms执行一次
OSTmrStart(tmr1,&err);//启动软件定时器1
OSTmrStart(tmr2,&err);//启动软件定时器2
......
OSTmrStop(tmr2,OS_TMR_OPT_NONE,0,&err); //关闭软件定时器2
......
//软件定时器1的回调函数
void tmr1_callback(OS_TMR *ptmr,void *p_arg)
{
}
//软件定时器2的回调函数
void tmr2_callback(OS_TMR *ptmr,void *p_arg)
{
}