TinyOS51嵌入式操作系统微小内核ppt课件.ppt
《TinyOS51嵌入式操作系统微小内核ppt课件.ppt》由会员分享,可在线阅读,更多相关《TinyOS51嵌入式操作系统微小内核ppt课件.ppt(94页珍藏版)》请在三一办公上搜索。
1、1,第5章 TinyOS51嵌入式操作系统微小内核,5.1 基础知识5.2 最简单的多任务模型5.3 协作式多任务操作系统5.4 时间片轮询多任务操作系统5.5 信号量5.6 消息邮箱,2,第5章 TinyOS51嵌入式操作系统,本章说明: 操作系统(OS)是计算机专业的一门专业基础课,理论教材比较抽象。 本章所学内容是从80C51单片机应用出发,主要介绍一个基于80C51系列单片机,且全部使用C语言编写的开源操作系统微小内核TinyOS51 ,其目的是帮助大家建立与操作系统有关的基本概念,如:任务,上下文与可重入性,任务的并发性与调度,以及信号量与消息邮箱的实现机理与程序设计基础,为今后深入
2、学习专业级的操作系统与应用技术做好铺垫。,3,第5章 TinyOS51嵌入式操作系统,5.1 基础知识,5.1.1 概述 (介绍以下几个基本概念)1、协作式与抢占式OS2、用户任务(User Task)与系统任务(System Task) 3、并发性(Concurrent)与调度(Scheduling)4、任务状态5、任务之间的关系6、临界资源(Critical Resources)与临界区(Critical Section)7、上下文切换(Context Switch)8、可重入性(Reentrant),4,第5章 TinyOS51嵌入式操作系统,1、协作式与抢占式OS 在操作系统的发展过程
3、中,先后有2种形式的多任务管理机制,即协作式与抢占式。 协作式:如果任务切换的时机完全取决于正在运行的任务,那么这样的操作系统就是协作式多任务操作系统。即任务执行时的权利比操作系统还大,只有等正在运行的任务完成后,才会将控制权交给操作系统,此时才能执行下一个任务。一旦某个任务运行出错,则导致整个系统挂起(Pending)。 抢占式:如果任务优先运行的决定权取决于操作系统,而且即使有一个任务死掉,而系统仍能正常工作,那么这样的操作系统就是抢占式多任务操作系统。,5,第5章 TinyOS51嵌入式操作系统,2、用户任务(User Task)与系统任务(System Task) 在单片机应用系统设计
4、中,为了提高系统的透明性、可移植性和强壮性,常将一个应用程序分解为许多“可执行的程序单元”。在监控模块的管理下,以“实参”和“形参” 形式完成各模块之间的调用和返回。 当使用操作系统时,如果将这些“可执行的程序单元”进行分类,即可得到在操作系统调度下的“用户任务”。此时,任务之间的信息传递是通过“异步”的方式来完成,即由操作系统的各种“通信”机制来实现,比如,信息量与消息邮箱等。 与上述任务不同,操作系统有自己的“系统任务”,比如,空闲任务等。,6,第5章 TinyOS51嵌入式操作系统,3、并发性(Concurrent)与调度(Scheduling) 调度器是每个内核的心脏,调度器提供决定何
5、时执行何任务的算法。为了满足实时性要求,当有多个任务均处于就绪状态时,嵌入式实时操作系统可以让“一个已经就绪的高优先级任务”抢占另一个“正在运行的低优先级任务”的运行权而进入运行状态。 如下图所示,任务A运行中,被任务B抢占而进入执行状态。它们的运行时间有重叠部分,这种运行方式称之为“并发运行”。,7,第5章 TinyOS51嵌入式操作系统,在实际的应用中,大多数嵌入式实时操作系统(RTOS)内核支持两种普遍的调度算法:基于优先级的抢占式调度和时间轮询式调度。,8,第5章 TinyOS51嵌入式操作系统,采用基于优先级“抢占式”的调度算法,就意味着一个“已经就绪的高优先级任务”可以剥夺另一个“
6、正在运行的低优先级任务”的运行权而进入运行状态。 如下图所示:,9,第5章 TinyOS51嵌入式操作系统,时间轮询调度为每个任务提供同份额的cpu执行时间。由于纯粹的时间轮询调度不能满足实时性系统要求,取而代之的是基于优先级抢占式调度扩充时间轮询调度,即对同样优先级的任务使用时间片获得相等的cpu分配时间,不同优先级的具有抢占权。,10,第5章 TinyOS51嵌入式操作系统,4、任务状态 无论用户任务还是系统任务,在如何时候,每个任务至少包含:就绪(ready)、运行(running)、阻塞(blocked)在内的状态。随着实时系统的运行,每个任务根据简单的有限状态自动机(FSM)逻辑,从
7、一个状态迁移到另一个状态。 虽然内核可以定义多个任务状态组,但典型的OS中至少有3个主要的状态:就绪状态 ;运行状态; 阻塞状态,11,第5章 TinyOS51嵌入式操作系统,就绪状态:当一个任务创立并准备运行时,内核将其放入就绪状态。但不能运行,因为有一个更高优先级的任务在执行,内核调度器根据优先级决定哪个任务先迁移到运行状态,但处于就绪状态的任务不能直接迁移到阻塞状态。运行状态:操作系统可让处于运行状态的低优先级任务暂停运行,转而执行另一个处于就绪状态的高优先级任务,这样正运行的任务就从运行状态迁移到了就绪状态。阻塞状态:当任务已经请求一个还不能用的资源,或已经请求等待某些事件的发生,或自
8、身要延时一段时间,则任务都从运行状态迁移到阻塞状态。如果没有阻塞状态,那么较低优先级的任务将不能运行;如果更高优先级的任务没有设置成阻塞状态,则可能导致cpu处于饥饿状态。,12,第5章 TinyOS51嵌入式操作系统,图5.4 任务执行状态图,13,第5章 TinyOS51嵌入式操作系统,5、任务之间的关系 由于内存中可同时存在多个任务,且任务之间可能存在直接和间接的相互作用关系。 直接作用只发生在相关任务之间,其相互之间的联系是有意安排的,它们需要相互协作来共同完成一个任务。 间接作用是指任务之间因为某种中介(如共同使用同一设备)而发生了一定的关系,也就是说,它可以发生在相关任务之间,也可
9、以发生在无关任务之间。 从另一个角度来看任务间的相关关系,可以将任务之间的关系提炼为同步(Synchronization)与互斥(Exclusion)两种。,14,第5章 TinyOS51嵌入式操作系统,任务同步: 任务间的同步是一种直接作用,任务同步是指系统中的多个任务之间存在某种时序关系,需要相互协作才能共同完成一个任务。比如,一个任务运行到某个时间点时,需要另一个任务为它提供消息,在未获得消息之前,该任务处于阻塞状态,获得消息后被唤醒进入就绪状态。 任务互斥: 任务间的互斥是一种间接作用,由于内存中的多个任务要求共享某一资源,而有些资源必须互斥,因此各任务之间只能竞争使用这些资源。,15
10、,第5章 TinyOS51嵌入式操作系统,6、临界资源(Critical Resources)与临界区(Critical Section) 从上面的分析可以看出,任务间的互斥涉及到共享资源的竞争使用,因此竞争使用这些资源的任务在执行使用这些资源的程序时也会受到一定的限制,从而也就引出了临界资源与临界区的概念。(1)临界资源 在操作系统中,将一次只允许一个任务(中断)使用的资源称之为临界资源。(2)临界区 在操作系统中将并发任务中访问临界资源的程序称之为临界区,临界区也常叫做互斥区。,16,第5章 TinyOS51嵌入式操作系统,7、上下文切换(Context Switch) 当硬件机制决定接受
11、哪个中断时,则当前指令流暂停,转而执行一个上下文切换,而后cpu从执行当前指令流转换到执行另外的指令流。这种在中断发生时执行的替换指令集就是中断服务程序。 将被中止的任务的“上下文信息”保存到“堆栈”中,当任务在重新运行时,则要将堆栈中的“上下文信息”在恢复到cpu的各个寄存器中,通过这样的上下文切换,可实现cpu的“无缝”接续运行。 调度器从一个任务切换到另一个任务所开销的时间则称之为上下文切换时间。,17,第5章 TinyOS51嵌入式操作系统,图5.5 上下文切换示意图,18,第5章 TinyOS51嵌入式操作系统,8、可重入性(Reentrant) 由于任务的并发性,因此经常会出现调用
12、同一个函数的情况,如果一段程序可以被多个任务同时调用,而不必担心数据被破坏,那么这样的程序就是可重入的程序。 一般来说具有可重入性的函数应该只使用局部变量,因为函数的局部变量保存在cpu内部的寄存器或堆栈中,这样调用同一个函数时不会发生冲突。如果函数一定要使用全局变量,那么必须对使用的全局变量进行必要的保护。由此可见,C编译器也应该具有产生可重入代码的能力。,19,第5章 TinyOS51嵌入式操作系统,5.1.2 头文件,与中止函数about()和退出函数exit()相比,初看起来,goto语句处理异常更可行,但是,goto语句只能在函数内部跳转,即不能从一个函数直接跳转到另一个函数。 为此
13、,标准C函数库提供了setjmp()和longjmp()函数,setjmp()函数相当于非局部标号,longjmp()函数相当于goto的作用,从而解决了从一个函数直接跳转到另一个函数的问题,即非局部跳转。头文件申明了这些函数及同时所需的jmp_buf数据类型。,20,第5章 TinyOS51嵌入式操作系统,1、非局部远程跳转 要实现非局部跳转,都可以使用,该头文件提供了以下必须的机制: jmp_buf是一个数组类型变量,可将它当做“标号”数据对象类型来看待,用于存放恢复调用环境所需要的上下文信息。 setjmp将程序的上下文信息保存到跳转“缓冲区(jmp_buf类型的数组)” ,当稍后调用l
14、ongjmp时,将保存在缓冲区中的上下文信息作为返回地点标记; 无论在何地调用longjmp,将恢复最后一次由setjmp调用保存在“缓冲区”中的上下文信息,实现非局部远程跳转。,21,第5章 TinyOS51嵌入式操作系统,2、保存调用环境,下表所示的setjmp是C标准库中的一个函数,setjmp使用jmp_buf类型数组environment变量来记录现在的位置,即变量bp的当前值、堆栈指针值(SP)和函数的返回地址addr15addr0,供以后longjmp恢复该环境时使用。bp是在SDCC中定义的一个虚拟寄存器,用于简化重入操作。,22,第5章 TinyOS51嵌入式操作系统,bp是
15、在SDCC中定义的一个虚拟寄存器,用于简化重入操作。书P186,对局部变量与bp做了描述说明以及在堆栈中的变化如下图所示,可参考。,23,第5章 TinyOS51嵌入式操作系统,3、jmp_buf 由于jmp_buf主要用于保存当前调用的上下文信息,为相应的longjmp调用作为返回地点标记,因此保存在缓冲区jmp_buf中的上下文信息,至少包括变量bp的当前值、堆栈指针的当前值(sp)、高8位和低8位返回地址addr15addr0。,其中的bp是在SDCC51中定义的一个虚拟寄存器,用户不必关心变量bp的变化。,24,第5章 TinyOS51嵌入式操作系统,4、恢复调用环境,longjmp也
16、是C标准库中的一个函数,longjmp表示回到跳转缓冲区jmp_buf类型数组environment变量记录的位置,恢复setjmp调用所保存的变量bp的当前值、堆栈指针值 和函数的返回地址addr15addr0,转移到setjmp调用处继续执行。,25,第5章 TinyOS51嵌入式操作系统,尽管longjmp会导致程序转移,但它和goto有所不同,其区别如下: goto语句不能跳出C语言的当前函数; longjmp只能跳回曾经到过的地方。 与此同时,setjmp与longjmp必须协同工作,它们有严格的执行顺序,必须先调用setjmp,然后再调用longjmp,以恢复到先前被保存的“程序执
17、行点”。如果setjmp调用之前执行了longjmp,则程序的执行流程变得不可预见,从而导致程序崩溃而退出。,26,第5章 TinyOS51嵌入式操作系统,5.1.3 变量命名规则,1、概述 变量命名使用类匈牙利命名法:变量名最多由三部分组成:作用域,类型,描述 。 作用域:变量的作用范围,确定管理的有效范 围是在函数体外还是在函数体内。 类型:该变量的类型,使用小写字母。如:整型等 描述:完全准确地描述出该变量所代表的事物。 如:Max,Error,New等。,27,第5章 TinyOS51嵌入式操作系统,2、作用域 作用域是变量名字的第一部分,只有三种情况:局部变量、模块内全局变量、应用程
18、序全局变量,其定义见下表。,28,第5章 TinyOS51嵌入式操作系统,3、类型缩写 类型是变量名字第二部分,使用缩写形式,见表5.44、变量描述5、变量类型缩写 TinyOS51中定义了一些变量类型,见表5.5,29,第5章 TinyOS51嵌入式操作系统,5.1.4 范例分析,非局部跳转控制范例程序清单5.5(P190),说明了setjmp函数和longjmp函数的具体作用。,30,第5章 TinyOS51嵌入式操作系统,5.1.5 setjmp与longjmp的实现,setjmp和longjmp是标准库函数,其具体实现与编译器有很大关联,且与硬件有密切的关系,所以它们往往都是由汇编语言
19、编写的。本书实例中,为了简化这两个函数,约定以下规则: 限定SDCC51为小模式; 限定SDCC51的integer和long库被编译成可重入的; 限定SDCC51所有函数被编译成可重入的; 修改setjmp和longjmp的返回值为char; 取消longjmp的第二参数,当调用longjmp时,则让setjmp的返回值始终为1;,31,第5章 TinyOS51嵌入式操作系统,1、jmp_buf (TinyOS51中定义的变量类型,见表5.5) jmp_buf 定义程序清单(setjmp.h) 30 #define _SP_SIZE 1 /堆栈指针长度31 #define _BP_SIZE
20、_SP_SIZE /编译器虚拟寄存器,用于重入32 #define _RET_SIZE 2 /返回地址长度33 typedef unsigned char jmp_buf_RET_SIZE+_SP_SIZE+_BP_SIZE ;,32,第5章 TinyOS51嵌入式操作系统,2、setjmp的实现 setjmp就是将相应的寄存器和返回地址保存到jmp_buf数组类型的jbBuf变量中,即保存的寄存器为变量bp的当前值、堆栈指针的当前值、高8位和低8位返回地址值。对于80C51单片机来说,由于调用函数是使用ACALL或LCALL指令来实现的,因此这些指令会将函数的返回地址保存在堆栈中。 setj
21、mp()定义详见如下程序清单。,33,第5章 TinyOS51嵌入式操作系统,setjmp() 定义(_setjmp.c) 程序清单30 extern unsigned char bp; /编译器为简化重入操作而定义的变量39 char setjmp(jmp_buf jbBuf)40 data unsigned char *pucBuf=(data void*)0; /指向上下文信息存储位置的指针 pubBuf =(data unsigned char *)jbBuf ; /将jbBuf数组的首地址赋给pucBuf *pucBuf+ = bp /保存bp的当前值 *pucBuf+ = SP /
22、保存SP的当前值 *pucBuf+ = *(data unsigned cahr *)SP); /保存返回地址高8位 *pucBuf = *(data unsigned cahr *)(char)(SP-1); /保存返回地址低8位 return () ,34,第5章 TinyOS51嵌入式操作系统,见P192,下图是setjmp()的执行过程说明。,35,第5章 TinyOS51嵌入式操作系统,3、longjmp的实现 在setjmp()定义中,其存储顺序依次是bp、SP、返回地址高8位、低8位。,那么,longjmp()的定义就是按照上述顺序恢复即可,最后函数返回1。 longjmp()定
23、义(_longjmp.c)的程序清单见书P193.,36,第5章 TinyOS51嵌入式操作系统,见P193,下图是longjmp()执行过程说明。,37,第5章 TinyOS51嵌入式操作系统,5.2 最简单的多任务模型,5.2.1 两任务切换模型 两任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。如果搞清楚了两个任务间的任务切换,那么也就搞清楚了多任务操作系统核心的基本原理。 在源代码层次,“任务”也是函数,所以很自然想到,可以使用setjmp()和longjmp()函数实现任务间的切换。假设两个任务已运行起来,则任务间的切换模型见下图,其切换程序流向及状态机见下
24、程序清单。,38,第5章 TinyOS51嵌入式操作系统,两任务切换模型图示:,39,第5章 TinyOS51嵌入式操作系统,5.9,40,第5章 TinyOS51嵌入式操作系统,5.2.2 待解决的问题1、如何让任务互不干扰地运行? 函数在运行期间可能被中断打断,转而执行中断服务程序。中断服务程序不改变80C51的内部寄存器值,所以,中断不会干扰任务的运行。在源代码层次,任务也是一个函数,任务正确运行的条件与函数一致。2、如何让任务运行? 两个任务切换,必须要先执行一个setjmp()函数,系统在启动时没有任务存在,即先前也没有执行过一个setjmp(),即无法切换。为解决此矛盾,可在创建任
25、务task1时,系统用另一个函数(假设为setTaskJmp())模拟任务task1调用setjmp()函数,而事实上只要两者执行效果一致,即可。,41,第5章 TinyOS51嵌入式操作系统,5.2.3 setTaskJmp()的实现任务调用setjmp()所做的工作如下: 将返回地址压人“任务堆栈”(即使用ACALL或LCALL指令),此时堆栈指针SP的值增加2; 保存bp到任务上下文中; 保存堆栈指针SP(指向任务堆栈)到任务上下文中; 保存“返回地址”到任务上下文中。搞清楚任务调用setjmp()的工作,用setTaskJmp()来模拟实现setjmp(),其程序清单见P197-5.1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- TinyOS51 嵌入式 操作系统 微小 内核 ppt 课件
链接地址:https://www.31ppt.com/p-1829906.html