打印

μC/OS-II 软件定时器的分析与测试

[复制链接]
875|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
μC/OS-II 操作系统是建立在微内核基础上的实时操作系统,抢占式多任务、微内核、移植性好等特点,使其在诸多领域都有较好的应用。在 μC/OS-II 2. 83 及其以后的版本中,一个较大的变化就是增加了对软件定时器的支持。这使得 μC/OS 实时操作系统的功能更加完善,在其上的应用程序开发与移植也更加方便。在实时操作系统中一个好的软件定时器实现要求有较高的精度、较小的处理器开销,且占用较少的存储器资源。本文在对 μC/OS-II 定时器算法分析的基础上,对定时精度和处理器占用情况进行了分析与测试,其结果在实时系统的设计与应用中具有借鉴意义。
沙发
zhengbo7hui|  楼主 | 2015-8-26 09:14 | 只看该作者
定时器实现架构
在 μC/OS-II 操作系统内部,任务的延时功能及软件定时器功能,都需要底层有一个硬件的计数器支持。硬件计数器以固定的频率递减,计数到 0 时,触发时钟中断。这个特定的周期性的中断称为“时钟节拍”。每当有时钟节拍到来时,系统在保存现场和中断嵌套计数加1 后都会跳到时钟节拍函数 OSTimTic()中,进行软件计数器加 1 和遍历任务控制块,以判断任务延时是否到时。

使用特权

评论回复
板凳
上山砍老虎| | 2015-8-26 09:17 | 只看该作者
μC/OS-II 中并未在 OSTim Tick()中进行定时器到时判断与处理,而是创建了一个高于应用程序中所有其他任务优先级的定时器管理任务 OSTmr_Task(),在这个任务中进行定时器的到时判断和处理。时钟节拍函数通过信号量给这个高优先级任务发信号。这种方法缩短了中断服务程序的执行时间,但也使得定时器到时处理函数的响应受到中断退出时恢复现场和任务切换的影响。软件定时器功能实现代码存放在 tmr. c 文件中,移植时需只需在 os_cfg. h文件中使能定时器和设定定时器的相关参数。

使用特权

评论回复
地板
历史暴君| | 2015-8-26 09:26 | 只看该作者
定时器管理所需的数据结构
一旦定时器被建立,一个定时器控制块(OS_TMR)就被赋值了。定时器控制块是定时器管理的基本单元,包含定时器的名称、定时时间、在链表中的位置、使用状态、使用方式,以及到时回调函数及其参数等基本信息。
在 μC/OS-II 软件定时器中实现了 3 类链表的维护:

使用特权

评论回复
5
历史暴君| | 2015-8-26 09:26 | 只看该作者
OSTmrTbl[OS_TMR_CFG_MAX]:以数组的形式静态分配定时器控制块所需的 RAM 空间,并存储所有已建立的定时器控制块。
OSTmrFreeLiSt:为空闲定时器控制块链表头指针。空闲态的定时器控制块(OS_TMR)中, OSTmrnext 和 OSTmrPrev 两个指针分别指向空闲控制块的前一个和后一个,组织了空闲控制块双向链表。建立定时器时,从这个链表中搜索空闲定时器控制块。

使用特权

评论回复
6
历史暴君| | 2015-8-26 09:27 | 只看该作者
OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]:该数组的每个元素都是已开启定时器的一个分组,元素中记录了指向该分组中第一个定时器控制块的指针,以及定时器控制块的个数。运行态的定时器控制块(OS_TMR)中, OSTmrnext 和 OSTmrPrev 两个指针同样也组织了所在分组中定时器控制块的双向链表。定时器管理所需的数据结构示意图如图 1 所示。

使用特权

评论回复
7
zheng522| | 2015-8-26 10:36 | 只看该作者
图 数据结构

QQ截图20150826103604.jpg (161.62 KB )

QQ截图20150826103604.jpg

使用特权

评论回复
8
zheng522| | 2015-8-26 10:36 | 只看该作者
宏 OS_TMR_CFG_WHEEL_SIZE 定义了 OSTmr-WheelTbl[]数组的大小,同时这个值也是定时器分组的依据。按照定时器到时值与 OS_TMR_CFG_WHEEL_SIZE 相除的余数进行分组:不同余数的定时器放在不同分组中;相同余数的定时器处在同一组中,由双向链表连接。这样,余数值为 0~OS_TMR_CFG_WHEEL_SIZE-1 的不同定时器控制块,正好分别对应了数组元素 OSTmr-WheelTbl[0]~ OSTmrWheelTbl[OS_TMR_CFGWHEEL_SIZE-1]的不同分组。每次时钟节拍到来时,时钟数 OSTmrTime 值加 1,然后也进行求余操作,只有余数相同的那组定时器才有可能到时,所以只对该组定时器进行判断。这种方法比循环判断所有定时器更高效。随着时钟数的累加,处理的分组也由 0~OS_TMR_CFG_WHE EL_SIZE-1循环。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

502

帖子

1

粉丝