RT-Thread论坛
直播中

刘英

8年用户 1180经验值
私信 关注
[问答]

RT_USING_TIMER_SOFT宏定义是否一定要开启?

在文档中心,介绍定时器中,介绍可以在建立定时器时通过 Flag:RT_tiMER_FLAG_SOFT_TIMER 来建立一个 软件定时器。

在Studio的Setting中,又有一个使能软件定时器的宏定义 :RT_USING_TIMER_SOFT

请问:如果没有使能软件定时器的宏定义,只在创建定时器时,通过RT_TIMER_FLAG_SOFT_TIMER是否可以创建一个软件定时器。


回帖(1)

陈超

2025-10-13 18:08:51

在 RT-Thread 中,必须开启 RT_USING_TIMER_SOFT 宏定义,才能成功创建和使用软件定时器。仅在创建定时器时传入 RT_TIMER_FLAG_SOFT_TIMER 标志是不够的,如果宏定义未开启,该标志会被忽略或导致创建失败/创建的是错误的定时器类型。


原因分析:



  1. 功能开关: RT_USING_TIMER_SOFT 是一个配置开关。它决定了:

    • 软件定时器相关的代码(数据结构、线程创建、处理逻辑等)是否会被编译进 RT-Thread 内核。

    • 系统是否会创建专用的 timer 软件定时器线程(优先级默认为 RT_TIMER_THREAD_PRIO)。这个线程是执行所有软件定时器超时函数的上下文。


  2. 标志依赖: RT_TIMER_FLAG_SOFT_TIMER 标志是一个运行时参数,它告诉 rt_timer_create 函数:“请尝试创建一个软件定时器”。

  3. 依赖关系: 运行时标志 RT_TIMER_FLAG_SOFT_TIMER有效性和功能实现依赖于 RT_USING_TIMER_SOFT 这个配置开关。如果开关没有打开:

    • 内核中根本不存在处理软件定时器的线程和逻辑。

    • 即使你在创建时传递了 RT_TIMER_FLAG_SOFT_TIMER 标志,内核代码(在 rt_timer_create 内部)会发现软件定时器功能未启用。

    • 结果通常是:

      • 忽略标志: 最常见的情况是,内核会忽略 RT_TIMER_FLAG_SOFT_TIMER 标志,转而创建一个硬件定时器(相当于你只传入了 RT_TIMER_FLAG_PERIODICRT_TIMER_FLAG_ONE_SHOT)。

      • 创建失败: 在某些严格实现的版本中,传递未启用的功能标志可能会导致创建失败并返回错误(例如 -RT_ERRORRT_NULL),但这在标准 RT-Thread 中比较少见,通常采用忽略标志的方式。




查看源码确认(以常见实现为例):


rt_timer_create 函数(通常位于 src/timer.c)中,你会看到类似逻辑:


rt_timer_t rt_timer_create(...)
{
    ...

#ifdef RT_USING_TIMER_SOFT
    if (flag & RT_TIMER_FLAG_SOFT_TIMER)
    {
        // 软件定时器创建逻辑:关联到软件定时器列表,依赖 timer 线程
        ...
    }
    else
#endif
    {
        // 硬件定时器创建逻辑:关联到硬件定时器列表
        ...
    }

    ...
}

结论:



  • RT_USING_TIMER_SOFT 宏是启用软件定时器功能的必要条件。 它编译了软件定时器所需的底层支持(线程、处理逻辑)。

  • RT_TIMER_FLAG_SOFT_TIMER 标志是创建软件定时器的充分条件(但仅在 RT_USING_TIMER_SOFT 已开启的前提下)。 它告诉创建函数你想要哪种类型的定时器。

  • 如果 RT_USING_TIMER_SOFT 未开启:

    • 传递 RT_TIMER_FLAG_SOFT_TIMER 不会创建一个真正的软件定时器。

    • 结果通常是创建了一个硬件定时器(其超时函数将在中断上下文执行),或者(较少见)创建失败。

    • 软件定时器线程 (timer) 不会被创建。



因此,要正确使用软件定时器,你必须:



  1. 在 RT-Thread 的配置中(通过 rtconfig.h, RT-Thread Studio 的 GUI 配置工具 Setting -> RT-Thread Kernel -> Kernel Device Object -> Enable software timers启用 RT_USING_TIMER_SOFT

  2. 在调用 rt_timer_create 函数时,传入 RT_TIMER_FLAG_SOFT_TIMER 标志(通常结合 RT_TIMER_FLAG_PERIODICRT_TIMER_FLAG_ONE_SHOT)。


两者缺一不可。开启宏定义是基础,传递标志是指定本次创建的类型。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分