ImageVerifierCode 换一换
格式:DOC , 页数:4 ,大小:215KB ,
资源ID:3842886      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3842886.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(μCOSII中软件定时器的优缺点与改进.doc)为本站会员(hw****26)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

μCOSII中软件定时器的优缺点与改进.doc

1、C/OSII 中软件定时器的优缺点与改进类别:消费电子 阅读:954 C/OSII 具有小巧、性能稳定、开源等众多优点,并且 C/OSII 大部分用 ANSI C 语言编写,系统的移植非常容易。在 C/OSII I2.81 及以后的版本中2,加入了对软件定时器的支持,使得 C/OSII 操作系统更加完善。 C/OSII 是一种基于优先级的抢占式操作系统,实时性很强。而系统中软件定时器没有优先级,回调函数顺序执行,这样就降低了系统的实时性。因此,本文对软件定时器进行改进,定时器中加入优先级,回调函数按优先级执行,从而提高系统的实时性。 1 对软件定时器的介绍 C/OSII 系统中的时间管理功能包

2、括任务延时与软件定时器,而软件定时器的主要作用是,对函数周期性或者一次性执行的定时,利用软件定时器控制块与“定时器轮 ”管理软件定时器。定时器控制块的结构如同任务控制块,创建一个定时器时,从空闲定时器控制块链表中得到一个空闲控制块,并对其赋值。软件定时器也需要一个时钟节拍驱动,而这个驱动一般是硬件实现的,一般使用C/OSII 操作系统中任务延时的时钟节拍来驱动软件定时器。每个时钟节拍 OSTmrCtr(全局变量,初始值为 0)增 1, 当 OSTmrCtr 的值等于为 OS_TICKS_PER_SEC /OS_TMR_CFG_TICKS_PER_SEC(此两者的商决定软件定时器的频率)时,调用

3、函数OSTmrSignal(),此函数发送信号量 OSTmrSemSignal(初始值为 0,决定软件定时器扫描任务 OSTmr_Task 的运行)。也就是说,对定时器的处理不在时钟节拍中断函数中进行,而是以发生信号量的方式激活任务 OSTmr_Task(具有很高的优先级)。任务 OSTmr_Task对定时器进行检测处理,包括定时器定时完成的判断、回调函数的执行。C/OSII 2.86 中与软件定时器相关的函数包括: 软件定时器内部静态函数。获取与释放定时器控制块函数 OSTmr_Alloc()、OSTmr_Free ();定时器插入相应“时间轮”组函数 OSTmr_Link();从相应“时间

4、轮” 组中删除定时器函数OSTmr_Unlink();软件定时器任务初始化函数 OSTmr_InitTask();定时器扫描任务OSTmr_Task;定时器上锁与解锁函数 OSTmr_Lock()与 OSTmr_Unlock()(在C/OSII 2.91 中,此两函数被任务调度锁定与解锁函数代替)。 定时器外部接口函数。定时器创建与删除函数 OSTmrCreate()、OSTmrDel();定时器启动与停止函数 OSTmrStart()、OSTmrStop();定时器剩余时间与当前状态查询函数 OSTmrRemainGet()、OSTmrStateGet();软件定时器的初始化OSTmr_In

5、it();发送信号量 OSTmrSemSignal 函数 OSTmrSignal();定时器名称查询函数 OSTmrNameGet()。由于软件定时器的回调函数的执行都是在任务 OSTmr_Task 中执行,如果多个定时器同时定时完成,则在定时器任务中执行多个定时器的回调函数,因此定时器任务的执行时间不确定。而且定时器回调函数是顺序执行的,如果某个定时器回调函数需要尽快执行以实现精确定时,就难以实现了。由于各个定时器没有优先级,因此了影响系统的实时性。 2 对软件定时器的改进 为提高软件定时器回调函数执行的实时性,给每个定时器赋予一个优先级。当定时完成时,并且定时器的回调函数不为空,则把定时器

6、的优先级写于软件定时器就绪表中。任务 OSTmr_Task 对相应“时间轮”检查结束后,如果在扫描各个定时器前软件定时器就绪表为零而扫描之后不为零,则发送信号量激活回调函数任务 OSTmr_TaskCallback。在此任务中,回调函数根据软件定时器就绪表中的优先级执行相应的回调函数,这样就提高了系统的实时性。 2.1 对软件定时器相关数据结构改进 定义结构体 OS_TMR_CALL,存储定时器的回调函数、函数的参数、定时器指针,形式如下: typedefstructos_tmr_call OS_TMR_CALLBACKOSTmrCallback; /回调函数/ void OSTmrCallb

7、ackArg;/回调函数指针/ OS_TMR OSTmr; /定时器指针/ OS_TMR_CALL; 在头文件 ucos_ii.h 中,定义 OSTmrCallbackTblOS_TMR_CFG_MAX,OS_TMR_CFG_MAX 表示系统中配置的软件定时器数量。 在软件定时器控制块中加入成员变量 OSTmrPrio(定时器优先级),删去变量 OSTmrCallback(回调函数)、OSTmrCallbackArg (回调函数参数),为了测试的方便,可暂不删除这两个变量。 定义定时器就绪表: INT8UOSTmrRdyGrp; INT8UOSTmrRdyTblOS_TMR_CFG_MAX/8

8、 + 1; 当定时器定时完成时,把定时器优先级写入就绪表,回调函数任务根据优先级执行回调函数。 定义信号量 OSTmrSemCallback(初始值 0 ),当定时完成后,发送此信号量,激活回调函数任务,以执行回调函数。 2.2 与软件定时器相关的函数函数与任务的改进 2.2.1 软件定时器创建函数 OSTmrCreate 在创建函数 OSTmrCreate 的参数中加入优先级参数 prio。调用创建函数时,对定时器控制块中的成员变量赋值,并给回调函数数组的相应单元赋值,形式如下: OSTmrCallbackTbl prio.OSTmrCallback = callback; OSTmrCal

9、lbackTbl prio.OSTmrCallbackArg = callback_arg; OSTmrCallbackTbl prio.OSTmr = ptmr; 2.2.2 对定时器任务 OSTmr_Task 的改进 当有定时器定时完成,把定时器优先级写入软件定时器就绪表中,并根据就绪表前后的值判断时候发送信号量 OSTmrSemSignal,以激活回调函数任务。任务 OSTmr_Task 的流程如图 1 所示。 图 1 OSTmr_Task 的流程 把定时器优先级写入定时器就绪表的代码如下所示: if (OSTmrTime = ptmrOSTmrMatch ) prio = ptmrOS

10、TmrPrio; pfnct =OSTmrCallprio.OSTmrCallback; if (pfnct != (OS_TMR_CALLBACK)0) /加入定时器回调函数就绪表/ OSTmrRdyGrp|= (INT8U)(1 (INT8U)(prio 0x03); OSTmrRdyTblprio 0x03|= (INT8U )(1 (INT8U )(prio pfnct = OSTmrCallprio.OSTmrCallback; if (pfnct != (OS_TMR_CALLBACK)0) /prio 加入定时器就绪表/ OSTmrCallprio.OSTmrCallbackAr

11、g =(void )callback_arg; OSSemPost(OSTmrSemCallback); /发送回调函数执行信号量/ else perr = OS_ERR_TMR_NO_CALLBACK; 而 case OS_TMR_OPT_CALLBACK:部分的代码同上,只是回调函数的参数不需要重新赋值。2.2.4 回调函数任务 OSTmr_TaskCallback() 在源文件 tmr.c 中加入回调函数任务 OSTmr_TaskCallback(),根据定时器就绪表中的优先级执行相应回调函数,回调函数任务的结构如下所示: static voidOSTmr_TaskCallback(vo

12、id p_arg) /变量定义/ for (;)/ 请求信号量 OSTmrSemCallback OSSemPend(OSTmrSemCallback, 0, (pfnct)(void )(OSTmrCallprio.OSTmr),OSTmrCallprio.OSTmrCallbackArg); /执行回调函数/ OSTmr_Lock(); /定时器上锁/ OSTmr_Unlock();/ 定时器解锁/ 由以上代码可知,访问就绪表时定时器上锁,而执行回调函数时处于定时器解锁状态。如果回调函数执行时间较长,在下一个软件定时器节拍到来时,定时器扫描任务可以得到及时的执行,当前回调函数执行完成后,可

13、以及时得执行就绪表中最高优先级定时器的回调函数。由此可以看出,高优先级定时器的回调函数得到及时执行,系统的实时性提高。实验测试发现,在回调函数任务 OSTmr_TaskCallback 中,使用任务调度上锁与解锁比使用定时器上锁与解锁(即信号量的请求)执行速度快一些。毕竟回调函数任务的优先级很高(一般仅次于定时器扫描任务 OSTmr_Task 的优先级),所以使用任务调度锁定比定时器锁定要好一些。当然,还可以使用开关中断的方式对就绪表进行访问,可以根据实际情况选择使用哪种方式。3 实验测试 本次实验使用软件开发环境 IAR 5.30,以基于 CortexM3 内核的路虎 LPC1768 开发板

14、作为硬件实验平台6,对实时操作系统 C/OSII 2.86 进行改进。对改进后的操作系统进行测试,在主函数中创建一个启动任务,在启动任务中创建 4 个周期定时器(系统中“时间轮”数设为 4),赋予不同优先级与定时值,每个定时器控制一个 LED 的闪烁,启动这 4 个定时器。在启动函数中创建 4 个任务,每个任务也是控制一个 LED 灯的闪烁(利用任务延时),之后启动任务挂起。利用 C/OSII CSPY 插件观察各定时器的运行情况,如图 2 所示。 图 2 软件定时器运行界面 经实验测试,系统运行正常,定时器回调函数得到及时的执行,系统实时性得到很大的提高。4 结语 软件定时器改进后,定时器任务的执行时间确定,仅与同时完成定时的定时器数目有关,对处于就绪表中的定时器回调函数按优先级执行,使高优先级定时器的回调函数得到及时的执行,提高了系统的实时性。

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。