RT-Thread 内核学习 >> (十五)软件定时器的使用

软件定时器简介

软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上(系统滴答定时器)。软件定时器使系统能够提供不受数目限制的定时器服务。

RT-Thread 操作系统提供的软件定时器,以系统节拍(OS Tick)的时间长度为定时单位,提供了基于系统节拍整数倍的定时能力,即定时数值是OS Tick 的整数倍。

当软件定时器所设定的定时时间到了后,会调用用户设置的定时器timeout 回调函数,用户需要定时运行的程序会在回调函数中得到处理。

定时器模式

HARDTIMRE 模式

HARD_TIMER 模式的定时器超时函数在中断上下文环境中执行,此模式在定时器初始化时指定。在中断上下文环境中执行时,对于超时函数的要求与中断服务例程的要求相同:执行时间应该尽量短,执行时不应导致当前上下文挂起HARD_TIMER 模式是RT_Thread 软件定时器的默认方式

SOFTTIMER 模式

SOFTTIMER 模式的定时器超时函数在系统的timer 线程上下文中执行(即RT-Thread 启动后会创建一个timer 线程)。通过宏定义RT_USING_TIMER_SOFT 来决定是否启用该模式。当启用SOFTTIMER 模式后,我们可以在定时器初始化时指定定时器工作在SOFTTIMER 模式。


RT-Thread 内核学习 >> (十五)软件定时器的使用_第1张图片

软件定时器控制块

在RT-Thread 中,软件定时器控制块是操作系统用于管理软件定时器的一个数据结构。

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;
参数 说明
parent 从系统对象中继承
row[RT_TIMER_SKIP_LIST_LEVEL] 定时器的链表节点(系统中可以创建多个定时器)
(*timeout_func)(void *parameter) 超时函数的函数指针
parameter 传入超时函数的参数(不需要则RT_NULL)
init_tick 指定定时器超时时间,超时时间到达后调用超时函数
timeout_tick 超时时间到达后系统节拍计数

定义静态软件定时器

struct_timer static_timer;

定义动态软件定时器

rt_timer_t dynamic_timer;

软件定时器的操作

初始化与脱离

软件定时器的初始化与脱离用于操作静态定时器。

void 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_err_t rt_timer_detach(rt_timer_t timer);

rt_timer_init

参数 说明
timer 软件定时器控制块地址
name 软件定时器名称
(*timeout)(void *parameter) 回调函数
parameter 传入回调函数的参数
time 软件定时器超时时间(节拍)
flag 软件定时器运行模式

flag 可选[RT_TIMER_FLAG_ONE_SHOT、RT_TIMER_FLAG_PERIODIC、RT_TIMER_FLAG_HARD_TIMER、RT_TIMER_FLAG_SOFT_TIMER、]

  1. RT_TIMER_FLAG_ONE_SHOT:定时时间到达之后回调函数只运行一次;

  2. RT_TIMER_FLAG_PERIODIC:定时时间到达之后周期性调用回调函数;

  3. RT_TIMER_FLAG_HARD_TIMER(默认):HARD_TIMER 模式;

  4. RT_TIMER_FLAG_SOFT_TIMER:SOFTTIMER 模式。

以上两组在初始化定时器时需要进行一个“逻辑或”组合。


通过调用软件定时器的初始化与脱离函数能够将软件定时器添加进系统管理器中或将软件定时器从系统管理器中脱离。

创建与删除

软件定时器的创建与删除用于操作动态定时器。

rt_timer_t rt_timer_create(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_timer_create

参数 说明
name 软件定时器名称
(*timeout)(void *parameter) 回调函数
parameter 传入回调函数的参数
time 软件定时器超时时间(节拍)
flag 软件定时器运行模式

其参数及说明同静态定时器的初始化。

通过调用软件定时器的创建与删除函数能够将软件定时器添加进系统管理器中或将软件定时器从系统管理器中移除。

启动定时器

rt_err_t rt_timer_start(rt_timer_t timer);

停止定时器

rt_err_t rt_timer_stop(rt_timer_t timer);

示例代码

/* 定时器的控制块 */
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  周期定时器 */
    timer1 = rt_timer_create("timer1", timeout1,
                             RT_NULL, 10,
                             RT_TIMER_FLAG_PERIODIC);

    /* 启动定时器1 */
    if (timer1 != RT_NULL)
        rt_timer_start(timer1);

    /* 创建定时器2 单次定时器 */
    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);

你可能感兴趣的:(C,RT-Thread,嵌入式系统)