时钟节拍
系统处理和时间有关的事件,延时,时间片轮转调度。
可以根据宏定义#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());