微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式操作系统任务切换方法对比分析

嵌入式操作系统任务切换方法对比分析

时间:07-02 来源:21ic 点击:

引言

嵌入式系统在航天、军事、工控以及家电等方面得到了广泛应用。大量的嵌入式系统具有实时性的要求,但是由于体积、能耗、价格等方面的约束,其处理器速度往往比较慢,存储器容量也有限。而传统的实时操作系统难以简单地移植到嵌入式系统中,所以需要重新开发针对嵌入式系统特性的实时操作系统。任务调度策略是实时系统内核的关键部分,如何进行任务调度,使得各个任务能在其期限之内得以完成,是实时操作系统的重要研究领域。而不同的操作系统对任务调度的机制也有所不同,本文对目前比较流行的操作系统--VxWorks、μClinux、μC/OS-II、Windows CE的任务切换机制进行分析和比较。

  1 操作系统介绍

  1.1 VxWorks

  VxWorks是美国WindRiver公司的产品,是目前嵌入式系统领域中应用很广泛、市场占有率比较高的嵌入式操作系统。VxWorks实时操作系统由400多个相对独立、短小精悍的目标模块组成,用户可根据需要选择适当的模块来裁剪和配置系统;提供基于优先级的任务调度、任务间同步与通信、中断处理、定时器和内存管理等功能,内建符合POSIX(可移植操作系统接口)规范的内存管理,以及多处理器控制程序;具有简明易懂的用户接口,在核心方面甚至可以微缩到8KB。

  1.2 μC/OS-lI

  μC/OS-II是在μC/OS的基础上发展起来的,是美国嵌入式系统专家Jean J.Lal3rosse用C语言编写的一个结构小巧、抢占式的多任务实时内核。μC/OS-II能管理64个任务,并提供任务调度与管理、内存管理、任务间同步与通信、时间管理和中断服务等功能,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点。

  1.3 Linux

  Linux是一种自由的Unix类多用户、多任务操作系统,可运行在Intel 80386及更高档次的PC、ARM、DECAlpha等多种计算机平台上,已经成为应用广泛、可靠性高、功能强大的计算机操作系统。

  1.4 WindOWS CE

  微软Windows CE是一个开放且多样化的32位嵌入式操作系统。其设计目的是为符合广泛的智能设备的需求,例如从企业工具(如工业控制器、通信集线器和收款机系统)到电子消费性产品(如摄影机、电话和家庭娱乐设备等),提供自动控制、视听娱乐、行动计算、终端机等各个应用领域一个稳定、实时及多任务的操作系统。

  2 任 务

  2.1 任务切换概述

  上下文切换(context switch),其实际含义是任务切换,或者CPU寄存器切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,也就是CPU寄存器中的全部内容。这些内容被保存在任务自己的堆栈中,入栈工作完成后就把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU寄存器,并开始下一个任务的运行,这一过程就是context switch。

每个任务都是整个应用的一部分,都被赋予一定的优先级,有自己的一套CPU寄存器和栈空间,如图1所示。

  2.2 任务的切换与调度

  μC/OS-II是可抢占实时多任务内核,它总是运行优先级最高的就绪任务,不支持时间片轮转调度法,每个任务的优先级要求不一样,且是唯一的。它有5种状态,如图2所示。

当一个任务在运行状态中时,如果没有关闭中断,就有可能被中断打断,去执行中断服务子程序ISR。执行完后内核要判断此时是否有更高优先级,新的任务就绪,如果有则原有的任务被抢占,实现了任务的切换。

  当一个任务在运行状态中时,调用OSTimeDly()或OSTimeDlyHMSM()函数,该任务进入等待状态,一直到延时时间到,这2个函数立即强制执行任务切换,让下一个优先级最高的就绪任务运行。当然,如果运行的任务需要等待某一事件的发生,可以调用一些函数(如OSFlag Pend()、OSSemPend()、OSMutexPend()、OSMboxPend()、OSQPrnd()等)挂起该任务,来实现任务的切换。

  实际的任务切换是调用OS_TASK_SW()函数。OS_TASK_SW()是一个宏,是在μC/OS-II从低优先级切换到高优先级任务时须用到的。OS_TA-SK_SW()总是在任务级代码中被调用。另一个函数OSIntExit()用在中断服务子程序ISR中。当中断任务子程序使更高优先级任务进入就绪态时,OSintExit()完成任务切换功能,任务切换只是简单地将处理器的寄存器保存到将被挂起的任务的堆栈中,并且从堆栈中恢复要运行的更高优先级的任务。

μC/OS-II总是运行进入就绪态任务中优先级最高的任务,确定哪个任务优先级最高,以及下面该哪个任务运行。这一工作是由调度器完成的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。该工作由函数OSSched()完成。中断级的调度由OS-intExt()完成。代码如下:

在Linux系统中,任务的上下文切换和调度比较复杂。Linux的上下文切换功能是由context_switch()函数完成的。代码如下:

context_switch()完成了2个工作:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top