您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 5.1—TinyOS51嵌入式操作系统微小内核
1第5章TinyOS51嵌入式操作系统微小内核5.1基础知识5.2最简单的多任务模型5.3协作式多任务操作系统5.4时间片轮询多任务操作系统5.5信号量5.6消息邮箱2第5章TinyOS51嵌入式操作系统本章说明:操作系统(OS)是计算机专业的一门专业基础课,理论教材比较抽象。本章所学内容是从80C51单片机应用出发,主要介绍一个基于80C51系列单片机,且全部使用C语言编写的开源操作系统微小内核——TinyOS51,其目的是帮助大家建立与操作系统有关的基本概念,如:任务,上下文与可重入性,任务的并发性与调度,以及信号量与消息邮箱的实现机理与程序设计基础,为今后深入学习专业级的操作系统与应用技术做好铺垫。3第5章TinyOS51嵌入式操作系统5.1基础知识5.1.1概述(介绍以下几个基本概念)1、协作式与抢占式OS2、用户任务(UserTask)与系统任务(SystemTask)3、并发性(Concurrent)与调度(Scheduling)4、任务状态5、任务之间的关系6、临界资源(CriticalResources)与临界区(CriticalSection)7、上下文切换(ContextSwitch)8、可重入性(Reentrant)4第5章TinyOS51嵌入式操作系统1、协作式与抢占式OS在操作系统的发展过程中,先后有2种形式的多任务管理机制,即协作式与抢占式。协作式:如果任务切换的时机完全取决于正在运行的任务,那么这样的操作系统就是协作式多任务操作系统。即任务执行时的权利比操作系统还大,只有等正在运行的任务完成后,才会将控制权交给操作系统,此时才能执行下一个任务。一旦某个任务运行出错,则导致整个系统挂起(Pending)。抢占式:如果任务优先运行的决定权取决于操作系统,而且即使有一个任务死掉,而系统仍能正常工作,那么这样的操作系统就是抢占式多任务操作系统。5第5章TinyOS51嵌入式操作系统2、用户任务(UserTask)与系统任务(SystemTask)在单片机应用系统设计中,为了提高系统的透明性、可移植性和强壮性,常将一个应用程序分解为许多“可执行的程序单元”。在监控模块的管理下,以“实参”和“形参”形式完成各模块之间的调用和返回。当使用操作系统时,如果将这些“可执行的程序单元”进行分类,即可得到在操作系统调度下的“用户任务”。此时,任务之间的信息传递是通过“异步”的方式来完成,即由操作系统的各种“通信”机制来实现,比如,信息量与消息邮箱等。与上述任务不同,操作系统有自己的“系统任务”,比如,空闲任务等。6第5章TinyOS51嵌入式操作系统3、并发性(Concurrent)与调度(Scheduling)调度器是每个内核的心脏,调度器提供决定何时执行何任务的算法。为了满足实时性要求,当有多个任务均处于就绪状态时,嵌入式实时操作系统可以让“一个已经就绪的高优先级任务”抢占另一个“正在运行的低优先级任务”的运行权而进入运行状态。如下图所示,任务A运行中,被任务B抢占而进入执行状态。它们的运行时间有重叠部分,这种运行方式称之为“并发运行”。7第5章TinyOS51嵌入式操作系统在实际的应用中,大多数嵌入式实时操作系统(RTOS)内核支持两种普遍的调度算法:基于优先级的抢占式调度和时间轮询式调度。8第5章TinyOS51嵌入式操作系统采用基于优先级“抢占式”的调度算法,就意味着一个“已经就绪的高优先级任务”可以剥夺另一个“正在运行的低优先级任务”的运行权而进入运行状态。如下图所示:9第5章TinyOS51嵌入式操作系统时间轮询调度为每个任务提供同份额的cpu执行时间。由于纯粹的时间轮询调度不能满足实时性系统要求,取而代之的是基于优先级抢占式调度扩充时间轮询调度,即对同样优先级的任务使用时间片获得相等的cpu分配时间,不同优先级的具有抢占权。10第5章TinyOS51嵌入式操作系统4、任务状态无论用户任务还是系统任务,在如何时候,每个任务至少包含:就绪(ready)、运行(running)、阻塞(blocked)在内的状态。随着实时系统的运行,每个任务根据简单的有限状态自动机(FSM)逻辑,从一个状态迁移到另一个状态。虽然内核可以定义多个任务状态组,但典型的OS中至少有3个主要的状态:就绪状态;运行状态;阻塞状态11第5章TinyOS51嵌入式操作系统就绪状态:当一个任务创立并准备运行时,内核将其放入就绪状态。但不能运行,因为有一个更高优先级的任务在执行,内核调度器根据优先级决定哪个任务先迁移到运行状态,但处于就绪状态的任务不能直接迁移到阻塞状态。运行状态:操作系统可让处于运行状态的低优先级任务暂停运行,转而执行另一个处于就绪状态的高优先级任务,这样正运行的任务就从运行状态迁移到了就绪状态。阻塞状态:当任务已经请求一个还不能用的资源,或已经请求等待某些事件的发生,或自身要延时一段时间,则任务都从运行状态迁移到阻塞状态。如果没有阻塞状态,那么较低优先级的任务将不能运行;如果更高优先级的任务没有设置成阻塞状态,则可能导致cpu处于饥饿状态。12第5章TinyOS51嵌入式操作系统图5.4任务执行状态图13第5章TinyOS51嵌入式操作系统5、任务之间的关系由于内存中可同时存在多个任务,且任务之间可能存在直接和间接的相互作用关系。直接作用只发生在相关任务之间,其相互之间的联系是有意安排的,它们需要相互协作来共同完成一个任务。间接作用是指任务之间因为某种中介(如共同使用同一设备)而发生了一定的关系,也就是说,它可以发生在相关任务之间,也可以发生在无关任务之间。从另一个角度来看任务间的相关关系,可以将任务之间的关系提炼为同步(Synchronization)与互斥(Exclusion)两种。14第5章TinyOS51嵌入式操作系统•任务同步:任务间的同步是一种直接作用,任务同步是指系统中的多个任务之间存在某种时序关系,需要相互协作才能共同完成一个任务。比如,一个任务运行到某个时间点时,需要另一个任务为它提供消息,在未获得消息之前,该任务处于阻塞状态,获得消息后被唤醒进入就绪状态。•任务互斥:任务间的互斥是一种间接作用,由于内存中的多个任务要求共享某一资源,而有些资源必须互斥,因此各任务之间只能竞争使用这些资源。15第5章TinyOS51嵌入式操作系统6、临界资源(CriticalResources)与临界区(CriticalSection)从上面的分析可以看出,任务间的互斥涉及到共享资源的竞争使用,因此竞争使用这些资源的任务在执行使用这些资源的程序时也会受到一定的限制,从而也就引出了临界资源与临界区的概念。(1)临界资源在操作系统中,将一次只允许一个任务(中断)使用的资源称之为临界资源。(2)临界区在操作系统中将并发任务中访问临界资源的程序称之为临界区,临界区也常叫做互斥区。16第5章TinyOS51嵌入式操作系统7、上下文切换(ContextSwitch)当硬件机制决定接受哪个中断时,则当前指令流暂停,转而执行一个上下文切换,而后cpu从执行当前指令流转换到执行另外的指令流。这种在中断发生时执行的替换指令集就是中断服务程序。将被中止的任务的“上下文信息”保存到“堆栈”中,当任务在重新运行时,则要将堆栈中的“上下文信息”在恢复到cpu的各个寄存器中,通过这样的上下文切换,可实现cpu的“无缝”接续运行。调度器从一个任务切换到另一个任务所开销的时间则称之为上下文切换时间。17第5章TinyOS51嵌入式操作系统图5.5上下文切换示意图18第5章TinyOS51嵌入式操作系统8、可重入性(Reentrant)由于任务的并发性,因此经常会出现调用同一个函数的情况,如果一段程序可以被多个任务同时调用,而不必担心数据被破坏,那么这样的程序就是可重入的程序。一般来说具有可重入性的函数应该只使用局部变量,因为函数的局部变量保存在cpu内部的寄存器或堆栈中,这样调用同一个函数时不会发生冲突。如果函数一定要使用全局变量,那么必须对使用的全局变量进行必要的保护。由此可见,C编译器也应该具有产生可重入代码的能力。19第5章TinyOS51嵌入式操作系统5.1.2setjmp.h头文件与中止函数about()和退出函数exit()相比,初看起来,goto语句处理异常更可行,但是,goto语句只能在函数内部跳转,即不能从一个函数直接跳转到另一个函数。为此,标准C函数库提供了setjmp()和longjmp()函数,setjmp()函数相当于非局部标号,longjmp()函数相当于goto的作用,从而解决了从一个函数直接跳转到另一个函数的问题,即非局部跳转。头文件setjmp.h申明了这些函数及同时所需的jmp_buf数据类型。20第5章TinyOS51嵌入式操作系统1、非局部远程跳转要实现非局部跳转,都可以使用setjmp.h,该头文件提供了以下必须的机制:•jmp_buf是一个数组类型变量,可将它当做“标号”数据对象类型来看待,用于存放恢复调用环境所需要的上下文信息。•setjmp将程序的上下文信息保存到跳转“缓冲区(jmp_buf类型的数组)”,当稍后调用longjmp时,将保存在缓冲区中的上下文信息作为返回地点标记;•无论在何地调用longjmp,将恢复最后一次由setjmp调用保存在“缓冲区”中的上下文信息,实现非局部远程跳转。21第5章TinyOS51嵌入式操作系统2、保存调用环境名称所属类别格式输入参数setjmp()流程控制#includesetjmp.hintsetjmp(jmp_bufenvironment)environment:用于保存当前环境的jmp_buf数组表5.1setjmp()函数下表所示的setjmp是C标准库中的一个函数,setjmp使用jmp_buf类型数组environment变量来记录现在的位置,即变量bp的当前值、堆栈指针值(SP)和函数的返回地址addr15~addr0,供以后longjmp恢复该环境时使用。bp是在SDCC中定义的一个虚拟寄存器,用于简化重入操作。22第5章TinyOS51嵌入式操作系统bp是在SDCC中定义的一个虚拟寄存器,用于简化重入操作。书P186,对局部变量与bp做了描述说明以及在堆栈中的变化如下图所示,可参考。函数返回地址1函数返回地址0cbp原值abSP=SP+4bpSP(c)使用bp访问变量函数返回地址1函数返回地址0cabSP=SP+3SP(b)定义了3个变量函数返回地址1函数返回地址0SP(a)进入函数后23第5章TinyOS51嵌入式操作系统3、jmp_buf由于jmp_buf主要用于保存当前调用的上下文信息,为相应的longjmp调用作为返回地点标记,因此保存在缓冲区jmp_buf中的上下文信息,至少包括变量bp的当前值、堆栈指针的当前值(sp)、高8位和低8位返回地址addr15~addr0。其中的bp是在SDCC51中定义的一个虚拟寄存器,用户不必关心变量bp的变化。addr15~addr8addr7~addr0SPbpenvironment图5.7上下文信息Jmp_buf[4]24第5章TinyOS51嵌入式操作系统4、恢复调用环境longjmp也是C标准库中的一个函数,longjmp表示回到跳转缓冲区jmp_buf类型数组environment变量记录的位置,恢复setjmp调用所保存的变量bp的当前值、堆栈指针值和函数的返回地址addr15~addr0,转移到setjmp调用处继续执行。名称所属类别格式输入参数longjmp()流程控制#includesetjmp.hintlongjmp(jmp_bufenvironment,intretval)environment:所要恢复的环境,该环境是由setjmp()函数调用保存的retval:传送给setjmp()函数作为该函数调用返回值的表达式表5.2longjmp()函数25第5章TinyOS51嵌入式操作系统尽管longjmp会导致程序转移,但它和goto有所不同,其区别
本文标题:5.1—TinyOS51嵌入式操作系统微小内核
链接地址:https://www.777doc.com/doc-5166066 .html