传统的嵌入式系统设计大多采用单任务顺序机制,应用程序是一个无限的大循环,所有的事件都按顺序执行,与时间相关性较强的事件靠定时中断来保证。
由此带来系统的稳定性、实时性较差;尤其当系统功能较复杂,且对实时性要求较严格时,这种单任务机制的弱点暴露无遗。本文引入的嵌入式操作系统μC/OS-II是一个多任务的实时内核,主要提供任务管理功能。在实时系统中的多个任务,必须决定这些任务的优先级顺序,任务调度算法需要动态为就绪任务的优先级排序。为了满足对实时性要求越来越高的需要,同时避免频繁改变就绪任务的优先级,在分析μC/OS-II源代码的基础上,对其调度算法进行改进。
1 μC/OS-II概述
μC/OS-II是一个完整的,可移植、可固化、可裁剪的占先式实时多任务内核;支持56个用户任务,支持信号量、邮箱、消息队列等常用的进程间通信机制;适用于各种微控制器和微处理器;所有代码用ANSI C语言编写,程序的可读性强,具有良好的可移植性,已被移植到多种处理器架构中,在某些实时性要求严格的领域中得到广泛应用。
1.1 工作原理
μC/OS-II的核心工作原理是:近似地让最高优先级的就绪任务处于运行状态。首先初始化MCU,再进行操作系统初始化,主要完成任务控制块TCB初始化,TCB优先级表初始化,TCB链表初始化,事件控制块(ECB)链表初始化,空任务的创建等。然后,开始创建新任务,并可在新创建的任务中再创建其他新任务。最后,诃用OSStart()函数启动多任务调度。在多任务调度开始后,启动时钟节拍源开始计时,此节拍源给系统提供周期性的时钟中断信号,实现延时和超时确认。
1.2 任务调度
操作系统在下面的情况下进行任务调度:中断(系统占用的时间片中断OSTimeTick()、用户使用的中断)和调用API函数(用户主动调用)。一种是当时钟中断来临时,系统把当前正在执行的任务挂起,保护现场,进行中断处理,判断有无任务延时到期;若没有别的任务进入就绪态,则恢复现场继续执行原任务。另一种调度方式是任务级的调度,即调用API函数(由用户主动调用),足通过发软中断命令或依靠处理器在任务执行中调度。当没有任何任务进入就绪态时,就去执行空任务。 2 调度算法的改进
2.1 实时系统的调度策略
在操作系统的多任务调度算法的设计上,要根据系统的具体需求来确定调度策略。实时调度策略按不同的方法可以分为:静态/动态,基于优先级/不基于优先级,抢占式/非抢占式,单处理器/多处理器。其中,静态是指在任务的整个生命期内优先级保持不变,任务的优先级是在系统建立任务时确定的;动态是指在任务的生命期内,随时确定或改变它的优先级别,以适应系统工作环境和条件的变化。
μC/OS-II系统采用的是静态优先级分配策略,由用户来为每个任务指定优先级。虽然任务的优先级可通过OSTaskChangePrio()函数改变,但函数功能简单,仅以用户指定的新优先级来替换任务当前的优先级。随着实时嵌入式技术的发展,对嵌入式系统的实时性要求越来越高,多样化的调度方法己成为一种趋势。本文讨论动态优先级调度中的最优算法截止期最早优先算法的改进及其在μC/OS-II中的实现。
2.2 调度算法的改进
截止期最早优先算法是动态优先级调度算法中的最优算法。在截止期最早优先算法中,系统按任务的截止期给每个任务分配优先级。任务的截止期越早其优先级越高,反之亦然。为此,在本文所述截止期最早优先算法的改进中.需在μC/OS-II系统中增加表l所列的项目。 ![](http://embed.chinaitlab.com/UploadFiles_4615/200809/20080905090950634.jpg)
在截止期最早优先算法中,需要用户为任务指定其截止期。在本改进中,将OSTaskCreate()和OSTaskCreateExt()中的参数INT8U Prio改为INT8U deadline,并在函数内定义局部变量INT8U Prio来记录分配给任务的优先级。 |