rtthread系统 - 普中stm32开发板 - rtthread内核资源 - 定时器

7 篇文章 2 订阅
7 篇文章 0 订阅

介绍

在操作系统中,通常软件定时器以系统节拍(tick)为单位。比如节拍为10ms,那就只能定时10ms的倍数,如10、20、30,像5、15这些就不行。当定时到了,也也叫超时了,就会执行设定好的回调函数(就比拟是硬件定时器中的中断服务函数)。

定时器创建和删除

函数原型

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

这里重点是创建定时器的“flag”,include/rtdef.h中定义了一些定时器相关的宏,如下。

#define RT_TIMER_FLAG_DEACTIVATED 0x0 /* 定时器为非激活态*/
#define RT_TIMER_FLAG_ACTIVATED 0x1 /* 定时器为激活状态*/
#define RT_TIMER_FLAG_ONE_SHOT 0x0 /* 单次定时*/
#define RT_TIMER_FLAG_PERIODIC 0x2 /* 周期定时*/
#define RT_TIMER_FLAG_HARD_TIMER 0x0 /* 硬件定时器*/
#define RT_TIMER_FLAG_SOFT_TIMER 0x4 /* 软件定时器*/

测试

timer1 = rt_timer_create("timer1", timer_callback, (void *)1, 1000, RT_TIMER_FLAG_PERIODIC);
timer2 = rt_timer_create("timer2", timer_callback, (void *)2, 1000, RT_TIMER_FLAG_ONE_SHOT);
rt_thread_mdelay(8000);
rt_timer_delete(timer1);
rt_timer_delete(timer2);

创建之后,通过msh指令

list_timer

能查看到定时器确实已经创建了,随后也删除了。
在这里插入图片描述

定时器初始化和脱离

前面的创建和删除都是动态的,定时器也很类似线程那样,也支持静态的添加和脱离。
函数原型

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

测试

struct rt_timer timer3;
rt_timer_init(&timer3, "timer3", timer_callback, (void *)3, 1000, RT_TIMER_FLAG_PERIODIC);
rt_thread_mdelay(8000);
rt_timer_detach(&timer3);

定时器启动和停止

虽然前面已经创建了定时,通过命令也能查到定时器的存在,但是,定时器并不会运行。完成创建之后,还需要启动定时器,定时器才会开始运行。
函数原型

rt_err_t rt_timer_start(rt_timer_t timer)
rt_err_t rt_timer_stop(rt_timer_t timer)

回调函数

void timer_callback(void* parameter)
{
    rt_uint32_t t_no = (rt_uint32_t)parameter;

    rt_kprintf("timer%d callback\r\n", t_no);
}

测试代码

rt_timer_t timer1;
    rt_timer_t timer2;
    struct rt_timer timer3;

    rt_kprintf("create entry!\r\n");

    timer1 = rt_timer_create("timer1", timer_callback, (void *)1, 1000, RT_TIMER_FLAG_PERIODIC);
    if (timer1 != RT_NULL)
    {
        rt_timer_start(timer1);
    }

    timer2 = rt_timer_create("timer2", timer_callback, (void *)2, 1000, RT_TIMER_FLAG_ONE_SHOT);
    if (timer2 != RT_NULL)
    {
        rt_timer_start(timer2);
    }

    rt_timer_init(&timer3, "timer3", timer_callback, (void *)3, 1000, RT_TIMER_FLAG_PERIODIC);
    rt_timer_start(&timer3);

    rt_thread_mdelay(8000);

    rt_timer_delete(timer1);
    rt_timer_stop(timer2);
    rt_timer_detach(&timer3);

测试结果
在这里插入图片描述

定时器控制

RT_thread也额外提供了定时器控制函数接口,以获取或设置更多定时器的信息。
函数原型

rt_err_t rt_timer_control(rt_timer_t timer, rt_uint8_t cmd, void* arg);

其中“cmd”有如下选择

#define RT_TIMER_CTRL_SET_TIME 0x0 /* 设置定时器超时时间*/
#define RT_TIMER_CTRL_GET_TIME 0x1 /* 获得定时器超时时间*/
#define RT_TIMER_CTRL_SET_ONESHOT 0x2 /* 设置定时器为单一超时型*/
#define RT_TIMER_CTRL_SET_PERIODIC 0x3 /* 设置定时器为周期型定时器*/

arg”与command相对应的控制命令参数。

结尾

rtthread学习中,打开主页查看更多笔记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值