软件定时器的使用
软件定时器介绍
软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上(系统滴答定时器)。软件定时器使系统能够提供不受数目限制的定时器服务。
RT-Thread操作系统提供的软件定时器,以系统节拍(OS Tick)的时间长度为定时单位,提供了基于系统节拍整数倍的定时能力,即定时数值是OS Tick的整数倍。例如一个OS Tick是10ms,那么上层软件定时器只能提供10ms,20ms,100ms 等时间精度的定时服务,而不能定时为15ms、25ms、35ms等。
当软件定时器所设定的定时时间到了后,会调用用户设置的定时器timeout回调函数,用户需要定时运行的程序会在回调函数中得到处理。
定时器模式
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Hyi6T2v-1627401612492)(C:\Users\在飞电脑\AppData\Roaming\Typora\typora-user-images\image-20210727225001731.png)]](https://i-blog.csdnimg.cn/blog_migrate/aad5ef35cdff52ebfd018bab51249973.png)
HARDTIMER模式
HARDTIMER模式的定时器超时函数在中断上下文环境中执行,此模式在定时器初始化时指定。在中断上下文环境中执行时,对于超时函数的要求与中断服务例程的要求相同:执行时间应该尽量短,执行时不应导致当前上下文挂起。HARD_ TIMER 模式是RT-Thread软件定时器的默认方式。
SOFTTIMER模式
SOFTTIMER模式的定时器超时函数在系统的timer线程的线程上下文中执行。通过宏定义RT_USING_TIMER_SOFT来决定是否启用该模式。当启用SOFTTIMER 模式后,我们可以在定时器初始化时指定定时器工作在SOFTTIMER模式。
软件定时器控制块
在RT-Thread中,软件定时器控制块是操作系统用于管理软件定时器的一个数据结构。
/* 在rtdef.h中对结构体的定义 */
/**
* timer structure
*/
struct rt_timer
{
struct rt_object parent; /**< inherit from rt_object */
//定时器列表结点
rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL];
//超时函数指针 及其输入参数
void (*timeout_func)(void *parameter); /**< timeout function */
void *parameter; /**< timeout function's parameter */
//超时时间 超时时间到时的系统节拍计数
rt_tick_t init_tick; /**< timer timeout tick */
rt_tick_t timeout_tick; /**< timeout tick */
};
typedef struct rt_timer *rt_timer_t;
struct rt_timer static_timer //定义静态邮箱
rt_timer_t dynamic_timer //定义动态信号量
软件定时器的操作
初始化与脱离
//用于静态邮箱
rt_err_t rt_timer_init(rt_timer_t timer, const char *name, void (*timeout)(void *parameter),
void *parameter, rt_tick_t time, rt_uint8_t flag)
/*
*rt_uint8_t flag的选择:
* RT_TIMER_FLAG_ONE_SHOT:只定时一次 RT_TIMER_FLAG_PERIODIC:周期定时
* RT_TIMER_FLAG_HARD_TIMER:HARDTIMER模式 RT_TIMER_FLAG_DOFT_TIMER:SOFTTIMER模式
*/
rt_err_t rt_timer_detach(rt_timer_t timer)
创建和删除
//用于动态邮箱
rt_timer_t rt_timer_create(rt_timer_t timer, const char *name, void (*timeout)(void *parameter),
void *parameter, rt_tick_t time, rt_uint8_t flag)
rt_err_t rt_timer_delete(rt_timer_t timer)
启动定时器
rt_err_t rt_timer_start(rt_timer_t timer)
停止定时器
rt_err_t rt_timer_stop(rt_timer_t timer)
小例
代码
/*
* 程序清单:定时器例程
*
* 这个例程会创建两个动态定时器,一个是单次定时,一个是周期性定时
* 并让周期定时器运行一段时间后停止运行
*/
#include <rtthread.h>
/* 定时器的控制块 */
static rt_timer_t timer1;
static rt_timer_t timer2;
static int cnt = 0;
/* 定时器1超时函数 */
static void timeout1(void *parameter)
{
rt_kprintf("periodic timer is timeout %d\n", cnt);
/* 运行第10次,停止周期定时器 */
if (cnt++ >= 9)
{
rt_timer_stop(timer1);
rt_kprintf("periodic timer was stopped! \n");
}
}
/* 定时器2超时函数 */
static void timeout2(void *parameter)
{
rt_kprintf("one shot timer is timeout\n");
}
int timer_sample(void)
{
/* 创建定时器1 周期定时器 10*10ms */
timer1 = rt_timer_create("timer1", timeout1,
RT_NULL, 10,
RT_TIMER_FLAG_PERIODIC);
/* 启动定时器1 */
if (timer1 != RT_NULL) rt_timer_start(timer1);
/* 创建定时器2 单次定时器 30*10ms */
timer2 = rt_timer_create("timer2", timeout2,
RT_NULL, 30,
RT_TIMER_FLAG_ONE_SHOT);
/* 启动定时器2 */
if (timer2 != RT_NULL) rt_timer_start(timer2);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(timer_sample, timer sample);
结果
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ct7HJldK-1627401612494)(C:\Users\在飞电脑\AppData\Roaming\Typora\typora-user-images\image-20210727230735497.png)]](https://i-blog.csdnimg.cn/blog_migrate/9964ba56e81de158b2b01fdf1a3d1437.png)
本文介绍了RT-Thread操作系统中的软件定时器,包括其基本概念、工作原理、两种主要模式(HARDTIMER和SOFTTIMER),以及定时器控制块的结构。此外,还详细说明了定时器的各种操作方法,并提供了一个简单的应用实例。
920

被折叠的 条评论
为什么被折叠?



