[嵌入式系统-21]:RT-Thread -7- 内核组件编程接口 - 定时器

目录

一、RT-Thread定时器

1.1 概述

1.2 定时器的种类

1.2.1 周期性

1.2.2 实时性

1.2.3 功能

二、 RT-Thread 定时器的一般步骤

2.1 步骤

2.2 Flag

2.3 示例


一、RT-Thread定时器

1.1 概述

在 RT-Thread 中,定时器是一种常用的机制,用于在指定的时间间隔内执行回调函数或发送消息

1.2 定时器的种类

在 RT-Thread 中,有多种类型的定时器可供使用。下面是几种常见的 RT-Thread 定时器类型:

1.2.1 周期性

  1. 周期性定时器(Periodic Timer):周期性定时器是一种重复触发的定时器,在每次超时后自动重新启动,并按照指定的时间间隔周期性地触发回调函数

  2. 单次定时器(One-shot Timer):单次定时器只在超时后触发一次回调函数,不会自动重启。

1.2.2 实时性

  1. 软件定时器(Software Timer):软件定时器是由软件实现的定时器,可以在任意时刻激活和停止。它通常使用计数器的方式来进行定时,并通过循环判断计数器值是否超过设定的阈值来进行超时判断。

  2. 硬件定时器(Hardware Timer):硬件定时器是通过硬件设备实现的定时器,使用硬件内部的计数器和触发机制来进行定时。硬件定时器通常具有更高的准确性和稳定性,并可以在后台运行,不受 CPU 负载的影响。

1.2.3 功能

  1. 通用定时器:实现通用功能的定时器。

  2. 软件看门狗定时器(Software Watchdog Timer):软件看门狗定时器用于监控系统的运行情况,确保系统在规定的时间内响应并进行相应操作。当系统未能在规定时间内重置看门狗定时器时,系统将被认为发生故障,并执行相应的错误处理操作。

具体选择何种类型的定时器取决于你的应用需求。对于较简单的定时任务,可以选择周期性定时器或单次定时器;对于需要更高精度和稳定性的定时要求,可以考虑使用硬件定时器。软件定时器适用于需要灵活控制的定时任务,而软件看门狗定时器则适用于系统监控和应对错误的场景。

需要根据实际需求来选择合适的定时器类型,并结合 RT-Thread 提供的接口进行配置和使用。

二、 RT-Thread 定时器的一般步骤

2.1 步骤

RT-Thread 提供了丰富的定时器接口,使得用户可以方便地管理和使用定时器。

以下是使用 RT-Thread 定时器的一般步骤:

  1. 定义回调函数:首先,你需要定义一个函数作为定时器的回调函数,该函数将在定时器超时时执行。回调函数可以完成你想要的特定任务。

  2. 创建定时器:使用 rt_timer_create 函数来创建一个新的定时器对象。需要指定定时器的回调函数、超时时间和定时器的自动重启模式。

    rt_err_t rt_timer_create(rt_timer_t timer, const char* name, rt_timer_cb_t timeout,
                             void* parameter, rt_tick_t time, rt_uint8_t flag);
    
    • timer:指向定时器对象的指针。
    • name:定时器的名称,是一个字符串。
    • timeout:定时器超时时调用的回调函数。
    • parameter传递给回调函数的参数。
    • time:定时器的超时时间,以 tick 为单位。
    • flag:定时器的属性标志,用于控制定时器的行为。
  3. 启动和停止定时器:可以使用 rt_timer_start 函数启动定时器,使其开始计时并在超时时触发回调函数;使用 rt_timer_stop 函数停止(暂停)定时器,停止后的定时器永远不会超时,也不会调用回调函数了。

    rt_err_t rt_timer_start(rt_timer_t timer);
    rt_err_t rt_timer_stop(rt_timer_t timer);
    
  4. 修改定时器超时时间:如果需要修改定时器的超时时间,可以使用 rt_timer_control 函数。

    rt_err_t rt_timer_control(rt_timer_t timer, int cmd, void* arg);
    
    • cmd:控制命令,可以使用 RT_TIMER_CTRL_SET_TIME 命令来设置定时器的超时时间。
    • arg:参数,用于传递新的超时时间值。
  5. 销毁定时器:在不再需要定时器时,使用 rt_timer_delete 函数释放定时器。

    rt_err_t rt_timer_delete(rt_timer_t timer);
    

2.2 Flag

RT_TIMER_FLAG_PERIODIC 是实时操作系统 (RTOS) 中用于定时器的一种标志位,表示定时器是周期性的,即会重复触发。

除了 RT_TIMER_FLAG_PERIODIC,还有一些其他与之对应的定时器标志位,包括但不限于:

  1. RT_TIMER_FLAG_SOFT_TIMER:软件定时器,表示定时器由软件或操作系统内部触发,而不是由硬件触发。这种定时器通常用于实现延时、定时任务等功能。

  2. RT_TIMER_FLAG_HARD_TIMER:硬件定时器,表示定时器由硬件设备触发。硬件定时器通常由处理器或计时器芯片提供,可以用于实现精确的时间控制。

  3. RT_TIMER_FLAG_PERIODIC:周期性定时器

  4. RT_TIMER_FLAG_ONE_SHOT:一次性定时器,表示定时器只会触发一次,不会重复执行。一次性定时器在到达设定的时间后触发,然后停止计时。

  5. RT_TIMER_FLAG_AUTO_ACTIVATE:自动激活定时器,表示定时器在创建后立即激活,无需要单独Start,开始计时。通常用于需要立即开始定时操作的场景。

  6. RT_TIMER_FLAG_POWER_PIN:电源引脚定时器,表示定时器与设备的电源引脚相关联。这种定时器可用于在设定的时间内控制设备的电源状态。

        这些定时器标志位可以根据具体的需求和应用场景选择使用,以实现所需的定时功能和控制。具体使用哪些标志位取决于实时操作系统或开发平台的支持和定义。

2.3 示例

下面是一个示例,展示了如何使用 RT-Thread 定时器:

#include <rtthread.h>

static void timer_timeout(void* parameter)
{
    rt_kprintf("Timer timeout.\n");
}

int main(void)
{
    rt_timer_t my_timer;

    my_timer = rt_timer_create("my_timer", timer_timeout, RT_NULL, 1000, RT_TIMER_FLAG_PERIODIC);
    
    if (my_timer != RT_NULL)
    {
        rt_timer_start(my_timer);
    }

    /* 其他代码... */

    return 0;
}

在上述示例中,我们定义了一个名为 timer_timeout 的回调函数,在定时器超时时被调用。然后,我们使用 rt_timer_create 函数创建了一个名为 “my_timer” 的定时器对象,并设置超时时间为 1000 个 tick,标志为周期性定时器。最后,我们使用 rt_timer_start 函数启动定时器。

需要注意定时器的回调函数应尽量保持简洁和高效,避免长时间的阻塞操作,以确保定时器的准确性和及时性。并且,在不再需要使用定时器时,应通过调用 rt_timer_delete 函数销毁定时器,以释放相关资源。

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值