logo资料库

基于OSEK_VDX操作系统的任务管理机制设计.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
第 32 卷 第 12 期 Vol.32 № 12 ·软件技术与数据库· 计 算 机 工 程 Computer Engineering 文章编号:1000—3428(2006)12—0082—03 2006 年 6 月 June 2006 文献标识码:A 中图分类号:TN919.2 基于 OSEK/VDX 操作系统的任务管理机制设计 陈 卓 1,熊忠阳 1,李银国 2,3 (1. 重庆大学计算机学院,重庆 400044; 2. 重庆邮电学院自动化学院,重庆 400065; 3. 重庆长安汽车股份有限公司,重庆 400023) 摘 要:在汽车电子仿真控制平台开发领域,通常需要遵循 OSEK/VDX 规范集,而该规范集的核心之一便是 OSEK/VDX 操作系统规范。 要设计一个符合该规范的微实时操作系统,任务管理机制是保证其实时性的重要方面。该文提出一种符合 OSEK/VDX 操作系统规范的任 务管理机制,以满足 OSEK/VDX 操作系统的需要。 关键词:OSEK/VDX;实时操作系统;嵌入式系统 Design of Task Management Based on OSEK/VDX OS CHEN Zhuo1, XIONG Zhongyang1, LI Yinguo 2,3 (1. College of Computer, Chongqing University, Chongqing 400044; 2. College of Automation, Chongqing University of Posts and Telecommunications, Chongqing 400065; 3. Chongqing Changan Automobile Company Limited, Chongqing 400023) 【Abstract】In the automobile electronic control platform field, the design and implementation of control system commonly accord with the specification unit of OSEK/VDX, and the core specification of this unit is operating system specification. The mechanism of task management is very vital to design a RTOS which is accorded with this OS specification. This paper provides a scheme of task management, and it can meet the need of OSEK/VDX operating system. 【Key words】OSEK/VDX; Real time operating system (RTOS); Embedded system μc/OSII 中同一个优先级别的任务只能有一个,而这个限制恰 好不符合 OSEK/VDX 操作系统规范,该规范要求操作系统能 够处理同一优先级的多个任务,并对同一优先级的任务按 FIFO 的原则进行调度。所以,对μc/OSII 的任务管理数据结 构加以修改是实现新的调度机制的核心。这里借鉴了μc/OSII 的任务管理机制。 OSTcbPrioTbl[ ] os_tcb{} 1(1) [1] [2] [3] os_tcb{} 2(1) os_tcb{} 3(1) OSEK/VDX 规范集是由德国汽车工业界于 1993 年联合 推出的汽车电子的开放式系统与接口 OSEK(Open Systems and Corresponding Interfaces For Automotive Electronics)及由 法 国 汽 车 工 业 界 的 相 似 规 范 VDX (Vehicle Distributed eXecutive) 合并而成。制定该规范集的目的是从实时操作系 统(Real Time Operating System)、软件接口、通信和网络管理 等方面对汽车电子控制软件开发平台作了较为全面的定义与 规定。该规范为集中的操作系统子规范定义了一个小的、可 伸缩的实时操作系统,对于存储容量有限和功能专用的嵌入 式系统是非常理想的,从具有 8kB ROM 到具有 512kB ROM 的微处理器上均可使用这样的嵌入式操作系统,该操作系统 可管理实时任务,强化定时器的功能,共享资源等工作。本 文提出了一种满足 OSEK/VDX 操作系统规范的任务管理机 制,通过仿真实验,该机制能够较好地保证任务调度实时性。 1 任务管理机制 1.1 任务管理的数据结构 先分析任务管理数据结构。在操作系统中常以一个任务 描述符数据结构来表示一个任务。例如:在μc/OSII 操作系统 中以一个 OS_TCB{ }[3]来表示一个任务,在任务描述符里, 详细地定义了和一个任务相关的各种属性,如在 OS_TCB{ } 中 定 义 了 和 任 务 相 关 的 任 务 链 表 ( 以 O S T C B N e x t 和 OSTCBPrev 表示指向在任务链表中当前任务的后一个任务 和前一个任务)、代表任务占用的堆栈的 OSTCBStkSize、代 表任务优先级的 OSTCBPrio 等。其结构如图 1,在该图中省 略了 OS_TCB{ }结构和其它数据结构,如事件控制块、消息 等的连接关系。在μc/OSII 中为了方便用位图的方式来实现 O ( 1 ) 的 任 务 调 度 算 法 , 用 一 个 O S _ T C B { } 结 构 数 OSTCBPrioTbl[ ]来管理多个任务的优先级别,也就是说在 —82— 图 1 μc/OSII 的任务链接关系 需 要 对 任 务 描 述 符 数 据 结 构 加 以 修 改 , 可 以 考 虑 在 OS_TCB{ }数据结构中增加链接到同优先级别的任务的指 针,使同一优先级别的任务(如果有同优先级的任务)能够链 接成一个新的链表结构。这样,当在 OSTCBPrioTbl[]检索到 某一时候优先级最高的优先级时,能够依 FIFO 的原则使调 度器调度同一优先级下的多个任务,而位图中的 OSRdyTbl[] 数组表示优先级的置位,当同一优先级的任务全部被调度完 以后,才将该优先级的置位清零。这种新的任务管理机制对μ 基金项目:国家“863”计划基金资助项目(2004AA1Z2380) 作者简介:陈 卓(1980—) 男,硕士生,主研方向: 操作系统,嵌 入式系统,网络协议栈;熊忠阳、李银国,教授 收稿日期:2005-06-20 E-mail:rakechen2000@163.com
c/OSII 基本的任务管理机制的扩充。修改后的任务管理数据 结构如图 2 所示(图中,表示当前的操作系统中只有等级为 1、 2、3 级别的任务,而在 1 和 2 优先级分别有 3 个和 2 个同优 先级别的任务),新的任务管理数据结构,在 OS_TCB{ }中增 加了能够实现同优先级别任务链表的单向指针变量 struct os_tcb *OSTCBEqu。另外,当同优先级任务链表中位于最前 面的任务在被调度后,需要从链表中移出,但就绪位图中代 表该任务优先级的位置暂时不清除,这需要改进调度算法, 在 1.3 节和 1.4 节将就这一问题进行讨论。 OSTcbPrioTbl[ [1] [2] [3] ] OSTcbList os_tcb{} 1(1) os_tcb{} 1(2) os_tcb{} 1(3) NULL os_tcb{} 2(1) os_tcb{} 2(2) NULL os_tcb{} 3(1) 图 2 新的任务链接关系 1.2 就绪算法的实现 以下是任务就绪算法的实现,其中,对于新任务的初始 化以及根据优先级 prio 把 OSRdyGrp 和 OSRdyTbl[]置位的操 作已经省略。 Input: 进 入 就 绪 态 的 任 务 的 优 先 级 prio , OSTCBPrioTbl[] , OSTCBList(其中,OSTCBList 指向任务链表的表头,如果是不同 优先级的任务进入链表,都是利用 OSTCBList 指针加入到链表的表 头,而对于同优先的任务则不需要使用。) Output: void (该算法主要是使同优先级和不同优先级的任务能 加入不同的链表,不需要返回任何变量) Body: OS_TCB *ptcb; /*指向当前任务 */ OS_TCB *ntcb; /*指向某优先级下同优先级任务链表 的表头*/ /*判别同优先级别置位没有,如果没有置位,就是该优先级 的第一个任务*/ if (!OSTCBPrioTbl[prio]){ /*没有 prio 优先级的任务,直接置位*/ ptcb = OSTCBPrioTbl[prio] ; ptcb->OSTCBNext = OSTCBList; /*把任务加入到任务链表,利 用 OSTCBList 把任务加入到链表的表头*/ ptcb->OSTCBPrev=(OS_TCB)0; if (OSTCBList != (OS_TCB *)0) OSTCBList->OSTCBPrev = ptcb; OSTCBList = ptcb; OSRdyGrp |= ptcb->OSTCBBitY; /*根据已经在任务初始化的 时候设置好的*/ OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; /*OSTCBBitX 和 OSTCBBitY 对就绪表置位*/ OSTaskCtr++; } /*已经有同优先级别的任务,找到同优先级别的 任务链表的末尾,因为是 FIFO,因此要加到链表尾 部*/ else{ ntcb = OSTCBPrioTbl[prio]; /*对 于 优 先 级 prio,先找到与该优先级相关的同优先级任务链表头 */ while(ntcb->OSTCBEqu != NULL) /*利用 OSTCBEqu 指针遍历该同优先级链表直到表尾*/ ntcb=ntcb->OSTCBEqu; /*在同优先级任务链表中插入该任务*/ ntcb->OSTCBEqu = ptcb; /*利用在 1.1 节中新增加的指针把当 前任务链接到同优先级链表*/ ptcb->OSTCBEqu = NULL; ptcb->OSTCBNext = NULL; ptcb->OSTCBPrev = NULL; /*这里只需要对当前任务 ptcb 没有 使用的指针初始化为 NULL*/ OSTaskCtr++; /*而不对就绪表进行置位,其原因在于对于同一 优先级 prio 在*/ } /*就绪表中已经被置位。*/ 1.3 任务脱离就绪队列算法 由于引入了同优先级的任务链表,当任务脱离开链表时, 不能简单地对就绪表清零,必须对同优先级是否存在多个任 务加以判断:(1)当满足条件在 prio 优先级下只有一个任务; (2)对于 OSRdyTbl[prio]所表示的 8 个优先级下均为空,才会 将 OSRdyGrp 的某位清零,即表示在该位所表示的一组优先 级下没有任务,而在同一优先级下有多个任务时,需要把指 向同优先级链表头的指针后移一个节点,指向同优先级的下 一个任务,以使当新一次调度的时候调度器也是以 O(1)的时 间复杂度选取下一个任务,如以下代码所述: /*根据μc/OSII 的两个就绪表变量计算出当前优先级最高的优先 级*/ y = OSUnMapTbl[OSRdyGrp]; prio = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]); if (!OSTCBPrioTbl[prio]->OSTCBEqu &&((OSRdyTbl [prio>>3] &= ~OSMapTbl[prio&0x07])==0)) OSRdyGrp &= ~OSMapTbl[prio>>3]; else{ if (OSTCBPrioTbl[prio]->OSTCBEqu != NULL){ /*同优先级下有多个任务的情况*/ ntcb = OSTCBPrioTbl[prio]->OSTCBEqu; OSTCBPrioTbl[prio] = ntcb; } 1.4 任务调度算法 任务调度器的效率对操作系统的实时性能有较大影响, 如 Linux 2.4.X 的进程调度算法的时间复杂度为 O(n),其实时 性能不甚理想,而在 Linux 2.6.X 内核中引入了全新的 O(1) 调度算法,其实时性能有了显著的改善[4]。同样,对于主要 应用于汽车电子领域的 OSEK/VDX 操作系统作为一种实时 的操作系统,也需要有设计良好的任务调度机制,μc/OSII 的任务调度算法的时间复杂度 O(1),在引入了同等优先级下 的多任务机制后,利用改进后的任务管理数据结构(图 2 所 示)仍然可以保证 O(1)的效率,新的调度算法的效率同时也 是衡量任务管理数据结构设计得是否合理的重要标准。 同优先级的第 1 次调度 同优先级的第 2 次调度 OSTcbPrioTbl[ ] os_tcb{} 1(1) os_tcb{} 1(2) os_tcb{} 1(3) NULL [1] [2] [3] os_tcb{} 2(1) os_tcb{} 2(2) NULL OSTcbList os_tcb{} 3(1) 图 3 新的任务调度描述 —83—
如图 3,当优先级 1 下的任务 1(1)被调度后,OSTCBPrio Tbl[1]就会指向下一个同优先级的任务 1(2),而当任务调度器 再次调度该优先级下的任务时,仍能在 O(1)找到该任务,这 样会调度图 3 中的编号为 1(2)的任务。由于该调度器利用了 比较复杂的任务管理数据结构,并没有出现通常的调度算法 会遍历任务链表的操作,也就没有循环语句,所以整个算法 的时间复杂度仍然保持在 O(1),能够保证良好的实时性。具 体的算法实现如下: void OS_Sched (void) { INT8U y; cpu_sr = 0; OS_ENTER_CRITICAL(); if (OSIntNesting == 0 && OSLockNesting == 0) { y = OSUnMapTbl[OSRdyGrp]; OSPrioHighRdy=(INT8U)((y<<3)+ OSUnMapTbl[OSRdyTbl[y]]); if (OSPrioHighRdy != OSPrioCur) {/*优先级不同*/ OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; OSCtxSwCtr++; OS_TASK_SW(); } else{/*优先级相同*/ if (OSTCBPrioTbl[OSPrioHighRdy]->OSTCBId != OSPrioCur->OSTCBId){ OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy]; OSEQU[OSPrioHighRdy]++; OSCtxSwCtr++; OS_TASK_SW(); } } } } 2 实验与仿真 类型的实时内核,因此有这样的等价关系:任务响应时间 = 调度器寻找最高优先级任务所耗时间 + 任务切换时间。具 体的测试方法是设计一个测试任务,分别把该任务的就绪时 候的和被调度器调度时候的系统时钟 tick 值保存到定义好的 两个变量中,并利用操作系统的 HOOK 例程(在μc/OSII 和 OSEK/VDX 操作系统中都支持有“钩子”例程)读出这两个变 量后比较,经过 5 000 次任务调度测试后,统计如表 1。 表 1 调度测试统计 μc/OSII OSEK/VDX 系统 最大任 务响应 1.3ms 调度延时 <0.1ms 调度延时 <0.2ms 调度延时 < 0.5ms 99.841 311 % 99.908 121 % 99.932 217 % 5.9ms 98.645 313 % 98.952 861 % 99.109 973 % 3 结束语 本文提出了一种满足 OSEK/VDX 操作系统规范的任务 管理机制,如表 1 所示,改进后的调度机制,在取得对同优 先级多任务调度支持的同时牺牲了部分任务响应效率,增加 了部分延时。在多次测试中,最差的任务响应时间有较大差 别。但基本能够满足汽车电子对实时性的需要。 参考文献 1 OSEK/VDX Specifications [Z]. http://www.OSEK-VDX.org. 2 OSEK/VDX Operation System Specification 2.1[Z]. http://www. OSEK-VDX.org. 3 Labrosse J J. 邵贝贝译. 嵌入式实时操作系统 UC/OS-II(第 2 版)[M]. 北京: 北京航空航天大学出版社, 2003. 4 Love R. Linux Kernel Development[M]. Sams Publishing, 2004. 5 Abbott R, Garcia-Molina H. Scheduling Real-time Transactions[J]. ACM SIGMOD Record, 1988,17(1): 71-81. 6 Haritsa J R, Livny M, Carey M J. Earliest Deadline Scheduling for Real-time Database Systems[C]. Proceedings of the 12th IEEE Real-time Systems Symposium, Los Alamitos, CA, 1991: 232-234. 由于本文所讨论的是和任务管理相关(任务就绪,任务 调度等)的一系列机制,因此实验仿真的主要目的是测试改 进后的任务响应时间,实验中分别对在同一优先级下多个任 务的情况做了压力测试。由于 OSEK/VDX 操作系统是可剥夺 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ (上接第 81 页) 答案的分布情况,而且还考察了 50 个查询的整体分布情况, 如图 4 所示,其中横轴和纵轴的定义和图 3 类似,只是这里 是 50 个查询相关文档个数叠加后的结果,其中系列 1 为基于 主题的方法答案在文档集合中的分布,系列 2 是参考下限中 答案的分布情况。从上面的实验可以看出,通过对主题的划 分可以使一个查询的相关文档集中在少数的几个文档集合 中,这样就为文档集合的选择提供了前提条件,也就是说如 果采用好的文档集合选择算法,只要选中那些包含相关文档 最多的文档集合来进行检索,就可以取得比较好的检索效果。 如何合理的组织文档集合,如何选择出最合适的集合进行检 索是非常重要的。本文通过文本聚类方法,把文档按照主题 的方式来划分,经过实验发现查询答案明显地汇聚在少数的 文档集合中,为进一步的文档集合选择创造了先决条件。通 过和人们经常采用的按照信息的出版时间、信息来源等划分 方式对比,该方法在检索的效果上也有了明显的提高。 参考文献 3000 2000 1000 0 系列 1 系列1 系列 2 系列2 1 11 21 31 41 51 61 71 81 91 图 4 50 个查询在不同的集合中的分布图 5 结论 在网络信息不断丰富的今天,分布式信息检索为人们迅 速查找到所需要的信息提供了一个很好的解决方案。在分布 式信息检索中,由于不是对全部的文档集合同时检索,因此 —84— 1 Callan J P, Lu Z, Croft W B. Searching Distributed Collections with Inference Networks[C]. Proceedings of the ACM SIGIR, 1995: 21-28. 2 Jay M, Ponte W, Croft B. A Language Modeling App roach to Information Retrieval[C]. Proceedings of the ACM SIGIR, 1998: 275-281. 3 Ogilvie P, Callan J P. Experiments Using the Lemur Toolkit[C]. Proceedings of the TREC’01, 2001: 103-108. 4 Xu Jinxi, Croft W B. Cluster-based Language Models for Distributed Information[C]. Proceedings of the 22th Annual International ACM SIGIR Conference on Research and Development in Information Retrieval, 1999: 254-261. 5 Callan J. Distributed Information Retrieva[M]. Advances Informational Retrieval. USA: Kluwer Academic Publishes, 2001. in
分享到:
收藏