RT-Thread入门(三) 定时器

RT-Thread入门之定时器

        上一篇文章我们学习了RT-Thread建立线程相关函数,这次我们将学习系统中一个很重要的功能:定时器。系统提供的软件定时器可以为我们提供无限个定时器使用,但定时时间必须是系统节拍的整数倍。RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_PER_SECOND 的定义来调整,我们使用的工程设置的为100,这里我们就使用他的默认设置,所以我们可以设置的定时时间只能为10ms的整数倍。

一、HARD/SOFT_TIMER区别

        HARD_TIMER 模式的定时器超时函数在中断上下文环境中执行,在中断上下文环境中执行时,对于超时函数的要求与中断服务例程的要求相同:执行时间应该尽量短,
执行时不应导致当前上下文挂起、等待。
        SOFT_TIMER 模 式 可 配 置, 通 过 宏 定 义RT_USING_TIMER_SOFT 来 决 定 是 否 启 用 该 模式,该宏定义在rtconfigs.h中定义,默认为不使用。该模式被启用后,系统会在初始化时创建一个 timer 线程,然后SOFT_TIMER 模式的定时器超时函数在都会在 timer 线程的上下文环境中执行。
       总结起来就是:hard_timer中断服务程序不能被打断,soft_timer中断服务程序和线程一样参与任务的调度。
       除此之外,定时器也有两种创建方式:动态方式和静态方式。额我认为大多数时间使用动态方式就可以了,他们的区别和进程类似,代码空间的分配方式不同,这篇文章主要使用动态方式进行实验。

二、相关函数介绍

1.rt_timer_create 通过这个函数可以设置定时器的定时时间,超时函数入口和定时器模式等一些参数。

rt_timer_t rt_timer_create(const char* name,
							void (*timeout)(void* parameter),
							void* parameter,
							rt_tick_t time,
							rt_uint8_t flag);

2.rt_timer_start 设置完成定时器的参数之后定时器不会立即启动,只有调用rt_timer_start函数之后定时器才开始计时。

rt_err_t rt_timer_start(rt_timer_t timer);

3.rt_timer_stop 启动定时器以后,若想使它停止,可以使用下面的函数接口:

rt_err_t rt_timer_stop(rt_timer_t timer
  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
好的,我会尽力回答你的问题。首先,RT-Thread是一个实时操作系统,它提供了一些基本的实时操作系统功能,例如线程、信号量、消息队列、定时器等。其中,定时器是一种非常重要的实时操作系统功能,它可以用来在指定的时间间隔内执行一些操作。 在RT-Thread中,定时器的实现是基于软件定时器,即在内核中维护一个定时器列表,每个定时器都有一个超时时间。当定时器到期时,内核会调用定时器回调函数来执行相应的操作。 下面是RT-Thread定时器的源码分析: 1. 定时器结构体 在RT-Thread中,定时器的结构体定义如下: ```c struct rt_timer { char name[RT_NAME_MAX]; /* 定时器名称 */ rt_list_t list; /* 定时器列表 */ rt_tick_t timeout_tick; /* 定时器超时时间 */ rt_tick_t init_tick; /* 定时器初始时间 */ rt_uint8_t flag; /* 定时器标志 */ rt_uint8_t state; /* 定时器状态 */ void (*timeout_func)(void* parameter); /* 定时器回调函数 */ void* parameter; /* 回调函数参数 */ }; ``` 可以看到,定时器结构体包含了定时器的名称、超时时间、标志、状态、回调函数等信息。 2. 定时器创建 在RT-Thread中,定时器的创建函数是rt_timer_create(),它的函数原型如下: ```c rt_err_t rt_timer_create(rt_timer_t *timer, const char *name, void (*timeout_func)(void* parameter), void* parameter, rt_tick_t time, rt_uint8_t flag); ``` 其中,timer表示定时器指针,name表示定时器名称,timeout_func表示定时器回调函数,parameter表示回调函数参数,time表示定时器超时时间,flag表示定时器标志。 rt_timer_create()函数会在内核中创建一个定时器,并将定时器添加到定时器列表中。如果创建成功,函数返回RT_EOK,否则返回错误码。 3. 定时器启动 在RT-Thread中,定时器的启动函数是rt_timer_start(),它的函数原型如下: ```c rt_err_t rt_timer_start(rt_timer_t timer); ``` rt_timer_start()函数会启动指定的定时器,并将其状态设置为RT_TIMER_FLAG_ACTIVATED。如果启动成功,函数返回RT_EOK,否则返回错误码。 4. 定时器停止 在RT-Thread中,定时器的停止函数是rt_timer_stop(),它的函数原型如下: ```c rt_err_t rt_timer_stop(rt_timer_t timer); ``` rt_timer_stop()函数会停止指定的定时器,并将其状态设置为RT_TIMER_FLAG_DEACTIVATED。如果停止成功,函数返回RT_EOK,否则返回错误码。 5. 定时器删除 在RT-Thread中,定时器的删除函数是rt_timer_delete(),它的函数原型如下: ```c rt_err_t rt_timer_delete(rt_timer_t timer); ``` rt_timer_delete()函数会删除指定的定时器,并释放相应的资源。如果删除成功,函数返回RT_EOK,否则返回错误码。 以上就是RT-Thread定时器的源码分析,希望能对你有所帮助。如果你有其他问题,可以继续问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值