毕业论文

当前位置 /首页/学习经验/毕业论文/列表

基于μC/OS-II操作系统的任务调度机制

基于μC/OS-II操作系统的任务调度机制

  论文关键词:μC/OS-II;多任务;任务调度

  论文摘要:μC/OS-II操作系统之所以在10多年的时间里作为一个嵌入式实时的多任务操作系统得到了广泛的应用,原因之一是它的任务机制存在许多的优点。多任务运行的最大难点就在于多任务的调度。
   WANG Yu-rong,ZHU Jian-bin
  (Computer Science College Wuhan University of Science and Engineering,Wuhan 430073,China)
  Abstract:As a multi-task embedded real time operation system, μC/OS-II Operating Systems has been widely used in more ten of the reason is that the Operating Systems has many hardest point is the schedul of tasks when we run multi-task Operating Systems.
  Key words:μC/OS-II;Multi-task;task-scheduling
  
  1 引言
  
  嵌入式系统是一种应用范围非常广泛的系统。可以这样理解,除了桌面和服务器外所有计算设备都属于嵌入式系统。在短短十多年的时间里,伴随着微技术、软件技术的发展,嵌入式系统被广泛的用于如生物仪器、智能汽车、设备、网络设备、仪器仪表、手持设备等诸多领域。[1] 它是以应用为中心的,而嵌入式操作系统则是嵌入式系统应用中的核心。
  嵌入式系统是计算机硬件和软件的结合体,或许还加上等其他部分,被设计来完成专门的功能。在一些情况下,嵌入式系统是一个大的系统或产品的一部分,就象汽车上的防抱死装置,与通用计算机相对。最初的嵌入式系统是不带操作系统的,只是用来完成某一个特定的单一功能,随着软硬件技术的发展,完成单一功能的嵌入式系统已经不能适应的需要,因此出现了带操作系统的嵌入式系统。现在嵌入式系统的准确定义是:以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可剪裁的,适用于对功能、可靠性、、体积、功耗等综合性能有严格要求的专用计算机系统。[2]
  μC/OS-II操作系统是一个完整的,可移植、固化、裁剪的占先式实时多任务操作系统。它之所以这么受欢迎,其中一个很重要的方面是因为它的实时性和多任务管理机制。由此可见它对任务的管理是成功的。在μC/OS-II操作系统中,一个任务,也称作一个线程,就是一个简单的程序,这个程序在执行时可以任务CPU完全属于该程序自己。而多任务的运行实际上并不是有多个CPU让多任务使用,而是靠CPU在多个任务间的转换和调度。
  
  2 任务状态
  
  μC/OS-II操作系统的任务状态有五种,分别是睡眠态、就绪态、运行态、等待状态和中断服务态。
  睡眠态是指程序还在存储设备中,还没有被μC/OS-II操作系统管理,此时的任务只能通过任务创建函数才能脱离此状态,调用创建任务函数后,任务才能从睡眠态变成就绪态,在这个意义上来说,睡眠态就是μC/OS-II操作系统的入口,而任务创建函数就是入口的钥匙。[3]
  任务被建立后,任务就进入到了就绪态,准备运行了。如果新建立任务的优先级高于就绪态中的其他任务的优先级,则新建立的任务就会立即得到CPU的使用权,会被优先执行,从而进入到运行态;而在就绪态的任务也可以通过调用任务删除函数回到睡眠态。
  由于任何时刻只有一个任务处于运行态,所以一旦运行态中的任务被剥夺了CPU的使用权,它就从运行态回到等待状态。也可以通过人为的控制邮箱、信号量、延迟时间等使正在运行的任务从运行态转到等待状态。如果正在运行的任务是允许中断的,此时若中断服务程序正好到来,正在运行的任务也会进入中断服务状态,而进入中断服务状态的'任务只有中断任务把CPU的控制权还给中断前的任务时,才能从中断服务状态退出来。运行态的任务也是可以被删除的,如果此时调用了任务删除函数,运行态的任务也会直接回到睡眠态。
  一旦正在运行的任务通过将自己延迟一段时间或是由于要等待某一事件的发生而进入到了等待状态,如果延迟时间满,或是等待的某一事件发生了,任务就进入到了就绪态;或者等待状态的任务被删除了,那么它也会进入到睡眠态。由此看来,睡眠态又是μC/OS-II操作系统的出口,而出口的钥匙是任务删除函数,与任务建立函数相对。
  
  3 任务调度
  
  μC/OS-II操作系统总是运行进入就绪态任务中优先级最高的任务。它可以管理多达64个任务,但目前的版本里已经有两个任务被系统占用。一般来说用户可以使用从优先级4到优先级OS_LOWEST_PRIO-4一共56个优先级。对于多任务的管理,μC/OS-II操作系统是通过调度器完成了。其中任务级的调度是由函数OSSched()完成,而中断级的调度是通过函数OSIntExiT()完成。这两个函数是很相似的,所不同的其中一点就是OSSched()调用了任务切换函数OS_TASK_SW(),而退出中断服务子程序OSIntExiT()却调用的是OSIntCtxSw()函数。这是因为中断服务子程序已经将CPU寄存器存入到中断了的任务的堆栈中,所以只需要恢复堆栈中的内容即可。