下面是我原来用UCOSII定时器的总结,(我系统时间片设置为10ms,定时器时间片100ms)。希望能帮到你
(不过个人觉得UCOS提供的定时器不怎么好使,还不如自己用任务自己创建定时器用起来顺手)
//==================================================================================================
// 3 系统定时器的使用
//==================================================================================================
3.1 说明
UCOS-II 2.81以后的版本提供了系统定时器, 可提供周期的或一次性的延时来执行某函数
3.2 系统定时器函数
3.2.1 创建一个定时器
OS_TMR * OSTmrCreate (INT32U dly, INT32U period, INT8U opt, OS_TMR_CALLBACK callback, void *callback_arg, INT8U *pname, INT8U *perr);
opt === 表示此定时器的类型: OS_TMR_OPT_ONE_SHOT表示是一次性延时, OS_TMR_OPT_PERIODIC表示周期性延时
dly === 一次性延时时表示延时时间, 周期性延时时表示进入周期延时前的第一次延时时间, 当前内核设置的延时单位是100ms
period === 周期性延时时表示周期性延时的时间, 延时单位100ms
callback === 回调函数
callback_arg === 回调函数的参数
pname === 定时器的名称, 这个无所谓
perr === 返回错误状态
返回值 === 若成功, 则返回定时器的句柄
3.2.2 删除定时器
BOOLEAN OSTmrDel(OS_TMR *ptmr, INT8U *perr);
删除定时器, 系统当前配置允许使用16个定时器, 因此不用的定时器应及时删掉
3.2.3 取得定时器距离下次超时还有多长时间, 单位为100ms
INT32U OSTmrRemainGet(OS_TMR *ptmr, INT8U *perr);
3.2.4 取得定时器的状态
INT8U OSTmrStateGet(OS_TMR *ptmr, INT8U *perr);
返回值: OS_TMR_STATE_UNUSED - 表示该定时器未创建
OS_TMR_STATE_STOPPED - 定时器创建后还未启动或还未停止
OS_TMR_COMPLETED - 定时器为一次超时定时器并且已经完成了timeout超时
OS_TMR_RUNNING - 定时器正在运行
3.2.5 启动定时器
BOOLEAN OSTmrStart(OS_TMR *ptmr, INT8U *perr);
启动定时器或重启定时器, 定时器必须已经创建, 若定时器是一次超时定时器并且已经超时, 则该定时器重新以创建时的超时时限运行一次
3.2.6 停止定时器
BOOLEAN OSTmrStop(OS_TMR *ptmr, INT8U opt, void *callback_arg, INT8U *perr);
opt --- OS_TMR_OPT_NONE, 停止定时器
--- OS_TMR_OPT_CALLBACK, 停止定时器并执行一次回调函数
--- OS_TMR_OPT_CALLBACK_ARG, 停止定时器并以callback_arg为参数执行一次回调函数
3.2.7 关于定时器的几点说明
3.2.7.1 定时器每隔100ms计数加1, 创建时的延时参数都以此为单位
3.2.7.2 系统定时器有一个低优先级的系统任务维护, 精度也就是一般凑合吧
3.2.7.3 系统定时器任务执行超时函数时将调度器给锁了, 因此不要在超时函数中进行等待等时间过长的循环
(不过个人觉得UCOS提供的定时器不怎么好使,还不如自己用任务自己创建定时器用起来顺手)
//==================================================================================================
// 3 系统定时器的使用
//==================================================================================================
3.1 说明
UCOS-II 2.81以后的版本提供了系统定时器, 可提供周期的或一次性的延时来执行某函数
3.2 系统定时器函数
3.2.1 创建一个定时器
OS_TMR * OSTmrCreate (INT32U dly, INT32U period, INT8U opt, OS_TMR_CALLBACK callback, void *callback_arg, INT8U *pname, INT8U *perr);
opt === 表示此定时器的类型: OS_TMR_OPT_ONE_SHOT表示是一次性延时, OS_TMR_OPT_PERIODIC表示周期性延时
dly === 一次性延时时表示延时时间, 周期性延时时表示进入周期延时前的第一次延时时间, 当前内核设置的延时单位是100ms
period === 周期性延时时表示周期性延时的时间, 延时单位100ms
callback === 回调函数
callback_arg === 回调函数的参数
pname === 定时器的名称, 这个无所谓
perr === 返回错误状态
返回值 === 若成功, 则返回定时器的句柄
3.2.2 删除定时器
BOOLEAN OSTmrDel(OS_TMR *ptmr, INT8U *perr);
删除定时器, 系统当前配置允许使用16个定时器, 因此不用的定时器应及时删掉
3.2.3 取得定时器距离下次超时还有多长时间, 单位为100ms
INT32U OSTmrRemainGet(OS_TMR *ptmr, INT8U *perr);
3.2.4 取得定时器的状态
INT8U OSTmrStateGet(OS_TMR *ptmr, INT8U *perr);
返回值: OS_TMR_STATE_UNUSED - 表示该定时器未创建
OS_TMR_STATE_STOPPED - 定时器创建后还未启动或还未停止
OS_TMR_COMPLETED - 定时器为一次超时定时器并且已经完成了timeout超时
OS_TMR_RUNNING - 定时器正在运行
3.2.5 启动定时器
BOOLEAN OSTmrStart(OS_TMR *ptmr, INT8U *perr);
启动定时器或重启定时器, 定时器必须已经创建, 若定时器是一次超时定时器并且已经超时, 则该定时器重新以创建时的超时时限运行一次
3.2.6 停止定时器
BOOLEAN OSTmrStop(OS_TMR *ptmr, INT8U opt, void *callback_arg, INT8U *perr);
opt --- OS_TMR_OPT_NONE, 停止定时器
--- OS_TMR_OPT_CALLBACK, 停止定时器并执行一次回调函数
--- OS_TMR_OPT_CALLBACK_ARG, 停止定时器并以callback_arg为参数执行一次回调函数
3.2.7 关于定时器的几点说明
3.2.7.1 定时器每隔100ms计数加1, 创建时的延时参数都以此为单位
3.2.7.2 系统定时器有一个低优先级的系统任务维护, 精度也就是一般凑合吧
3.2.7.3 系统定时器任务执行超时函数时将调度器给锁了, 因此不要在超时函数中进行等待等时间过长的循环