c语言定时器原理,软件定时器实现原理、测试及应用设计

分析μC/OSII操作系统软件定时器的算法,以及影响定时器精度的抖动问题产生的原因;提出定时器管理任务处理器占用率的计算公式,并进行了实验测试。实验结果表明,μC/OSII软件定时器具有ms级的最小分辨时间单位,运行时间误差在μs级,处理器开销很小。

引言

μC/OSII操作系统是建立在微内核基础上的实时操作系统,抢占式多任务、微内核、移植性好等特点,使其在诸多领域都有较好的应用。

在μC/OSII 2.83及其以后的版本中,一个较大的变化就是增加了对软件定时器的支持。这使得μC/OS实时操作系统的功能更加完善,在其上的应用程序开发与移植也更加方便。在实时操作系统中一个好的软件定时器实现要求有较高的精度、较小的处理器开销,且占用较少的存储器资源。本文在对μ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];

你可能感兴趣的:(c语言定时器原理)