定时器
一、创建定时器任务
void OSTmrCreate( OS_TMR *p_tmr, //指向任务的TCB指针
CPU_CHAR *p_name, //为任务提供名称
OS_TICK dly,
//提供单次或周期计时的时间,在周期计时中,该时间为等待的第一个超时
OS_TICK period, //周期计时中循环的时间
OS_OPT opt,
//模式选择 OS_OPT_TMR_ONE_SHOT OS_OPT_TMR_PERIODIC
OS_TMR_CALLBACK_PTR p_callback,
//在计时器到期后的回调函数 格式为 void MyCallback(OS_TMR *p_tmr,void *p_arg)
void *p_callback_arg, //调用回调函数时传递给回调函数的参数
OS_ERR *p_err)
p_err 参数:
- OS_ERR_NONE
- OS_ERR_ILLEGAL_CREATE_RUN_TIME 在调用OSSafetyCriticalStart()之后创建定时器
- OS_ERR_OBJ_CREATED 该定时器已被创建
- OS_ERR_OBJ_PTR_NULL p_tmr 为NULL
- OS_ERR_OPT_INVALID 指定的选项无效
- OS_ERR_TMR_INVALID_DLY 在单次延时中 指定的延时为0
- OS_ERR_TMR_INVALID_PERIOD 指定的周期为0
- OS_ERR_TMR_ISR 调用来自中断
该函数只创建计时器,换句话说,计时器仅仅被创建而非开始,如果要开始计时器,调用OS_TmrStart()
二、删除定时器
CPU_BOOLEAN OSTmrDel(OS_TMR *p_tmr,
OS_ERR *p_err);
p_err参数:
- OS_ERR_NONE
- OS_ERR_OBJ_TYPE p_tmr没有指向一个定时器
- OS_ERR_TMR_INVALID p_tmr为NULL
- OS_ERR_TMR_ISR 在中断中调用
- OS_ERR_TMR_INACTIVE 定时器没有被创建
- OS_ERR_TMR_INVALID_STATE 定时器状态错误
return:
- DEF_TRUE 定时器已被清除
- DEF_FALSE 没有被删除或报错
三、获取定时器还有多少时间完成计时
OS_TICK OSTmrReemainGet(OS_TMR *p_tmr,
OS_ERR *p_err);
当定时器为周期定时器时,如果被暂停,如果dly == 0 返回period 反则返回 dly
四、开启定时器
CPU_BOOLEAN OSTmrStart(OS_TMR *p_tmr,
OS_ERR *p_err);
在运行时 重新启动计时器 将剩余时间再设置为Dly
注意:
启动/重新启动计时器处于PERIODIC或ONE-SHOT模式,都会使用OS_OPT_LINK_DLY选项将计时器链接到计时器列表,此选项设置计时器初始到期时间。对于处于PERIODIC模式的计时器,后续到期时间由OS_TmrTask()处理
五、获取定时器状态
OS_STATE OSTmrStateGet(OS_TMR *p_tmr,
OS_ERR *p_err);
状态:
- OS_TMR_STATE_UNUSED 定时器未被创建
- OS_TMR_STATE_STOPPED 定时器已经创建但没有启动或已经被暂停
- OS_TMR_STATE_COMPLATE 定时器为单次计时且计时已经到期
- OS_TMR_STATE_RUNNING 定时器正在运行
六、停止时间计时器
CPU_BOOLEAN OSTmrStop(OS_TMR *p_tmr,
OS_OPT opt,
void *p_callback_arg,
OS_ERR *p_err);
/*
opt : 功能选项
OS_OPT_TMR_NONE 仅仅暂停计时器
OS_OPT_TMR_CALLBACK 执行回调函数,将创建计时器时指定的回调参数传递给它
OS_OPT_TMR_CALLBACK_ARG 执行回调函数,将本函数调用中指定的回调参数传递给它
p_callback_arg: 指向新的回调参数的指针,本参数传递给回调函数,而非计时器的回调参数
p_err:
OS_ERR_TMR_NO_CALLBACK 定时器没有定义回调函数
*/