没志青年
发布于 2025-07-28 / 18 阅读
0

RT-Thread 定时器

软件定时器,单位为时钟节拍,定时数值必须是 OS Tick 的整数倍。

定时器控制块:

struct rt_timer
{
    struct rt_object parent;
    rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL];  /* 定时器链表节点 */

    void (*timeout_func)(void *parameter);    /* 定时器超时调用的函数 */
    void      *parameter;                         /* 超时函数的参数 */
    rt_tick_t init_tick;                         /* 定时器初始超时节拍数 */
    rt_tick_t timeout_tick;                     /* 定时器实际超时时的节拍数 */
};
typedef struct rt_timer *rt_timer_t;

硬件定时器:

在中断上下文环境下执行,因此执行时间要短,不能调用会导致阻塞的函数。

软件定时器:

系统会创建一个软件定时器线程,在线程上下文中执行。

定时器系统初始化

硬件定时器:

void rt_system_timer_init(void);


软件定时器:

void rt_system_timer_thread_init(void);

动态创建和删除

rt_timer_t rt_timer_create(const char* name,                     // 定时器名称
                           void (*timeout)(void* parameter),     // 定时器回调函数
                           void* parameter,                      // 传入定时器回调函数的参数
                           rt_tick_t time,                       // 定时时间
                           rt_uint8_t flag);                     // 定时器行为

flag:

  • RT_TIMER_FLAG_ONE_SHOT:单次

  • RT_TIMER_FLAG_PERIODIC:周期

  • RT_TIMER_FLAG_HARD_TIMER:硬件定时器

  • RT_TIMER_FLAG_SOFT_TIMER:软件定时器

rt_err_t rt_timer_delete(rt_timer_t 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_err_t rt_timer_start(rt_timer_t timer);

停止定时器:

rt_err_t rt_timer_stop(rt_timer_t timer);

控制定时器

rt_err_t rt_timer_control(rt_timer_t timer,   // 定时器
                          rt_uint8_t cmd,     // 控制命令
                          void* arg);         // 控制命令的参数

命令

说明

参数

RT_TIMER_CTRL_SET_TIME

设置定时器超时时间

RT_TIMER_CTRL_GET_TIME

获得定时器超时时间

RT_TIMER_CTRL_SET_ONESHOT

设置定时器为单次定时器

RT_TIMER_CTRL_SET_PERIODIC

设置定时器为周期型定时器