嵌入式系统算法综述1.doc
上传人:sy****28 上传时间:2024-09-15 格式:DOC 页数:4 大小:72KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

嵌入式系统算法综述1.doc

嵌入式系统算法综述1.doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

嵌入式系统论文专业:通信工程班级:0904班姓名:周晨学号:U200913881嵌入式实时操作系统中实时调度算法综述——速率单调算法引言实时调度是指在有限的系统资源下,为一系列任务决定何时运行,并分配任务运行除CPU之外的资源,以保证其时间约束、时序约束和资源约束得到满足。一个实时系统可以由单处理器系统来实现,也可以用多处理器系统来实现。实时调度算法是保障实时系统时限性和高可靠性的最重要手段之一。RTOS概述对一般的程序来说,大多数是考虑指令执行的逻辑顺序,指令何时执行并不重要。而对实时应用系统的程序就不一样,当外部某激励出现时,系统必须以一定的方式和在限定的时间内响应它,如果已超时,那怕执行结果是正确的,系统也认为是失效的。实时操作系统通常被分为软实时操作系统和硬实时操作系统。前者意味着偶尔错过时限是可以容忍的;后者意味着执行过程不但必须正确而且必须准时。在实时操作系统中,系统将程序分成许多任务(或进程),而每个任务的行为都预先可知,或者是有明确的功能,系统根据一定的调度原则,决定谁可取得执行权,这就是RTOS的核心所在。速率单调算法速率单调算法是一个经典的算法,它是针对那些响应和处理周期性事件的实时任务的。它事先为每个这样的实时任务,分配一个与事件频率成正比的优先级。例如,周期为20ms的实时任务,优先级为50;而周期为100ms的实时任务,优先级为10。运行时,调度程序总是调度优先级最高的就绪任务。必要时抢占当前正在运行的任务。实现时,就绪队列中的所有任务,按优先级Priority排队,优先级最高的任务排在队首。当处于运行态的任务,由于某种原因而挂起时,只要把就绪队列的首元素,从就绪队列中取下,使运行指针pRunTask指向该元素即可。如果是处于其他状态的任务变为就绪状态,而挂起就绪队列时,则必须对运行任务和就绪队列首元素的任务进行比较,优先级高的任务占有CPU。为了区分这两种方式,定义一个枚举型变量MODE:EnumMODE{SUSPEND一XIT,READY}同时,在内核中设置两个全局变量sehedulerFlag和sehedulerMode:BOOLEANSehedulerFlagEnumMODESchedulerMode;前者确定调度程序是否应该进行调度,后者确定按何种方式进行调度。内核在处理系统调用命令或处理其他中断的过程中,有些任务的状态可能发生变化,也可能没有发生什么变化。如果发生变化,就需要就行调度,相应的处理函数将把内核中的全局变量SchedulerFlag置为TRUE;而在调度程序处理完毕后,重新把它置为FALSE。这样,调度程序就可以根据sehedulerFlag,确定是否对任务进行实际的调度。当运行的任务被挂起,或者退出运行而引起调度时,把schedulerMode置为susPEND一xIT;当某个任务的状态由其他状态变为就绪,而引起调度时,把SehedulerMode置为READY。于是,调度程序Sehedule;的实现,就可说明如下,其程序为:voidScheduler(intPoliey){if(SehedulerFlag==TRUE){if(SehedulerMode==SUSpENDesEXIT)GetRunTask(Poliey);//取就绪队列第一个元素作为运行任务EISeTaskswiteh(Policy);//就绪队列第一个任务和运行任务互相切换}SehedulerFlag=False;}其流程图为:其中,函数GetRunTask按所规定的策略,取就绪队列第一个元素作为运行任务。此时,原运行任务的TCB,在该任务状态变化时,己插入挂起队列或静止队列。在此情况下,GetRUNTask的实现过程如下,其中,常数SRF表示数率优先策略。VOidGetRunTask(intPolicy){switeh(policy){easeSRF:PRunTask=GetReadyTask(NULL);//取就绪队列首元素SetTasktstate(PRunTask,RUN);//设置任务状态Break;......}}当SchedulerMode为READY时,这是某个任务的状态由其他状态变为就绪,而引起调度,这时,任务的TCB已按优先级插入就绪队列。所以,函数Taskswitch按Poficy所规定的策略,如果就绪队列的第一个任务的优先级高于当前运行的任务的优先级,就使就绪队列的第一个任务和运行任务互相切换。实现过程示意如下:Taskswiteh(intPolicy){TCB*PTask=GetReadyTask(NULL);switch(poliey){CaseSRF:If(pTas