资源描述
,第二级,第三级,第四级,第五级,第11章 RTX51实时操作系统,第11章 RTX51实时操作系统,单片机原理、接口及应用,内 容 提 要,前言,RTX51 系统特点,RTX51 的程序结构,RTX51的功能函数,RTX51的任务调度,RTX51的系统配置,RTX51的应用举例,小结,11.1,前言,RTX51是一款小巧的针对基于8051系列嵌入式系统的多任务实时操作系统。它的使用可以简化比较复杂、有严格时间限制的软件的设计过程。RTX51主要有两个不同的可用版本:,RTX5lFull,版。这里称之为,RTX51,的标准版,既可以以循环(,Round,一,Robin,)方式执行任务,也可以按,4,级任务优先级的方式切换不同优先级的任务。标准版以并行方式工作,支持中断管理,信号和消息可以通过邮箱系统在不同任务之间传递。,RTX5lTiny,版。这里称之为,RTX5l,的精简版,是其标准版的一个子集。它可以很容易地运行在,8051,的单芯片系统而不需要任何外部数据存储器。通用性强,系统需求低,但功能上受到限制。它只支持循环方式和信号方式的任务切换,而不支持优先级方式的任务切换。,由于,KEIL C,中自带了,RTX5l,的精简版,RTX5lTiny,,事实上精简版也能够满足绝大部分场合的应用要求,所以以下只讲解,RTX5lTiny,的内容,出现,RTX51,的地方默认为其精简版,RTX51Tiny,。,11.2 RTX51 系统特点,RTX51 可以在所有的8051 系列芯片上运行。用户只需要用标准的C语言编写RTX51 程序,然后用C51编译器编译即可生成代码。其中,仅有少数内容和标准C 语言有差异,这些内容是为了实现任务标识和优先级而设置的。RTX51 程序设计需要包含实时运行头文件和必要的库文件,并且要用BL51 连接定位器来实现连接。在Keil中,你只需要在目标选项的Target标签中的Operating中选择RTX-51 Tiny,在你的头文件中加上#include 即可。,在RTX51 TINY环境下生成代码,需要用到下列工具:,C51编译器,BL51连接/定位器,A51宏汇编器,此外,库文件,RTX51TNY.LIB,必须存放在环境变量,C51LIB,所指定的路径下。,RTX51 Tiny版可以运行在8051的单芯片嵌入式系统上,且不需要任何外部数据存储器,但也不排斥应用程序访问外部的数据存储器。RTX51 Tiny版本可以使用C51所支持的所有存储模式。所使用的存储模式只影响应用对象的存储位置。RTX51 Tiny的系统变量和应用程序的堆栈区总是存储在8051的片内RAM中(即DATA和IDATA)。典型的RTX51 Tiny应用程序一般运行于SMALL存储模式下。,RTX51 Tiny版本使用了8051的定时器0和定时器0的中断信号。SFR中的全局中断允许位或定时器0中断屏蔽位都可能使RTX51 Tiny停止运行。因此,除非有特殊的应用目的,应该使定时器0的中断始终开启,以保证RTX51 Tiny的正常运行。,实时操作系统的性能参数对嵌入式系统的应用开发也有着直接影响,RTX51的性能参数如表11-1所示。,11.3 RTX51,的程序结构,RTX51Tiny通过循环(Round-Robin)方式来实现多任务,以达到多个无限循环或任务的准并行执行。这里的多任务并不是真正同时执行的,而是使用不同的时间片来执行,即只是宏观上的同时执行。它将可用的CPU周期分成多个时间片,由RTX51把这些时间片分配给每一个任务使用。每个任务只能在预定的时间片里运行。然后,RTX51再切换到另一个己经准备就绪的任务,让它再执行一定的时间片。,时间片一般是比较短促的,一个时间片大约只有毫秒级时间。正是由于这个原因,在用户看来,多个任务似乎是在同时执行的。,RTX51 利用了一个由8051定时器中断信号驱动的定时程序来实现控制。定时器产生的周期性中断信号用来驱动RTX51的定时节拍。,RTX51与用户程序中的main函数是无关的。用户程序中即使没有main 程序,操作系统也会自动从设定的任务0开始执行。如果用户程序中已经有了main 函数,就必须用人工方式来启动RTX51。这对于RTX51 Tiny版,可以调用os_create_task函数来完成.,下面是一个只使用Round-Robin 任务方式的简单RTX51 程序实例。程序中的两个任务都是简单的计数循环。RTX51 从job0函数(设定为任务0)开始执行。程序中还有另一个名为job1的任务(设定为任务l)。系统一旦启动,在job0 执行一段时间后,RTx51 就自动切换到job1的执行;而job1执行一段时间后,RTX51又切换回job0,如此无限循环地重复执行下去。,#include,int counter0;,int counter1;,void job0(void)_task_ 0,os_create_task(1);/*任务l 己准备就绪*/,while(1)/*无限循环*/,counter0+;/*更新计数值counter0*/,void job1(void)_task_ 1,while(1)/*无限循环*/,counter1+;,/*更新计数值counter1*/,11.4 RTX51,的功能函数,RTX51,精简版支持的功能函数如表,11-2,所示,具体含义分别介绍如下。,11.4.1,信号控制函数,isr_send_signal,函数原型,char isr_send_signal(unsigned char task_id);,功能说明,发送一个信号到task_id说明的任务。如果此任务已在等待一个信号,那么调用函数将使此任务就绪,准备执行。否则,信号讲存储在此任务的信号标志中。此函数只能从中断函数中调用。,返回值,如果执行成功,此函数返回,0,值;如果所指定的任务不存在,则返回,-1。,os_clear_signal,函数原型,char os_clear_signal(unsigned char task_id);,功能说明,清除由task_id说明的任务的信号,返回值,如果信号清除成功,此函数返回,0,值;如果所指定的任务不存在,则返回,-1,os_send_signal,函数原型,char os_send_signal(unsigned char task_id);,功能说明,发送一个信号到task_id说明的任务。如果此任务已在等待一个信号,那么调用函数将使此任务就绪,准备执行。否则,信号讲存储在此任务的信号标志中。此函数只能在任务函数中调用,返回值,如果执行成功,此函数返回,0,值;如果所指定的任务不存在,则返回,-1,11.4.2,任务控制函数,os_create_task,函数原型,char os_create_task(unsigned char task_id);,功能说明,启动已定义的由task_id说明的任务。此任务根据RTX51运行规则,标记为就绪,并准备执行。,返回值,如果任务成功启动,此函数返回,0,值;如果没有,task_id,说明的任务,则返回,-1,os_delete_task,函数原型,char os_delete_task(unsigned char task_id);,功能说明,停止task_id说明的任务,此任务将从任务表中删除。,返回值,如果任务成功启动,此函数返回,0,值;如果没有,task_id,说明的任务,则返回,-1。,os_running_task_id,函数原型,char os_running_task_id(unsigned char task_id);,功能说明,判断当前执行任务的编号,返回值,返回当前正在执行的任务的编号,返回值为,0,15,。,11.4.3,延时控制函数,os_wait,函数原型,char os_wait(unsigned char event_sel,/*将要等待 的事件*/,unsigned char tisks,/*将要等待的定时器时标数*/,unsigned char dummy);/*未用参数*/,功能说明,停止当前执行的任务,并等待一个或多个事件,如时间间隔、超时、从另一个任务或中断发出的信号等。参数,event_sel,说明所等待的一个事件或几个事件的组合。事件种类如表,11-3,所示。,表,11-4 os_wait,函数的返回值,os_wait1,函数原型,char os_wait1(unsigned char event_sel);,功能说明,暂停当前任务,等待一个事件的发生。它是os_wait函数的一个子集,不接受针对os_wait函数提供的全部事件。参数event_sel指定了等待的事件,它只能是K_SIG。,返回值,当信号事件发生时,任务就被允许执行,任务的执行将恢复。返回用于识别事件、使任务重新启动的常量。,os_wait2,函数原型,char os_wait2(unsigned char event_sel,/*将要等 待的事件*/unsigned char tisks);/*将要等待的定时器时标数*/,功能说明,与os_wait相同,但是不需要dummy参数。,返回值,与,os_wait,相同,11.5 RTX51,的任务调度,RTX51,利用任务状态来管理各个任务。用户为,RTX51,定义的每个任务都会以各种状态的某一种来运行。,RTX51,内核为每个任务保留了适当的状态如表,11-5,所示。,表11-5 RTX51的任务状态,RTX51以round-robin多任务方式执行程序,它支持多个无限循环或任务的准并行执行。任务不是被同时执行,而是以分时的方式轮片执行。可用的CPU时钟周期被分成多个时间片,然后由RTX51 将这些时间片分配给各个任务。每个任务只允许在预定的时间片中执行,时间片用完时,RTX51就切换至另一个就绪的任务,继续执行一段时间。时间片的具体长度可以用配置函数TIMESHARING 来定义。,如果遇到因为一个任务处于等待并且占用了时间片而暂时无法往下执行,可以调用系统函数,os_wait,来通知,RTX51,,以便将当前的任务挂起而提前执行另一任务。,RTX51中处理任务分配的模块称为调度程序(Scheduler)。调度程序驱动哪个任务运行是按照以下的规则进行的:,(1)如果发生以下情况时,当前运行的任务将被中断:,调用os_wait函数,而所等待的事件未来到;,任务的执行时间已经超过所定义的Round-Robin循环时间间隔,(2)如果发生以下情况时,另一个任务将被启动:,已没有正在执行的任务;,将要执行的任务处在就绪状态或超时状态。,11.6 RTX51,的系统配置,编写RTX51程序需要包含RTX51TNY.H 文件。在程序中,需要用一个关键字“_task_”来声明一个函数的任务属性。RTX51程序不需要main 函数。在进行连接处理时,会将启动任务0 的执行所需要的代码连接进来,作为开始执行的代码。,用户可以更改配置文件CONF_TNY.A51中的以下几个参数:,系统定时器中断所用的寄存器组,系统定时器的时间间隔,Round-Robin的超时(time-out)值,内部数据存储器的大小,RTX5l,启动后的自由堆栈大小,以下是配置文件的部分内容:,;RTX51 的硬件定时器,;用下面的EQU可预置RTX51的定时器时间常数,;用8051 定时器0 作为控制软件的定时器,;定义定时器中断用的寄存器组,INT_REGBANKEQU1 ;默认为寄存器1组,;定义8051定时器0溢出所需的机器周期数,INT_CLOCK EQU10000;默认周期数为10000,;定义Round-Robin 的Timeout 所需的定时器溢出数,TIMESHARINGEQU5;默认为5次,;,注意:,Round-Robin,任务切换可用,TIMESHARING,为,0,来屏蔽,;RTX51 堆栈空间,;以下的EQU语句定义了堆栈区的片内
展开阅读全文