rt-thread的定时器管理源码分析
1 前言rt-thread可以采用软件定时器或硬件定时器来实现定时器管理的,所谓软件定时器是指由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。而硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。软件定时器的精度取决于它使用的硬件定时器精度。而rt-thread操作系统在默认情况下是采用的硬件定时器的方式,用户可以通过修改宏定义#ifdef RT_USING_TIMER_SOFT来修改采用哪种。2 rt-thread的定时器的基本工作原理在RT-Thread定时器模块维护两个重要的全局变量,一个是当前系统的时间rt_tick(当硬件定时器中断来临时,它将加1),另一个是定时器链表rt_timer_list,系统中新创建的定时期都会被以排序的方式插入到rt_timer_list(硬件定时器模式下使用)链表中,rt_timer_list的每个节点保留了一个定时器的信息,并且在这个节点加入链表时就计算好了产生时间到达时的时间点,即tick,在rt-thread系统中如果采用软件定时器模式,则存在一定时器线程rt_thread_timer_entry,不断获取当前TICK值并与定时器链表rt_timer_list上的定时器对比判断是否时间已到,一旦发现就调用对应的回调函数,即事件处理函数进行处理,而如果采用硬件定时器管理模式的话,则该检查过程放到系统时钟中断例程中进行处理,此时,是不存在定时器线程的。如下图:注:如果采用软件定时器软件定时器,则该定时器链表为rt_soft_timer_list。3 源码分析3.1 数据定义[cpp]/*** timer structure*/struct rt_timer{struct rt_object parent; //内核对象rt_list_t list; //链表节点void (*timeout_func)(void *parameter); //定时器超时例程void *parameter; //定时器例程的传入参数rt_tick_t init_tick; //定时器的超时时间,即总共多长时间将产生超时事件rt_tick_t timeout_tick; //定时器超时的时间点,即产生超时事件时那一该的时间点};typedef struct rt_timer *rt_timer_t;3.2 rt-thread的软件定时器模式软件定时器线程初始化及启动:[cpp]/*** @ingroup SystemInit** This function will initialize system timer thread*/void rt_system_timer_thread_init(void){#ifdef RT_USING_TIMER_SOFT//如果采用软件定时器管理模式,则启动定时器线程rt_list_init(&rt_soft_timer_list);//初始化软件定时器链表/* start software timer thread */rt_thread_init(&timer_thread,//初始化软件定时器线程,并启动"timer",rt_thread_timer_entry,RT_NULL,&timer_thread_stack[0],sizeof(timer_thread_stack),RT_TIMER_THREAD_PRIO,10);/* startup */rt_thread_startup(&timer_thread);#endif}软件定时器线程如下:[cpp]/* system timer thread entry */static void rt_thread_timer_entry(void *parameter){rt_tick_t next_timeout;while (1){/* get the next timeout tick */next_timeout = rt_timer_list_next_timeout(&rt_soft_timer_list);//得到软件定时器链表上的下一个定时器的超时时间点if (next_timeout == RT_TICK_MAX)//如果超过范围,则挂起当前线程,继续线程调度{/* no software timer exist, suspend self. */rt_thread_suspend(rt_thread_self());rt_schedule();}else{rt_tick_t current_tick;/* get current tick */current_tick = rt_tick_get();//获取当前时间点if ((next_timeout - current_tick) < RT_TICK_MAX/2)//离下个中断时间点还差些时候{/* get the delta timeout tick */next_timeout = next_timeout - current_tick;//计算还差多长时间rt_thread_delay(next_timeout);//休眠一段时间}}/* lock scheduler */rt_enter_critical();//时间到,进入临界区/* check software timer */rt_soft_timer_check();//检查是否该产生超时事件/* unlock scheduler */rt_exit_critical();//退出临界区}}检查是否产生中断函数rt_soft_timer_check函数如下定义:[cpp]/*** This function will check timer list, if a timeout event happens, the* corresponding timeout function will be invoked.*/void rt_soft_timer_check(void){rt_tick_t current_tick;rt_list_t *n;struct rt_timer *t;RT_DEBUG_LOG(RT_DEBUG_TIMER, ("software timer check enter\n"));current_tick = rt_tick_get();//得到当前时间点for (n = rt_soft_timer_list.next; n != &(rt_soft_timer_list);)//得到下一定时器节点{t = rt_list_entry(n, struct rt_timer, list);//t指补充:软件开发 , C++ ,
上一个:hdu 称乒乓球
下一个:c_c++控制台程序字符输入总结
- 更多C/C++疑问解答:
- 关于c++的cout输出的问题。
- 在学校里学过C和C++,不过学的很一般,现在自学C#,会不会很难?
- 全国计算机二级C语言笔试题
- 已知某树有2个2度结点,3个3度结点,4个4度结点,问有几个叶子结点?
- c++数据结构内部排序问题,整数排序
- 2012九月计算机二级C语言全国题库,,急求急求
- 如果assert只有一个字符串作为参数,是什么意思呢?
- C语言中,哪些运算符具有左结合性,哪些具有右结合性,帮忙总结下,谢谢了!
- 为什么用结构体编写的程序输入是,0输不出来啊~~~
- 将IEEE—754的十六进制转化为十进制浮点类型,用C或C++都行,多谢各位大侠啊,非常感谢!
- 为什么这个程序求不出公式?
- 这个链表倒置的算法请大家分析下
- c语言函数库调用
- C语言unsigned int纠错
- C语言快排求解啊