🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:UCOS-III,本专栏为UCOS-III学习记录 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖
定时器:从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可自定义定时器的周期
硬件定时器:芯片本身自带的定时器模块,硬件定时器的精度一般很高,每次在定时时间到达之后就会自动触发一个中断,用户在中断服务函数中处理信息。
软件定时器:是指具有定时功能的软件,可设置定时周期,当指定时间到达后要调用回调函数(也称超时函数),用户在回调函数中处理信息
软件定时器的优缺点:
优点:
缺点:
软件定时器相对硬件定时器来说,精度不高。 对于需要高精度要求的场合,不建议使用软件定时器
软件定时器特点:
注意:新创建的软件定时器处于停止状态 ,也就是未运行的!
支持裁剪:软件定时器支持裁剪, 如需使能软件定时器,需将OS_CFG_TMR_EN配置项配置成 1
软件定时器的频率由宏OS_CFG_TMR_TASK_RATE_HZ决定,软件定时器是依靠系统节拍实现定时的,所以需要进行换算:
软件定时器时间分辨率 = OS_CFG_TICK_RATE_HZ / OS_CFG_TMR_TASK_RATE_HZ;
eg:
在例程中将宏OS_CFG_TMR_TASK_RATE_HZ设置为10,也就是软件定时器频率10HZ(100ms),假设现在开启一个定时时长为10的软件定时器,那么他大约在10 * 100ms = 1000ms后超时
函数 | 描述 |
|---|---|
OSTmrCreate() | 创建一个软件定时器 |
OSTmrDel() | 删除一个软件定时器 |
OSTmrRemainGet() | 获取软件定时器的剩余超时时间 |
OSTmrSet() | 设置软件定时器的延时时间、周期、超时回调函数及其参数等 |
OSTmrStart() | 开启软件定时器定时 |
OSTmrStateGet() | 获取软件定时器的状态 |
OSTmrStop() | 停止软件定时器定时 |
void OSTmrCreate( OS_TMR* p_tmr, //指向软件定时器结构体指针
CPU_CHAR* p_name, //指向软件定时器名的字符串指针
OS_TICK dly, //软件定时器的开启延时时间,注意单次定时器必须大于0
OS_TICK period, //周期定时器的定时周期时间,注意周期定时器必须大于0
OS_OPT opt, //OS_OPT_TMR_ONE_SHOT(单次定时器)
//OS_OPT_TMR_PERIODIC(周期定时器)
OS_TMR_CALLBACK_PTR p_callback, //指向超时回调函数的指针
void* p_callback_arg, //超时回调函数入口参数
OS_ERR* p_err //接收错误代码
) 单次软件定时器的时序图

单次定时器(dly > 0 ,period = 0)

多次重新触发单次定时器
周期软件定时器的时序图

周期定时器(dly = 0 ,period > 0)

周期定时器(dly > 0 ,period > 0)
CPU_BOOLEAN OSTmrDel( OS_TMR* p_tmr , //指向软件定时器结构体的指针
OS_ERR* p_err //指向接收错误代码变量的指针
) //返回值 OS_TRUE :软件定时器删除成功 OS_FALSE :软件定时器删除失败CPU_BOOLEAN OSTmrStart( OS_TMR* p_tmr , //指向软件定时器结构体的指针
OS_ERR* p_err //指向接收错误代码变量的指针
) //返回值 OS_TRUE :软件定时器开启成功 OS_FALSE :软件定时器开启失败CPU_BOOLEAN OSTmrStop( OS_TMR* p_tmr, //指向软件定时器结构体的指针
OS_OPT opt, //函数操作选项
void* p_callback_arg, //传给软件定时器超时回调函数的参数
OS_ERR* p_err //指向接收错误代码变量的指针
) //返回值 OS_TRUE :软件定时器停止成功 OS_FALSE :软件定时器停止失败opt | 描述 |
|---|---|
OS_OPT_TMR_CALLBACK | 执行一次回调函数,代入原始参数 |
OS_OPT_TMR_CALLBACK_ARG | 执行一次回调函数,代入指定参数 |
OS_OPT_TMR_NONE | 仅停止软件定时器 |