rt-thread的定时器管理源码分析

本文详细介绍了rt-thread操作系统中的定时器管理,包括软件和硬件定时器的工作原理,重点分析了rt-thread的源码,探讨了定时器的初始化、启动、停止和控制等接口操作。此外,还提到了STM32F2XX硬件定时器的中断处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 前言

rt-thread可以采用软件定时器或硬件定时器来实现定时器管理的,所谓软件定时器是指由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。而硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。软件定时器的精度取决于它使用的硬件定时器精度。而rt-thread操作系统在默认情况下是采用的硬件定时器的方式,用户可以通过修改宏定义#ifdef RT_USING_TIMER_SOFT来修改采用哪种。

2 rt-thread的定时器的基本工作原理

在RT-Thread定时器模块维护两个重要的全局变量,一个是当前系统的时间rt_tick(当硬件定时器中断来临时,它将加1),另一个是定时器链表rt_timer_list,系统中新创建的定时期都会被以排序的方式插入到rt_timer_list(硬件定时器模式下使用)链表中,rt_timer_list的每个节点保留了一个定时器的信息,并且在这个节点加入链表时就计算好了产生时间到达时的时间点,即tick,在rt-thread系统中如果采用软件定时器模式,则存在一定时器线程rt_thread_timer_entry,不断获取当前TICK值并与定时器链表rt_timer_list上的定时器对比判断是否时间已到,一旦发现就调用对应的回调函数,即事件处理函数进行处理,而如果采用硬件定时器管理模式的话,则该检查过程放到系统时钟中断例程中进行处理,此时,是不存在定时器线程的。如下图:注:如果采用软件定时器软件定时器,则该定时器链表为rt_soft_timer_list。

3 源码分析

3.1 数据定义

/**
 * timer structure
 */
struct rt_timer
{
    struct rt_object parent; //内核对象

    rt_list_t        list;      //链表节点

    void (*timeout_func)(void *parameter);  //定时器超时例程
    void            *parameter;       //定时器例程的传入参数

    rt_tick_t        init_tick;       //定时器的超时时间,即总共多长时间将产生超时事件
    rt_tick_t        timeout_tick;     //定时器超时的时间点,即产生超时事件时那一该的时间点
};
typedef struct rt_timer *rt_timer_t;

3.2 rt-thread的软件定时器模式

软件定时器线程初始化及启动:

/**
 * @ingroup SystemInit
 *
 * This function will initialize system timer thread
 */
void rt_system_timer_thread_init(void)
{
#ifdef RT_USING_TIMER_SOFT//如果采用软件定时器管理模式,则启动定时器线程
    rt_list_init(&rt_soft_timer_list);//初始化软件定时器链表

    /* start software timer thread */
    rt_thread_init(&timer_thread,//初始化软件定时器线程,并启动
                   "timer",
                   rt_thread_timer_entry,
                   RT_NULL,
                   &timer_thread_stack[0],
                   sizeof(timer_thread_stack),
                   RT_TIMER_THREAD_PRIO,
                   10);

    /* startup */
    rt_thread_startup(&timer_thread);
#endif
}

软件定时器线程如下:
/* system timer thread entry */
static void rt_thread_timer_entry(void *parameter)
{
    rt_tick_t next_timeout;
    
    while (1)
    {
        /* get the next timeout tick */
        next_timeout = rt_timer_list_next_timeout(&rt_soft_timer_list);//得到软件定时器链表上的下一个定时器的超时时间点
        if (next_timeout == RT_TICK_MAX)//如果超过范围,则挂起当前线程,继续线程调度
        {
            /* no software timer exist, suspend self. */
            rt_thread_suspend(rt_thread_self());
            rt_schedule();
        }
        else
        {
            rt_tick_t current_tick;

            /* get current tick */
            current_tick = rt_tick_get();//获取当前时间点

            if ((next_timeout - current_tick) < RT_TICK_MAX/2)//离下个中断时间点还差些时候
            {
                /* get the delta timeout tick */
                next_timeout = next_timeout - current_tick;//计算还差多长时间
                rt_thread_delay(next_timeout);//休眠一段时间
            }
        }

        /* lock scheduler */
        rt_enter_critical();//时间到,进入临界区
        /* check software timer */
        rt_soft_timer_check();//检查是否该产生超时事件
        /* unlock scheduler */
        rt_exit_critical();//退出临界区
    }
}

检查是否产生中断函数rt_soft_timer_check函数如下定义:
/**
 * This function will check timer list, if a timeout event happens, the
 * corresponding timeout function will be invoked.
 */
void rt_soft_t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值