EDN China > 技术文章 > 测试与测量 > 系统测试 > 正文
? 2016博客大赛-不限主题,寻找电子导师,大奖升级??

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

单片机与嵌入式系统 张冬 钱丽丽 周翔武?? 2010年01月05日 ?? 收藏0

?  信号量唤醒定时器管理任务,计算出当前所要处理的分组后,程序遍历该分组中的所有控制块,将当前OSTmr-Time值与定时器控制块中的到时值相比较。若相等(即到时),则调用该定时器到时回调函数;若不相等,则判断该组中下一个定时器控制块。如此操作,直到该分组链表的结尾。定时器管理任务的流程如图 2所示。OS_TMR_CFG_WHEEL_SIZE的取值推荐为2的N次方,以便采用移位操作计算余数,缩短处理时间。

定时器管理任务的流程

  2.3 定时器移除和插入操作

  定时器的到时处理函数返回后,都要进行该定时器控制块在链表中的移除和再插入操作。插入前需要重新计算定时器下次到时时所处的分组。计算公式如下:

  定时器下次到时的OSTmrTime值=定时器定时值+当前OSTmrTime值

  新的分组=定时器下次到时的OSTmrTime值%OS_TMR_CFG_WHEEL_SIZE

  3 定时器精度与抖动

  在μC/OS-II操作系统中,与定时相关的功能均基于系统的时钟节拍。系统每秒的时钟节拍数决定了这个系统能分辨的最小时间,定时值只能为最小时间的倍数。每秒的时钟节拍数由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所示。

第1种抖动情况

  T1:CPU响应时钟中断,搜索中断号,保存中断现场并跳到时钟中断处理程序OSTimTick的时间。

  T2:OSTimTick()函数的执行时间。该函数中对任务延时是否到期进行了判断。

  T3:恢复现场,退出中断并进行任务上下文切换的时间。

  T4:定时器管理任务OSTmr_Task()判断定时器是否到时的时间。

  T4之后:定时器到时回调函数开始执行。

  在CPU运行频率固定的情况下T1和T3的执行时间是相对固定的,而且一般为汇编语言实现,运行速度也较快。而T2和T4的时间会随着任务和软件定时器数量的增多有所增加。测试时定时器定时值随机选取。表1中的时间为不同处理器频率下,定时器个数为1和5时观测到的最大值。其中,T=T1+T2+T3+T4。

定时器个数为1和5时观测到的最大值

  由测试数据可知,若有定时器到时,则经过几个μs的延时,定时器回调函数就可以执行。与ms级的定时最小分辨时间相比,其抖动对到时准确性的影响是非常小的。随着处理器频率的提升和处理能力的加强,这个抖动时间还可以进一步缩小。第2种抖动情况如图4所示。

第2种抖动情况

  当下一个时钟节拍快到来时(如图4中A时刻),一个定时器被开启了。因为系统能分辨的最小时间即时钟节拍的间隔时间,所以定时器开启时记录的当前时钟节拍数为1,假设定时器的定时值就是一个时钟节拍间隔。定时器开启后,第2个时钟节拍马上就到了,由情况1的分析可知,这个定时器的回调函数很快就会被执行。 B时刻表示这个定时器回调函数第一次执行。C、D时刻为回调函数的第2次与第3次执行时刻,这两次到时是比较准确的。

  因此,定时器从开启到回调函数开始执行的时间与定时值相比是有较大抖动的。若此时的时钟节拍间隔为5 ms,则这个抖动的误差最大即5 ms。这种情况下的抖动只能通过提高每秒的时钟节拍数来减小。因此,在数据采集或其他定时器的应用中,要留意定时器开启后第一次到时的处理,以免进行错误的判断。

  4 定时器管理任务对操作系统性能的影响

  定时器管理任务的运行使应用程序可建立的任务数减1。该任务要求是系统中的最高优先级,因此每次有时钟中断发生它都要运行,必然会消耗掉一定的CPU资源。软件定时器功能所占用的CPU运行时间(设为M)的计数公式为:

  M=定时器管理任务判断定时器是否到时的时间+定时器回调函数执行时间+定时器控制块移除与再插入时间+切换到次低优先级任务的时间

  首先,采用μC/OS-II中自带的统计任务测试定时器管理任务对CPU资源的占用情况。测试时系统中开启3个任务:定时器管理任务、统计任务和Idle 任务。定时器到时回调函数在定时器管理任务中执行,增加了管理任务运行时间。为仅测试系统定时器管理功能的开销,测试时将定时回调函数置为空操作。因统计任务要求必须在初始化时建立第一个也是唯一的一个任务中调用统计任务初始化函数OSStatInit(),所以需在定时器管理任务中进行必要改动,以保证在统计任务初始化后才开启定时器的管理功能。测试用定时器在main函数中静态创建。


?? ?? ??


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

1.扫描左侧二维码
2.点击右上角的分享按钮
3.选择分享给朋友
?? ??

软件定时器? 操作系统? 处理器?

相关文章

我来评论
美国的游客
美国的游客 ??? (您将以游客身份发表,请登录 | 注册)
?
有问题请反馈