51—TinyOS51嵌入式操作系统微小内核

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