分析μC/OSII操作系统软件定时器的算法,以及影响定时器精度的抖动问题产生的原因;提出定时器管理任务处理器占用率的计算公式,并进行了实验测试。实验结果表明,μC/OSII软件定时器具有ms级的最小分辨时间单位,运行时间误差在μs级,处理器开销很小。
引言
μC/OSII操作系统是建立在微内核基础上的实时操作系统,抢占式多任务、微内核、移植性好等特点,使其在诸多领域都有较好的应用。
1 定时器实现架构
在μC/OSII操作系统内部,任务的延时功能及软件定时器功能,都需要底层有一个硬件的计数器支持。硬件计数器以固定的频率递减,计数到0 时,触发时钟中断。这个特定的周期性的中断称为“时钟节拍”。每当有时钟节拍到来时,系统在保存现场和中断嵌套计数加1后都会跳到时钟节拍函数 OSTimTick()中,进行软件计数器加1和遍历任务控制块,以判断任务延时是否到时。
μC/OSII中并未在OSTimTick()中进行定时器到时判断与处理,而是创建了一个高于应用程序中所有其他任务优先级的定时器管理任务 OSTmr_Task(),在这个任务中进行定时器的到时判断和处理。时钟节拍函数通过信 量给这个高优先级任务发信 。这种方法缩短了中断服务程序的执行时间,但也使得定时器到时处理函数的响应受到中断退出时恢复现场和任务切换的影响。
软件定时器功能实现代码存放在tmr.c文件中,移植时需只需在os_cfg.h.文件中使能定时器和设定定时器的相关参数。
2 μC/OSII的软件定时器算法分析
μC/OSII中软件定时器的实现方法是,将定时器按定时时间分组,使得每次时钟节拍到来时只对部分定时器进行比较操作,缩短了每次处理的时间。但这就需要动态地维护一个定时器组。定时器组的维护只是在每次定时器到时时才发生,而且定时器从组中移除和再插入操作不需要排序。这是一种比较高效的算法,减少了维护所需的操作时间。
2.1 定时器管理所需的数据结构
一旦定时器被建立,一个定时器控制块(OS_TMR)就被赋值了。定时器控制块是定时器管理的基本单元,包含定时器的名称、定时时间、在链表中的位置、使用状态、使用方式,以及到时回调函数及其参数等基本信息。
在μC/OSII软件定时器中实现了3类链表的维护:
OS_TMROSTmrTbl[OS_TMR_CFG_MAX];
OS_TMR*OSTmrFreeList;
OS_TMR_WHEELOSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE];
OSTmrTbl[OS_TMR_CFG_MAX]:以数组的形式静态分配定时器控制块所需的RAM空间,并存储所有已建立的定时器控制块。
OSTmrFreeList:为空闲定时器控制块链表头指针。空闲态的定时器控制块(OS_TMR)中,OSTmrnext和 OSTmrPrev两个指针分别指向空闲控制块的前一个和后一个,组织了空闲控制块双向链表。建立定时器时,从这个链表中搜索空闲定时器控制块。
OSTmrWheelTbl[OS_TMR_CFG_WHEEL_SIZE]:该数组的每个元素都是已开启定时器的一个分组,元素中记录了指向该分组中第一个定时器控制块的指针,以及定时器控制块的个数。运行态的定时器控制块(OS_TMR)中,OSTmrnext和OSTmrPrev两个指针同样也组织了所在分组中定时器控制块的双向链表。
定时器管理所需的数据结构示意图如图1所示。
图2 定时器管理任务流程
2.3 定时器移除和插入操作
定时器的到时处理函数返回后,都要进行该定时器控制块在链表中的移除和再插入操作。插入前需要重新计算定时器下次到时时所处的分组。计算公式如下:
定时器下次到时的OSTmrTime值=定时器定时值+当前OSTmrTime值
新的分组=定时器下次到时的OSTmrTime值%OS_TMR_CFG_WHEEL_SIZE
3 定时器精度与抖动
在μC/OSII操作系统中,与定时相关的功能均基于系统的时钟节拍。系统每秒的时钟节拍数决定了这个系统能分辨的最小时间,定时值只能为最小时间的倍数。每秒的时钟节拍数由os_cfg.h.文件中的宏OS_TICKS_PER_SEC定义。对于不同的应用,该时钟节拍一般在10~100 次/s的范围内选取。其对应的时钟中断的时间间隔为100~10 ms ,即时间的最小分辨单位为10 ms。处理器处理能力越高,每秒的时钟节拍数也相应地越大。下面的数据测试中使用了ARM9处理器。最低运行频率为250 Hz时,时钟节拍设为200 次/s,可进行正常的多任务调度。该测试环境下,最小分辨时间为5 ms。
抖动是指定时器回调函数开始执行的时间与规定的时间相比,或提前或推后的现象。在定时器中抖动总是存在的。下面主要分析2种抖动情况及其对定时精度的影响。第1种抖动情况如图3所示。
由测试数据可知,若有定时器到时,则经过几个μs的延时,定时器回调函数就可以执行。与ms级的定时最小分辨时间相比,其抖动对到时准确性的影响是非常小的。随着处理器频率的提升和处理能力的加强,这个抖动时间还可以进一步缩小。
第2种抖动情况如图4所示。
由测试数据可知建立定时器数为8时,处理器占用率远小于1%。每增加一个定时器,定时器管理任务的运行时间约增加6.5 μs,处理器的占用率约增加0.01%,任务的切换时间不变。这是在构建的极端情况下测试的,实际应用中的时间要小于这个值。
“定时器控制块移除与再插入时间”在400 MHz下测试为0.22 μs。某一时钟节拍处理时,若有定时器到时,则最坏情况是这个到时的定时器控制块在链表的最后,只有执行完整个链表的判断后才开始执行该到时定时器的回调函数。假设定时器数为8,且链表中最后一个定时器先到时,则该定时器到时的这个钟节拍下处理器利用率为:(0.34 μs+0.22 μs+0.82 μs+定时器回调函数执行时间)/5 ms=(1.38 μs+定时器回调函数执行时间)/5 ms。
结论
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览116047 人正在系统学习中 相关资源:Yalefree雅乐简谱打谱软件_打谱软件-WindowsServer工具类资源…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!