一种高效软件定时器的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一种高效软件定时器的设计与实现
秦玉蒙;王娅男;邱春玲
【摘要】为了满足单片机开发系统中对软件定时器的需求,设计并实现了一种高效软件定时器.该软件定时器以单个硬件定时器为基础实现了多个软件定时器,可作为
一个模块嵌入到软件中;叙述了软件定时器的设计思想和实现方法.实验测试和应用
实例表明,该软件定时器定时误差可控,算法高效,且满足单片机开发系统对软件定时器的应用需求.
【期刊名称】《实验室研究与探索》
【年(卷),期】2015(034)009
【总页数】5页(P94-97,106)
【关键词】单片机;时钟节拍;软件定时器
【作者】秦玉蒙;王娅男;邱春玲
【作者单位】吉林大学仪器科学与电气工程学院,吉林长春130026;吉林大学仪器
科学与电气工程学院,吉林长春130026;吉林大学仪器科学与电气工程学院,吉林长
春130026
【正文语种】中文
【中图分类】TP311.1;TP368.1
0 引言
在单片机开发系统中,经常用到定时控制,比如延迟控制、超时控制和计时控制等。

尤其是多任务处理中,对定时的需求很大。

为了获得所需要的定时,需求准确而稳定的时间基准,产生这种时间准确通常有两种方法:硬件定时器和软件定时器。

单片机都含有硬件定时器,它通过对时钟脉冲的计数实现定时,定时准确,使用方便,但是单片机内部的硬件定时器数量有限,软件定时器应运而生,它以硬件定时器的定时中断为基础,利用软件方法来实现,定时更长,使用更灵活。

在应用单片机进行多任务系统开发时,定时器工作方式复杂,受限于单片机内部资源数量,实时操作系统中的软件定时器无法直接套用;多人开发时,代码风格因人
而异,定时器的管理无法统一,给多人协作开发和后期维护带来了不便。

因此,设计并实现一种软件定时器,在单个硬件定时器上实现了多个软件定时器,代码经过封装标准化,并根据单片机的特性进行了优化,可作为一个独立模块嵌入到单片机软件系统中;所有代码都符合ANSI-C 标准,易读易用,在多任务系统开发中可以
大大简化软件设计复杂性,方便多人协作开发和后期维护。

1 高效软件定时器的设计
在实时操作系统中,硬件定时器以固定的频率运行,形成周期性的中断,称之为“时钟节拍”[1-7]。

本软件定时器以时钟节拍为定时基准源,通过软件计数的方式实现对时钟节拍的累计,当达到预设值时,执行预设任务。

本软件定时器模块由函数、数据结构和宏组成,可作为一个独立模块嵌入到单片机软件架构中,如图1所示。

硬件定时器驱动层为软件定时器提供稳定的时钟节拍,驱动处理算法有序运行。

由于单片机的RAM容量有限,动态链表作数据结构显然很不适合,选用数组、辅助变量和宏定义配合的方式作为数据结构,既满足了软件定时器数量可控,又满足了动态使用需求。

接口函数统一管理所有软件定时器,方便使用。

此外,考虑到数据临界态和用户输入的不确定性,添加了加锁保护和输入校验,提高了软件的鲁棒性[8-10]。

图1 软件定时器模块架构
2 高效软件定时器的实现
2.1 高效软件定时器的数据结构
由于软件定时器数量较多,所以为软件定时器设计了一个核心数据结构SoftwareTimer,其定义如下:
每个SoftwareTimer 结构的实例定义了一个软件定时器。

其中:Count 用于设置时钟节拍计数值;CallBackFuction 是计时时间到后执行的回调函数指针,其类型为函数指针类型,对function 的定义如下:
typedef void (* function )(void );
本软件定时器数量缺省配置为8,通过数组进行管理,其定义如下:
struct SoftwareTimer Block[Sum];
define Sum 8 //软件定时器数量
虽然软件定时器从存储结构上是静态的,但是在设计时考虑到动态使用的需求,将软件定时器设计为先激活后使用,用完即回收。

因此,定义了一个就绪表变量,用来标记8 个定时器的ID 号和工作状态,其定义如下:
uchar State = 0;
2.2 高效软件定时器的处理算法
软件定时器的处理算法在时钟节拍内执行,其软件流程图如图2 所示,在时钟节拍中,对已开启的软件定时器的时钟节拍计数值减1,并判断时钟节拍计数值是否溢出,如果溢出,表明定时时间到,立即执行回调函数,并更新就绪表,在操作就绪表时,不允许有更高级的中断进入操作软件定时器,所以在处理过程中需要加锁保护。

本软件定时器的处理算法通过函数TimerTickTask 实现,通过此函数对已开启的软件定时器进行上述处理,其代码定义如下:
图2 软件定时器处理算法流程图
2.3 高效软件定时器的接口函数
本软件定时器提供了标准的接口函数,软件定时器接口函数包括软件定时器启动函数SoftwareTimerStart 和软件定时器关闭函数SoftwareTimerStop。

SoftwareTimerStart 函数流程如图3所示,通过该函数可以开启一个软件定时器,如果无可用软件定时器,即开启失败,返回错误码。

如果开启成功,进行时钟节拍计数值和回调函数初始化,并把该软件定时器在就绪表中的位置作为ID 号返回。

图3 启动流程图
通过SoftwareTimerStop 函数可以对该软件定时器进行关闭操作,并返回已计量的时钟节拍数,其执行流程如图4 所示。

图4 关闭流程图
注意,软件定时器受时钟节拍驱动,节拍精度直接影响软件定时器的精度。

回调函数直接在时钟节拍中运行,如果回调函数执行时间超过时钟节拍间隔时长,就会造成后续节拍的滞后,不仅影响定时精度,而且影响系统正常运行。

所以回调函数的执行时间不能超过时钟节拍间隔时长,如果回调函数需要较长时间运行,可以在回调函数中置位一个标志位,在大循环中扫描该标志位执行所需任务。

3 实验结果
3.1 误差分析
软件定时器开启和关闭的理想时间段为时钟节拍所用硬件定时器的中断处理函数执行期间[11-12]。

但实际上软件定时器的开启和关闭时刻是随机的,在操作某个软件定时器时,由于开启时刻和关闭时刻与时钟节拍没有对准,会存在误差,且其值可能是一个时钟节拍内的任意值,该误差称为启动误差和关闭误差。

如图5 所示,时刻1 和时刻3 为时钟节拍所用硬件定时器的中断处理起始时刻。

如果在时
刻2 开启了一个软件定时器,其启动误差即为时刻1 与时刻2 之间的时间差值。

如果在时刻4 停止了该软件定时器,其关闭误差即为时刻3 与时刻4 之间的时间
差值。

图5 误差分析
启动误差和关闭误差无法完全消除,可以采用更快的时钟节拍来减小误差,但是这样会导致CPU 频繁进出中断,CPU 利用率不高,应根据实际应用的需要,选择合适的时钟节拍,将这两种误差控制在可接受的范围内。

3.2 性能测试
在基于时钟节拍的前后台软件架构中,两个时钟节拍之间的时间间隔称为“时间片”[13],为了分析软件定时器的算法效率,以“时间片占用率”来进行衡量。


以根据时间片占用率及应用需求设定合适的时钟节拍,获取更高的定时精度[14-16]。

时间片占用率 = TimerTickTask 函数运行时间/时间片。

测试环境:Keil C51 V4.11,芯片类型AT89C55,时钟频率设置为24 MHz。

测试方法:时间片设置为5 ms。

在开启时钟节拍所用硬件定时器之前,开启软件定时器,定时时间设置为5 ms,回调函数为空函数。

时钟节拍中只有TimerTickTask 函数。

使用KEIL 软件仿真得到测试结果如表1 所示。

由测试结果可知,每增加一个软件定时器,TimerTickTask 函数运行时间增加约
为45 μs,时间片占用率增加约为0.9%;AT89C55 在24 MHz 时钟下的指令处理
速度为2 MIPS,性能有限,在8 个软件定时器全部开启的极端情况下,时间片占用率不到8%,可见该软件定时器算法具有较高的执行效率。

在更高级的单片机中可将时间片进一步缩小,保证性能的同时可获得更高的定时精度。

表1 性能测试定时器/个TimerTickTask 函数运行时间/μs 时间片占用率/%1 57 1.14 2 96 1.92 3 136 2.72 4 179 3.58 5 223 4.46 6 269 5.38 7 318 6.36 8 369 7.38
4 应用举例
本软件定时器使用灵活,应用场合广泛,例如,按键音、串口读超时判断和界面显示超时判断等。

如果两个软件定时器嵌套使用,还可实现不等长度的周期性定时。

4.1 串口读超时判断
在单片机开发系统,尤其是51 内核单片机,在串口开发中,需要一个硬件定时器提供波特率,还需要一个硬件定时器用于串口读超时判断,造成硬件定时器资源紧张,本软件定时器可以很好解决这个问题,首先根据需要编写ReadTimerOut 函数,此函数时是在串口读超时后要执行的任务。

设时间片为1 ms,串口数据流中断10 ms 即认为超时,其判断代码如下:
在上述代码中TimerID 变量有两个作用,一是记录定时器ID,二是用来判断串口数据流的起始字节。

如果是起始字节,开启一个软件定时器,再次读串口时关闭上一次开启的软件定时器,开启一个软件定时器重新开始计时。

4.2 软件定时器嵌套
本软件定时器灵活使用,会把复杂设计变得简单,在工控领域,经过用到不等长周期性定时用于测试设备。

设时间片为1 ms,利用本软件定时器实现工作1 s停3 s 这样的不等长周期性定时的代码如下:
TaskStart 函数开启任务后,开启一个软件定时器,定时1 s 后回调TaskSop 函数,TaskSop 函数关闭任务,开启一个软件定时器,定时3 s 后调TaskStart 函数。

如此循环嵌套实现所需功能。

5 结语
将实时操作系统中的定时器软件管理思想引入单片机前后台软件架构中,设计并实现了一个软件定时器模块,本模块逻辑清楚,分层设计,并针对单片机进行了特殊
优化;采用动态激活的方式使用,软件定时器用完即回收,便于重复使用。

误差分
析和性能测试表明本软件定时器实用高效。

利用本软件定时器开发多任务系统,不仅可以节约硬件定时器资源,而且可以大大加快单片机系统的开发进程。

参考文献(References):
【相关文献】
[1] Labrosse J. Inside Real-Time Kernels[C]//Conference Proceedings of Embedded Systems Conference East. 1997:205-214.
[2] Labrosse J J. Microc/OS-II[M]. R & D Books,1998.
[3]Krishna C M. Real ‐ Time Systems[M]. John Wiley & Sons,Inc.,1999.
[4] Pont M J. Patterns for time-triggered embedded systems[J]. New York:Person Edueation,2001.
[5] Dick R P,Lakshminarayana G,Raghunathan A,et al. Analysis of power dissipation in embedded systems using real-time operating systems[J]. Computer-Aided Design of Integrated Circuits and Systems,IEEE Transactions on,2003,22(5):615-627.
[6]李小群,赵慧斌,叶以民,等. RFRTOS:基于Linux 的实时操作系统[J].软件学报,2003,14(7):203-1212.
[7] Love R,Are S H W,Linus A C,et al. Linux Kernel Development Second Edition [M]. 2004.
[8]李凡,卢社阶,邱鹏,等. 在嵌入式应用中增强Linux 实时性的方法研究[J]. 华中科技大学学报:自然科学版,2005,33(2):82-85.
[9]严蔚敏,吴伟民. 数据结构[M]. 北京:清华大学出版社,1992.
[10] Shaffer C A. Solutions Manual:A Practical Introduction to Data Structures and Algorithm Analysis[M]. N. J.:Prentice Hall,1997.
[11]赵霞,郭耀,雷志勇,等. 基于模拟器的嵌入式操作系统能耗估算与分析[J]. 电子学报,2008,36(2):209-215.
[12]周博,王石记,邱卫东,等. SHUM-UCOS:基于统一多任务模型可重构系统的实时操作系统[J]. 计算机学报,2006,29(2):208-218.
[13]徐久强,刘辉,朱剑,等. 一种基于时间片的抢占控制模型[J]. 东北大学学报(自然科学版),2009,11:1570-1573.
[14]陈俐,殷承良. 基于混合定时调度的车辆AMT 控制系统的实时性分析[J]. 上海交通大学
学报,2008,41(2):256-261.
[15]郭占社,孟永钢,苏才钧. 基于Windows 的精确定时技术及其在工程中的应用[J]. 哈尔滨工业大学学报,2005,37(12):1717-1720.
[16] Holenderski M,van den Heuvel M,Bril R J,et al. Grasp:Tracing,visualizing and measuring the behavior of real-time systems[C]//International Workshop on Analysis Tools and Methodologies for Embedded and Real-time Systems (WATERS). 2010:37-42.。

相关文档
最新文档