ucos-ii 操作系统内核的改进

上传人:xzh****18 文档编号:44618238 上传时间:2018-06-14 格式:PDF 页数:4 大小:38.63KB
返回 下载 相关 举报
ucos-ii 操作系统内核的改进_第1页
第1页 / 共4页
ucos-ii 操作系统内核的改进_第2页
第2页 / 共4页
ucos-ii 操作系统内核的改进_第3页
第3页 / 共4页
ucos-ii 操作系统内核的改进_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《ucos-ii 操作系统内核的改进》由会员分享,可在线阅读,更多相关《ucos-ii 操作系统内核的改进(4页珍藏版)》请在金锄头文库上搜索。

1、Jun. 2006, Volume 3, No.6 (Serial No.19) 通讯和计算机 Journal of Communication and Computer, ISSN1548- 7709, USA 52 UC/OS- II 操作系统内核的改进 成后发1,杨春金2 (1,2 武汉理工大学信息工程学院,武汉 430063) 摘 要:UC/OS- II 是一种针对嵌入式设计的实时多任务操作系统,采用基于优先级的占先式任务调度 算法, 虽然效率高但比较单调。 在实现 TCP/IP 协议中, 这种内核调度方法对 Internet 服务进程显得不适应。 本文分析了 UC/OS- II 和

2、Linux 操作系统内核任务调度算法,在此基础上提出了一种改进 UC/OS- II 内核的 方法,使其更适合于在嵌入式中实现 Internet 服务。 关键词:UC/OS- II;任务调度;RTOS;TCP/IP;实时内核* 1 成后发(1981- ) ,男,硕士研究生;研究方向:3 S 技术应用研究。 2 杨春金(1953- ) ,男,副教授;研究方向:3 S 技术应用研究。 1. 引 言 UC/OS- II 是源码开放的实时嵌入式操作系统, 其主要特点如下:源码开放,系统透明化,容易将 操作系统移植到其他平台。 可移植性,源码大 多数由 ANSI C 编写, 底层与硬件相关由汇编编写, 便

3、于其移植到其它硬件平台。 可固化,只要开 发者有固化手段,就能嵌入到操作系统上。 可 剪裁,用户可以自定制所需要的系统服务。 占 先式,UC/OS- II 采用的是占先式实时内核,意味着 UC/OS- II 总是运行就绪条件下优先级最高的任务, 这种模式使得系统任务及响应时间得以优化。最高 优先级任务一旦就绪,总能得到 CPU 控制权。如 果是一个中断得到一个优先级高的任务就绪,那么 在中断程序完成时,优先级高的任务得以运行。 多任务,UC/OS- II 可以运行 64 个任务,8 个系统 任务和 56 个应用程序任务。UC/OS- II 不支持时间 片轮转调度法,所以每个任务的优先级必须不同

4、。 多任务结构使应用程序模块化, CPU 利用率得到最 大的发挥。 服务时间可确定,所有 UC/OS- II 服 务的时间是确定的, UC/OS- II 的运行时间不依赖于 应用任务的多少。 任务堆栈,每个任务都有属 于自己的不同栈空间,使用 UC/OS- II 的栈空间检 验函数, 可以确定每个任务所需要的栈空间大小1。 2. Linux 内核任务调度算法分析 在 Linux 操作系统中,内核调度时机主要有以 下几种2: ? 进程状态转换时刻,进程中止、进程睡眠 时; ? 可运行队列中增加一个进程时; ? 当前进程的时间片用完时(Current - Counter=0) ; ? 进程从系统调

5、用返回到用户状态时; ? 内核处理完中断后,进程返回到用户状态 时。 在 Linux 的每个进程控制块中有以下几项: policy、priority、counter、rt_priority 作为调度程序 选择进程的依据。其中 policy 是进程的调度策略, 用来区分两种进程实时和普通; priority 是进程 (实时和普通)的优先级;counter 是进程剩余的时 间片,它的大小完全由 priority 决定;rt_priority 是 实时优先级,这是实时进程所特有的,用于实时进 程的选择。 首先,Linux 根据 policy 从整体上区分实时进 程和普通进程,因为实时进程和普通进程的

6、调度是 不同的,实时进程应该先于普通进程运行,然后, 对于同一类型的不同进程,采用不同的标准来进行UC/OS- II 操作系统内核的改进 53 选择进程。对于普通进程,Linux 采用动态优先调 度,选择依据就是进程 counter 的数字大小。进程 创建时,优先级 priority 被赋予一个初值,这个数 字同时也是计数器 counter 的初值,即进程创建时 二者相等。在进程运行中,counter 不断减小,而 priority 保持不变,以便在 counter 变成“0”时(该 进程时间片已经用完)对 counter 进行重新赋值, 这个普通进程才有了被再次调度的机会。这说明, 在普通进

7、程运行过程中, counter 值的减小给了其他 进程得以运行的机会,这就相当于优先级在动态的 变化,所以我们称之为动态优先级调度。 3. 问题的提出 在网络服务环境下,时间片轮转任务调度算法 比较适合基于 Internet 的服务进程,鉴于 Internet 服务进程的特点,每个普通的服务进程对时间的要 求不高,并且它们之间没有优先级的高低之分,故 适合采用时间片轮转调度算法,对每个进程分配一 定的时间片,并以此作为任务调度的依据,各个进 程轮流得到调度。然而在实时系统(RTOS)中, 对每个任务分配不同的优先权是实现实时调度的 基本条件,如果一个实时的嵌入式操作系统既要处 理某些实时的任务

8、,又要提供一定的 Internet 服务, 对于实时任务,需要按照优先级不同顺序完成,对 于非实时的服务进程, 则希望他们轮流执行。 因此, 指定相应的调度策略就显得比较重要。 以上提出的实时系统(RTOS)中任务调度算 法与 Internet 服务进程特点之间的不适应性,是本 文研究的主要问题。以下将对 UC/OS 操作系统内 核做出一定的修改以使其更适合基于 Internet 服务 的应用。 4. UC/OS- II内核任务调度的改进 UC/OS- II 操作系统中, 主要有以下几个进程调 度时机3: ? 进程状态转换时刻,进程终止、睡眠时; ? 可运行队列中增加一个进程时; ? 内核处理

9、完中断后,由中断返回时。 前两种情况下,系统通过函数 OSSched( )实现进程调度,而在中断返回时,系统通过调用函数 OSIntExit( )实现进程调度。而这两个函数在选择当 前优先权最高的进程中采用了非常相似的方式。 根据以上特点,并结合 Linux 内核中时间片轮 转调度算法,对 UC/OS- II 内核做了改进,改进方 法如下: (1) 取出 8 个(1 组)优先级为 Internet 服务进 程专用,设立时间片; (2) TCB控制块中增加一项 counter 作为任务调 度的权值; (3) 修改 OSSched 函数和 OSIntExit 函数中取 得当前最高优先级的算法; (

10、4) 时钟中断处理函数中,将当前运行任务的 counter 减 1(如果该任务属于 Internet 服务进程专 用的任务) 。 首先判断当前就绪队列中优先级最高的进程, 如果不属于 Internet 专用进程,则直接将其取出运 行, 执行运行环境切换。 如果属于 Internet 专用的 8 个进程之一,则顺序遍历所有就绪的 Internet 专用 进程,计算时间片 counter 的值,取出时间片量最 大的进程运行,遇到时间片大小相同的进程,则取 出优先级大的进程运行。如果在遍历中发现所有的 Internet专用任务的时间片都已经归0, 则仿照Linux 的方法,再将他们赋予一定的初值,并

11、取出优先级 最大的投入 CPU 运行。相比原来的调度程序,这 里多添加了几个临时变量进行辅助计算,而代码的 增加量比较小。 4.1 OSSched( )与 OSIntExit( )函数的修改 在这里,将 OSRdyTbl 中第 4 组(定义 OS_PRIO_INTERNET 为3) 的8个进程设为Internet 进程专用的进程,在这 8 个进程之间,采用局部时 间片轮转的任务调度算法,如果就绪队列中有优先 级比这 8 个进程高的任务,则无条件让出 CPU 控 制权,如果当前就绪队列中优先级最高的进程在第 4 组中, 则逐次判断 8 个任务中就绪任务的时间片, 将时间片最大的任务取出放到 CP

12、U 上运行。在程 序实现中结合了 Linux 的任务调度算法,其中 OSSched( )与 OSIntExit( )函数的代码实现如下: /* OSRdyTbl3的 8 个进程为 Internet 专用*/ #define OS_PRIO_INTERNET 3 #define SO_COUNTER 20 UC/OS- II 操作系统内核的改进 54 Void OSSched (void) INT8U X,Y,Z; INT8U C; OS_ENTER_CRITICAL(); If (OSLockNesting | OSIntNesting) =0) Y = OSUnMapTblOSRdyGrp;

13、 X = OSUnMapTblOSRdyTbly; If (Y != OS_PRIO_INTERNET ) OSPrioHighRdy = (INT8U) (YC) C = OSTCBPrioTbl(INT8U) (Y3) + Z )?counter; OSPrioHighRdy = (INT8U) (Y3) + Z); Z - = OSUnMapTblZ; /*如果可运行 Internet 进程的时间片都用完了,则给他们的 counter 重新赋值*/ If (C = 0) Z = OSRdyTblY; While (Z) OSTCBPrioTbl(Y3) + Z )?counter = O

14、S_COUNTER; Z - = OSUnMapTblZ; OSPrioHighRdy = (INT8U) (OSIntExitY3) +X ); If (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSW(); OS_EXIT_CRITICAL(); 4.2 OSTickISR( )与 OSTimeTick( )函数的修 改 在 TCB控制块中增加一项counter 作为任务调 度的权值以后,需要修改操作系统内核的时钟中断 服务函数,如果当前运行的任务属于 In

15、ternet 服务UC/OS- II 操作系统内核的改进 55 进程专用任务,即采用局部时间片轮转的任务调度 算法,则在时钟中断处理函数中,将当前运行任务 的 counter 减 1。在时钟中断返回的时候,再调用 OSIntExit( )对任务进行重新调度。其中修改后的时 钟节拍中断服务程序示意代码如下所示: /* 时钟节拍中断服务子程序示意代码 */ Void OSTickISR(void) 保存处理器寄存器的值; 调用 OSIntEnter()或者是将 OSIntNesting加 1; 调用 OSTimeTick() ; 调用 OSIntExit() ; 恢复处理器寄存器的值; 执行中断返

16、回指令; /*时钟节拍函数的一个节拍服务*/ Void OSTimeTick(void) /*将当前正在执行的任务的计数器 counter 减 1*/ OSTCBPrioTblOSPrioCur?counter - - ; 5. 结束语 本文在分析UC/OS- II与Linux任务调度内核的 基础上,针对 UC/OS- II 任务调度内核在 Internet 服 务上的不适应性,提出了一种改进方法。该方法涉 及任务控制块、任务调度函数的修改,充分考虑了 Internet 服务在时间上要求不苛刻, 在优先级上不进 行区分的特点,并结合了 Linux 任务调度算法。同 时,文中还给出了 OSSched( )与 OSIntExit( )函数的 具体改进代码,以及 OSTickISR

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

当前位置:首页 > 行业资料 > 其它行业文档

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