关于UCOSIII操作系统定时器讲解总结:
本问介绍内容:
- 主要函数
- 定时器知识介绍
- 实现原理
主要函数:
函数名 | 函数功能 |
---|---|
OSTmrCreate() | 创建定时器并指定其运行模式 |
OSTmrDel() | 删除定时器 |
OSTmrRemainGet() | 获取定时器的剩余时间 |
OSTmrStart() | 启动(或重新启动)定时器计数 |
OSTmrStartGet() | 获取当前定时器状态 |
OSTmrStop() | 停止计数器倒计时 |
函数详细介绍:
创建定时器并指定其运行模式
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);
参数名 | 参数介绍 | 参数选项 |
---|---|---|
*p_tmr | 指定是定时器的指针 | 定时器对象 |
*p_name | 定时器名称,ASCII | 定时器的名称 |
dly | 初始化延时时间 | 第一次启动定时器的推迟时间 |
period | 重复周期 | 启动循环模式下的定时器重复时间,单次模式为0 |
opt | 选项 | OS_OPT_TMR_PERIODIC 单次模式OS_OPT_TMR_ONE_SHOT 循环模式 |
p_callback | 指向回调函数的指针 | 定时器时间到触发时的回调函数 |
*p_callback_arg | 回调函数参数 | 定时器时间到了调用的回调函是传给回调函数的参数 |
*p_err|错误返回码|返回定时器错误码
删除定时器
CPU_BOOLEAN OSTmrDel (OS_TMR *p_tmr,
OS_ERR *p_err);
获取定时器的剩余时间
OS_TICK OSTmrRemainGet (OS_TMR *p_tmr,
OS_ERR *p_err);
启动(或重新启动)定时器计数
CPU_BOOLEAN OSTmrStart (OS_TMR *p_tmr,
OS_ERR *p_err);
获取当前定时器状态
OS_STATE OSTmrStateGet (OS_TMR *p_tmr,
OS_ERR *p_err);
停止计数器倒计时
CPU_BOOLEAN OSTmrStop (OS_TMR *p_tmr,
OS_OPT opt,
void *p_callback_arg,
OS_ERR *p_err);
参数名 | 参数介绍 | 参数选项 |
---|---|---|
*p_tmr | 指定是定时器的指针 | 定时器对象 |
opt | 停止定时器的选项 | OS_OPT_TMR_CALLBACK 无选项 OS_OPT_TMR_CALLBACK_ARG 执行回调函数,使用创建时的参数 OS_OPT_TMR_NONE 执行回调函数,使用新的参数 |
*p_callback_arg | 传递给回调函数新的参数值 | 此值会传递给新的回调函数 |
*p_err | 错误返回码 | 返回定时器错误码 |
定时器错误码介绍:
注意介绍返回的错误码有利于代码的稳定性。
定时器知识介绍
总结 UCOSIII的定时器是又硬件定时器产生中断发送信号给定时器任务,定时器任务接受到信号更新所有定时器数据块的剩余时间,如果时间耗尽则直接调用回调函数,当然回调函数得存在,注意这说明所有的定时器回调函数是属于同个任务的,也就意味着回调函数和创建这个定时器的任务不在同一个任务。。。。
所以我们尽量在回调函数处理极其简单的事情。
值得一提的是UCOSIII在进行定时器任务的时候回关闭任务调度器,所以在回调函数内部不能进行阻塞的方式等待互斥量、延时,也就意味我们不能进行全局变量的修改和不可重入函数得调用,否则会导致数据的安全性问题。