在嵌入式实时系统μcosⅱ中实现时间片轮转调度

上传人:w****i 文档编号:113751917 上传时间:2019-11-09 格式:PDF 页数:4 大小:629.87KB
返回 下载 相关 举报
在嵌入式实时系统μcosⅱ中实现时间片轮转调度_第1页
第1页 / 共4页
在嵌入式实时系统μcosⅱ中实现时间片轮转调度_第2页
第2页 / 共4页
在嵌入式实时系统μcosⅱ中实现时间片轮转调度_第3页
第3页 / 共4页
在嵌入式实时系统μcosⅱ中实现时间片轮转调度_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《在嵌入式实时系统μcosⅱ中实现时间片轮转调度》由会员分享,可在线阅读,更多相关《在嵌入式实时系统μcosⅱ中实现时间片轮转调度(4页珍藏版)》请在金锄头文库上搜索。

1、第十七届中国过程控制会议论文集 234 在嵌入式实时系统C/OS-II 中实现时间片轮转调度 在嵌入式实时系统C/OS-II 中实现时间片轮转调度 胡军国,胡 婕 (浙江工业大学信息工程学院,杭州 310014) 摘摘 要:要:介绍在嵌入式实时操作系统C/OS-II 中,改变原来按优先级的调度策略,实现各任务之间按时 间片轮转调度策略,并给出了两种实现方法,同时对两种实现方法进入测试和比较,得出这两种调度策 略都可行。在应用时,不同的使用场合应选择不同的方法。 关键词:关键词:C/OS-II;时间片;调度;多任务;嵌入式操作系统 0 0 引言 引言 随着当前电子信息技术和网络技术高速发展,嵌入

2、式系统已经广泛地渗透到科学研究、工程设计、 军事技术、商业文化艺术、娱乐业以及人们日常生活中的方方面面。在嵌入式系统发展过程中,嵌入 式操作系统功不可灭。C/OS-II 就是一种嵌入式实时操作系统,它已经通过了非常严格的测试,得到 了美国航空管理局的认证。C/OS-II 功能强大,支持 56 个用户任务,其内核为占先式,支持信号量、 邮箱、消息队列等多种常用的进程通信机制,现已成功应用到众多商业嵌入式系统中,是一种成熟稳 定的实时内核。与大多商用实时系统不同的是, C/OS-II 公开所有的源代码,90 %的代码使用标准 的 ANSI C 语言书写,程序可读性强,移植性好。因此,学习和研究C/

3、OS-II 实时操作系统具有重要 的意义。 1 C/OS-II 的任务调度机制1 C/OS-II 的任务调度机制 C/OS-II 是基于优先级内核的可剥夺型操作系统,每个任务根据其重要程度不同,被赋予一定 的优先级,CPU 总是让处于就绪态的、优先级最高的任务先运行。当一个低任务被高优先级抢占时, 内核就将低任务的关键寄存器、CPU 状态字、程序计数器 PC 的值保存到低任务自身堆栈中;然后把高 任务堆栈中的关键寄存器、CPU 状态字、PC 值出栈;接着 CPU 就根据 PC 值执行相应代码,即运行高任 务。在整个任务调度中,关键是寄存器和状态字入栈和出栈,是通过调用 OSCtxSw()和 O

4、SIntCtxSw ()实现。由于这两个函数与 CPU 硬件相关,都是用汇编语言编写。 这种基于 3优先级调度法的操作系统是不具有时间片轮转调度机制。但是,在现实使用中,常会遇 到几个任务没有重要程度之分,需按时间片轮番执行,这时C/OS-II 就显得力所不及。通过分析源 代码,对C/OS-II 进行一些必要的修改,也能实现时间片轮转调度。 2 在C/OS-II 中实现时间片轮转调度2 在C/OS-II 中实现时间片轮转调度 2.1 通过建立高任务来调度 2.1 通过建立高任务来调度 C/OS-II 总是把 CPU 的使用权交给就绪表中优先级最高的任务,只有当此任务延时或等待某个 事件,CPU

5、 的使用权才有可能交给其它低优先级任务。为了实现几个任务按时间片轮转调度,需要建 立一个高优先级的任务,通过此任务把时间片按顺序分配给其它任务,从而实现时间片轮转调度。 假设有三个任务 TestTask4,TestTask5,TestTask6,优先级分别为 4,5,6。三个任务需按时间 片运行,时间片定义为 myTimeSlice,为 10 个时钟节拍。为了实现几个任务按时间片轮转调度,再定 义一个高优先级任务 ManagerTask,优先级为 1,此任务的功能是将时间片分配给 TestTask4, 作者简介:作者简介:胡军国(1978-) ,男,浙江临安市人,助教,计算机嵌入式。 第十七届

6、中国过程控制会议论文集 235 TestTask5,TestTask6。 这 4 个任务一建立后,内核就让它们成为就绪态,然后通过 OSStart()调度 ManagerTask。为了防 止按优先级调度,在 ManagerTask 中首先使其它三个任务脱离就绪态 1。然后 ManagerTask 就按顺序 对三个任务进行按时间片轮番调度,这是本调度法的核心。 以下就介绍此核心思想,先定义变量 CurrentTask,赋值为 4,说明要调度的任务优先为 4。接着 就判断 TestTask4 是否延时或等待事件,如果既不延时,又不等待,那就让它进入就绪态,其它两个 任务继续脱离就绪。然后把 Cur

7、rentTask 赋值为 5,说明下一次把时间片分配给优先级为 5 的任务。 最后,调用 OSTimeDly(myTimeSlice),让 ManagerTask 延时一个时间片,把 CPU 的使用权交给 TestTask4, 这样 TestTask4 就运行了。 一个时间片后 ManagerTask 又进入就绪态, 它抢占了 TestTask4, 获得 CPU 使用权,这时的 CurrentTask 值为 5,如果 TestTask5 既不延时,又不等待,那就让它进入 就绪态,其它两个任务脱离就绪,然后把 CurrentTask 赋值为 6,掌握 CPU 使用权的 ManagerTask 运

8、 行 OSTimeDly(myTimeSlice), 交出 CPU 使用权, 让 TestTask5 运行。 当 TestTask5 运行一个时间片后, 同样让 TestTask6 运行,最后又轮到 TestTask4 运行,因此就在 3 个任务中循环,实现时间片轮转调 度。 另外值的一提的是,在判断某个任务是否延时或等待事件,如果此任务在延时或等待,那就不能 进入就绪态,应该判断下一个任务是否延时或等待,直到遇上一个既不延时,又不等待的任务,就让 此任务进入就绪态。如果所有的任务都延时或等待,ManagerTask 就等待一定的时钟节拍,把 CPU 控 制权就交给空闲任务。见图 1。 图 1

9、 2.2 通过时钟节拍来管理调度2.2 通过时钟节拍来管理调度 在C/OS-II 中,每个时效节拍来到后,都会产生一个 OSTickISR 中断。中断产生后,在中断服 务程序中会运行 OSTimeTickHook()钩子函数,利用这一点,可以在此钩子函数中添代码来实现时间 片轮转调度。 C/OS-II 是一种代码可裁减的系统,在一般情况下,OSTimeTickHook()函数被禁用,并且没 有任何代码,所以要启用此功能函数并添加代码。添加在 OSTimeTickHook()钩子函数中的代码,首 先要判断时钟节拍数是否已达到一个时间片时,如果时钟节拍没有达到一个时间片,函数就返回,让 内核继续执

10、行当前任务;如果已到一个时间片,就使当前的任务脱离就绪,让下一个任务进入就绪态, 然后让时钟节拍从 0 开始重新计数,以使新任务也能运行一个时间片。当 OSTickISR 中断返回时,CPU 的使用权就交给刚进入就绪态的任务,此任务就得以运行。 第十七届中国过程控制会议论文集 236 在 OSTimeTickHook()函数的算法中,关键是确定当前任务的下一个任务。同样假设有三个任务 TestTask4,TestTask5,TestTask6,优先级分别为 4,5,6,并把 TestTask5,TestTask6,设为脱离 就绪态。这三个任务一旦建立后,就会把任务控制块数组 OSTCBTb加入

11、到 OSTCBList 双向链表中。 见图 2。假如当前任务是 TestTask4,即 OSTCBCur 指向 OSTCBTb1,一个时间片后,让此任务脱离就 绪,使下一个任务进入就绪态。为了找到下一个进入就绪态的任务,就在双向链表中按 OSTCBNext 指 针搜索。 TestTask4 的 OSTCBNext 指针指向 OS_TaskIdle 空闲任务, 就不作任何处理, 接着从 OSTCBList 头开始搜索,即 TestTask6。如果 TestTask6 既不延时,又不等待,就使 TestTask6 进入就绪态,使 TestTask4 脱离就绪。如果 TestTask6 延时或等待,

12、就要搜索 OSTCBNext 指针指向的 TestTask5,再判 断是否既不延时,又不等待,直到找到既不延时,又不等待的任务,让它进入就绪态。如果这些任务 都延时或等待,就把 CPU 的使用权交给空闲任务。 图 2 3 两种时间片轮转调度的测试及比较3 两种时间片轮转调度的测试及比较 两种调度方法都有各自的优缺点,第一种方法是通过建立高优先级任务来实现,当某个时刻,高 优先级任务把时间分配给一个任务,此任务就开始运行,只有遇到 OSTimeDly()、Pend()、中断才有 可能交出 CPU 使用权。当某个任务非常庞大,运行时间超过一个时间片,如果等任务完成才交出 CPU 使用权,则此任务分

13、配的时间片就过多,所以就不得不在任务中间加入 OSTimeDly(),以让此任务停 止,交出 CPU。但是,这种在任务中间加入 OSTimeDly(),就会导致时间片分配不均匀。这种情况虽然 是存在的,但出现的可能较小。此方法的另一缺点就是要额外建立一个高优先级任务,需要浪费部分 代码空间。它的优点就关中断的时间与原来的系统一样,没有任何增加。 第二种方法在 OSTickISR 中断加入了调度代码,增加了关中断时间,可能会引起中断丢失,所以 在中断非常重要的情况下不宜使用。但是,它是在时钟节拍中调度任务,不需要在任务中加入 OSTimeDly(),只要时钟中断返回就能交出 CPU 使用权,所以

14、时间片分配比较均匀。 以下是在 Keil uVision2 中测试,目标系统选择 Atmel89C52。在第一种方法中,第一个时间片分 配给 TestTask4,时间片为 0.2252 秒到 0.728489 秒,共运行 0.503289 秒;第二个时间片分配给 TestTask5, 时间片为 0.730013 秒到 1.231782, 共运行 0.501779 秒, 这两个时间片基本相同。 如图 3, 方法一的时间片基本相同,方法二也如此。所以,用这两种方法实现的时间片轮转调度可行。 第十七届中国过程控制会议论文集 237 图 3 4 结束语4 结束语 C/OS-II 短小精悍,以其可靠性和

15、稳定性而出名,使用它的场合越来越多。然而在时间片轮转 调度方面显得捉襟见肘, 很多人往往放弃熟悉的C/OS-II, 又去学习和移植新的系统, 不仅浪费精力, 也浪费了宝贵的开发时间。C/OS-II 也能实现时间片轮转调度,就没必要为了时间片轮转调度而去 学习新的操作系统,节约时间,提高了工作效率。 参考文献: 1 Jean J.Labrosse.邵贝贝译.嵌入式实时操作系统C/OS-II(第二版)M.北京:北京航空航天大学出版 社,2003.65-200 2 胡汉才.单片机原理及其接口技术(第 2 版)M.北京:清华大学出版社,2004.110-130 3 WILLIAM STALLINGS.

16、魏迎梅译.操作系统内核与设计原理(第四版)M.北京:电子工业出版社,2001.180-200 4 张培仁.基于 C 语言编程 MCS-51 单片机原理与应用M.北京: 清华大学出版社, 2003.160-280 Realizing time slice circular scheduling in embedded real-time system C/OS-II Realizing time slice circular scheduling in embedded real-time system C/OS-II HU Jun-guo 1, Hu Jie 2 (1. College of Information Engineering, Zhejiang University of Technology, Hangzhou Zhejiang, 310014,China; 2. College of Information Engineering, Zhejiang Unive

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号