rtthread时钟管理

时钟节拍

系统处理和时间有关的事件,延时,时间片轮转调度。
可以根据宏定义#define RT_TICK_PER_SECOND 1000这里的时钟节拍设置为每秒1000次,也就是1ms
他是怎么实现时间设置的呢,通过系统滴答定时器(硬件定时器),设置为1ms触发一次,回调中断处理函数,
在这里插入图片描述
在这里插入图片描述
每次进入中断rt_tick自加,根据配置可得1ms进入一次,进行自加。

获取系统节拍

rt_tick_t rt_tick_get(void)

定时器

定时器有硬件定时器和软件定时器之分,
硬件定时器:芯片本身的功能,能接受输入,并且是中断触发方式。
软件定时器:系统接口,以时钟节拍的时间方式,能够提供不受数目限制的定时器服务。

定时器源码

定时器主要是 rt_system_timer_init();rt_system_timer_thread_init();这两个定时器函数,一个用来初始化定时器,一个用来是初始化线程。
在这里插入图片描述
首先介绍定时器初始化函数,该函数初始化了一个列表头
在这里插入图片描述
可以看出这个函数初始了一个循环列表
在这里插入图片描述
这个函数初始化了一个软件定时器列表rt_soft_timer_list,该列表也是一个循环列表。

定时器工作机制

在定时器模块中维护着两个重要的全局变量:
当前系统经过tick时间rt_tick;
系统新创建的定时器都会按照超时时间排序过程,插入到定时器链表rt_timer_list链表中
在这里插入图片描述
在当前系统中已经创建并且启动了三个定时器,分别是定时时间为50个tick的timer1、100个tick的timer2、500个tick的timer3,从小到大排序连接在rt_timer_list链表中. 当计数值超过时,触发相关的超时函数,并且将定时器从rt_timer_list链表中删除。

定时器相关接口

创建动态、静态定时器
脱离定时器
启动、停止定时器
控制定时器

rt_timer_t tm;
tm = rt_thread_create("th_demo", th1_enrty, NULL,1024, 20, 5);
rt_timer_start(tm);
struct rt_timer tm2;
rt_thread_init(&th2, "th2_demo", th2_entry, NULL, th2_stack, 512, 19, 5);
rt_timer_start(&tm2);
rt_timer_control(&tm2, RT_TIMER_CTRL_SET_TIME,(void *)&timeout );

扩展:获取时钟节拍并且打印出来

rt_kprintf("[%u]timer2 run\r\n",rt_tick_get());
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值