《第10章RTX51实时操作系统课件》由会员分享,可在线阅读,更多相关《第10章RTX51实时操作系统课件(47页珍藏版)》请在金锄头文库上搜索。
1、第10章 RTX51实时操作系统,主要内容 操作系统基本概念 RTX51系统特点 RTX51的程序结构 RTX51的功能函数 RTX51的任务调度 RTX51的系统配置 RTX51的应用举例,10.1 操作系统基本概念10.1.1 前后台系统,前后台系统的组成:前台和后台程序 后台:是一个无限循环的应用程序,循环中调用相应的任务函数完成相应的操作,各个任务依次运行,没有调度,运行的次序不能改变。 前台:是中断服务程序,处理异步事件。,适用情形: 一般不复杂且实时性要求不高的小系统很适合采用前后台系统,例如微波炉、电话机、玩具等。 在另外一些基于省电的应用中,由于平时微处理器处在停机状态,所有的
2、事都靠中断服务来完成,因此也常常采用前后台系统模式。,10.1.2 操作系统,操作系统(Operating System,简称OS)是计算机中最基本的程序。操作系统负责计算机系统中全部软、硬资源的分配以及回收、控制与协调等并发的活动;操作系统提供用户接口,使用户获得良好的工作环境;操作系统为用户扩展新的系统功能提供软件平台。 操作系统的主要包括四大功能: 处理机管理:解决CPU的分时复用。 存储管理:配合CPU调度内存。 设备管理:分配外设的使用,包括独享、共享和虚拟。 软件资源管理:解决程序和信息的存取和管理等问题。,实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速
3、度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的操作系统。 用户的应用程序是运行于RTOS之上的各个任务,RTOS根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、任务调度和异常处理等工作。 实时多任务操作系统,以分时方式运行多个任务,看上去好像是多个任务“同时”运行。任务之间的切换应当以优先级为根据,只有具有优先服务方式的RTOS才是真正的实时操作系统,而时间分片方式和协作方式的RTOS并不是真正的“实时”。,10.1.3 实时操作系统,10.1.4 临界区,临界资源:任何时候都只允许一个任务访问的资源。 临
4、界区或临界段:用于访问临界资源的代码段。 临界代码段不允许多个并发任务交叉执行,否则会产生严重后果,比如进入中断后的现场保护代码等。 为确保临界区代码的安全执行,在进入临界区之前要关中断,而临界区代码执行完以后要立即开中断,程序运行时可使用的软、硬件环境统称为资源。资源可以是输入/输出设备,例如打印机、键盘和显示器;资源也可以是一个变量、一个结构或一个数组等。 共享资源就是指可以被一个以上任务使用的资源。为防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫互斥。,10.1.5 资源与共享资源,任务,也称为线程,是一个简单的程序。一般地,每个任务都是一个无限的循环。 任务有五种状
5、态:休眠态、就绪态、运行态、挂起态(等待某一事件发生)和被中断态。任何时刻,一个任务都处于这五种状态之一的状态下。 休眠态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪态意味着该任务已经准备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂不能运行 。运行态的任务是指该任务掌握了CPU的控制权,正在运行。挂起态指该任务在等待,等待某一事件的发生。被中断状态是指,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态。,10.1.6 任务,10.1.7 内核与任务切换,内核 内核是操作系统最基本的部分。多任务系统中,内核负责管理各个任务
6、,或者说为每个任务分配CPU时间,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核负责任务之间的通信,它提供的基本服务是任务切换。 任务切换 当多任务内核决定运行另外的任务时,保存正在运行任务的当前状态,即保存CPU寄存器中的全部内容。这些内容保存在任务的当前状态保存区,也就是任务自己的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。,多任务切换示意图,调度是内核的主要职责之一,调度就是决定该轮到哪个任务运行了。任务的调度方式有基于时间片轮转的调度和基于优先级的调度。多数实时系统是基于
7、优先级调度法的。基于优先级的调度法指CPU总是让处于就绪态的优先级最高的任务先运行。至于何时让高优先级任务掌握CPU的使用权,有两种不同的情况。 占先式调度;非占先式调度。,10.1.8 调度,占先式调度 任何时候具有最高优先级且已就绪的任务先执行。一个正在执行的任务放弃处理器的条件为:自愿放弃处理器(等待资源或执行完毕);有高优先级任务启动,该高优先级任务将抢占其执行。当一个运行着的任务使一个比它优先级更高的任务进入了就绪状态时,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序是一个高优先级的任务进入了就绪态,则中断完成时,中
8、断了的任务被挂起,优先级高的那个任务开始运行。 占先式调度的优点是实时性好、反应快,调度算法相对简单,可优先保证高优先级任务的时间约束,其缺点是上下文切换多。,非占先式调度 非占先式调度要求每个任务自我放弃CPU的所有权。这种方式下,异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态,但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。 非占先式调度的优点是上下文切换少,几乎不需要使用信号量保护共享数据;缺点是处理器有效资源利用率低,任务级响应时间不确定,可调度性不好。,10.1.9
9、 函数的可重入性,可重入(Reentrant)型函数:是指可以被多个任务并发使用,而数据不会遭到破坏的函数。 可重入型函数特征: 只使用局部变量,变量保存在CPU寄存器或堆栈中,可以在任意时刻被中断,再重新恢复运行时,数据不会被破坏; 若使用全局变量,则需满足互斥条件。,可重入型函数实例void func1(int* x, int* y) int temp;temp= *x;*x = *y;*y = temp; 不可重入型函数清单static int temp;void func2(int* x, int* y) temp = *x;*x = *y;*y = temp; ,不可重入型函数运行示
10、意图,使用以下技术之一可使函数func2()具有可重入性:(1) 将temp定义为局部变量;(2) 在调用前,禁止中断,执行完毕后再开中断;(3) 在调用过程中,应用信号量独占使用该函数。,10.1.10 信号量,信号量 信号与信号量在英文中都是同一个词Semaphore,并不加以区别。是一种通信机制。主要用来实现任务间同步以及标识某类资源的可用个数。 两种类型: 只取0和1两个值的二值(Binary)信号量,这种信号量也称为信号; 由若干位组合而成的计数式(Counting)信号量,一般有8位、16位或者32位等若干种,具体是多少位取决于内核。 作用: 满足互斥条件,实现共享资源的独占使用;
11、 标志某事件的发生; 使两个任务的行为同步。,(1)初始化信号量,也可称为建立(CREATE)信号量。信号量初始化时,要给信号量赋初值,等待信号量的任务列表应清空。 (2)等信号或申请信号量,可称做挂起(PEND)。对于执行等待信号量的任务来说,若该信号量有效,则信号量值减1,任务继续执行;若信号量值为0,则任务继续被挂起。若内核允许定义等待超时,则超时后,该任务转入就绪,同时返回错误代码以示发生了超时错误。 (3)给信号,可称做发信号(POST)。若没有任务等待该信号量,则信号量的值仅简单加1;若只有一个任务等待该信号量,则该任务转入就绪状态,信号量的值不加1;若有多个任务等待信号量,至于谁
12、先得到信号量,那就要看内核是如何调度的了。一般有两种可能:一是按优先级原则,等待信号量的任务中优先级最高的先得到;二是按先进先出的原则,最早开始等待信号量的那个任务先得到。,工作原理,所谓死锁,是指各并发任务彼此等待对方所拥有的资源,且这些并发任务在得到对方的资源之前不会释放自己所拥有的资源,从而造成大家都想得到资源而又都得不到资源,各并发任务不能继续向前推进的状态。 最简单的防止死锁发生的方法有两种: 1. 让每个任务先得到全部需要的资源,再进行下一步工作。 2. 让每个任务用同样的顺序去申请多个资源,释放资源时使用相反的顺序。,10.1.11 死锁,10.1.12 消息队列,消息用于两个任
13、务之间的通信,消息队列是保存消息的容器。通过内核提供的服务,任务或中断服务子程序可以将一个消息放入消息队列。同样,一个或多个任务可以通过内核服务从消息队列中得到消息。 通常,先进入消息队列的消息先给任务,遵循先进先出原则(FIFO)。 内核提供的典型消息队列服务如下: 1.消息队列初始化,队列初始化时总是清为空; 2.放一则消息到队列中去(POST); 3.等待一则消息的到来(PEND); 4.无等待取得消息。如果队列中有消息则任务可以取得消息,消息从队列中取走;但如果此时队列为空,则内核不将该任务挂起,只是用特别的返回代码通知调用者,队列中没有消息。,中断是指计算机在执行程序的过程中,当出现
14、异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回到以下部分: 1.在前后台系统中,程序回到后台程序; 2.对非占先式内核而言,程序回到被中断了的任务; 3.对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。,10.1.13 中断,时钟节拍是特定的周期性中断。这个中断可以看作是系统心脏的脉动。中断之间的时间间隔取决于不同应用,是机器周期的一个整数倍,一般为10200ms,视系统的复杂性和对实时性的要求而定。内核对任务的切换和延时等操作都是基于时钟节拍的。时钟节拍的频率越快,系统的额外开销就越大。,10.1.14 时钟节拍,RTX51是一
15、款小巧的针对基于8051系列嵌入式系统的多任务实时操作系统。它的使用可以简化比较复杂、有严格时间限制的软件的设计过程。RTX51主要有两个不同的可用版本: RTX5lFull标准版,既可以以循环(Round 一Robin )方式执行任务,也可以按4级任务优先级的方式切换不同优先级的任务。标准版以并行方式工作,支持中断管理,信号和消息可以通过邮箱系统在不同任务之间传递。 RTX5lTiny精简版,是其标准版的一个子集。它可以很容易地运行在8051的单芯片系统而不需要任何外部数据存储器。通用性强,系统需求低,但功能上受到限制。它只支持循环方式和信号方式的任务切换,而不支持优先级方式的任务切换。 K
16、EIL C中自带了RTX5lTiny,以下只讲解RTX5lTiny的内容,出现RTX51的地方默认为其精简版RTX51Tiny。,10.2 RTX51 系统特点,RTX51 可以在所有的8051 系列芯片上运行。用户只需要用标准的C语言编写RTX51 程序,然后用C51编译器编译即可生成代码。 RTX51 程序设计需要包含实时运行头文件和必要的库文件,并且要用BL51 连接定位器来实现连接。 在Keil中,你只需要在目标选项的Target标签中的Operating中选择RTX-51 Tiny,在你的头文件中加上#include 即可。,在RTX51 TINY环境下生成代码,需要用到下列工具: C51编译器 BL51连接/定位器 A51宏汇编器 此外,库文件RTX51TNY.LIB必须存放在环境变量C51LIB所指定的路径下。 RTX51 Tiny版可以运行在8051的单芯片嵌入式系统上,且不需要任何外部数据存储器,但也不排斥应用程序访问外部的数据存储器。RTX51 Tiny版本可以使用C51所支持的所有存储模式。所使用的存储模式只影响应用对象