项目10单片机嵌入式系统原理及应用(贾好来)单片机实时操作系统RTX51_第1页
项目10单片机嵌入式系统原理及应用(贾好来)单片机实时操作系统RTX51_第2页
项目10单片机嵌入式系统原理及应用(贾好来)单片机实时操作系统RTX51_第3页
项目10单片机嵌入式系统原理及应用(贾好来)单片机实时操作系统RTX51_第4页
项目10单片机嵌入式系统原理及应用(贾好来)单片机实时操作系统RTX51_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章实时操作系统RTX5112对于单任务应用程序或者简单的前后台应用系统来说,编写简单的监控程序就够了。如简易计算器、防盗报警器、容器温度控制系统等等,学习前面章节的内容就够了。但是,许多单片机应用程序要求同时执行两个或两个以上工作或任务,如汽车发动机控制、防抱死系统(ABS)、飞机管理系统、喷气发动机控制。对于这样的应用程序,监控程序的编写相当困难,而必须要使用实时操作系统RTOS。3实时多任务操作系统(RTOS)可以灵活地为几个任务调度系统的资源(CPU、存储器等)。RTX51是一个强大的实时操作系统,而且简单易用。它可以在所有的8051派生产品中使用。本章首先介绍实时操作系统的概念,然后介绍在8051系统中得到应用的RTX51实时操作系统的结构特点和应用实例。4本章内容10.1实时操作系统10.2RTX51实时操作系统10.3RTX精简版例程10.4RTX全功能版例程

实时操作系统(RTOS)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的操作系统。因而,提供及时响应和高可靠性是其主要特点。实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。510.1实时操作系统多任务运行的实现实际上是靠CPU(中央处理单元)在许多任务之间转换和调度。CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行很像前/后台系统,只是后台任务有多个。多任务运行使CPU的利用率达到最高,并使应用程序模块化。在实时应用中,多任务化的最大特点是,开发人员可以将很复杂的应用程序层次化。使用多任务,应用程序将更容易设计与维护。10.1.1多任务系统6一个任务,也称做一个线程,是一个简单的程序,该程序可以认为CPU完全只属于该程序自己。实时应用程序的设计过程包括如何把问题分割成多个任务。每个任务都是整个应用的一部分,都被赋予一定的优先级,有自己的一套CPU寄存器和栈空间。典型的是,每个任务都是一个无限的循环,都可能处在以下5种状态之一—休眠态、就绪态、运行态、挂起态(等待某一事件发生)及被中断态。10.1.2多任务系统中任务的定义7休眠态相当于任务驻留在内存中,但并不被多任务内核所调度;就绪态意味着任务已经准备好,可以运行,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行;运行态是指任务掌握了CPU的使用权,正在运行中;挂起态也可以叫做等待事件态,指任务在等待,等待某一事件的发生(例如等待某外设的I/O操作,等待某共享资源由暂不能使用变成能使用状态,等待定时脉冲的到来,或等待超时信号的到来,以结束目前的等待,等等);最后,发生中断时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断状态。810.1.3多任务系统中的任务特性任务就是一个具有独立功能的无限循环的程序段的一次运行活动。任务具有动态性、并发性、异步独立性的特点。

1.动态性:任务的状态是不断变化的,一般分为:休眠态,就绪态,运行态,挂起态等。

2.并发性:系统中同时存在多个任务,它们宏观上是同时运行的

3.异步独立性:任务是系统中独立运行的基本单元,也是内核分配和调度的基本单元,每个任务各自按相互独立的不可预知的速度运行,走走停停。每个任务都要安排一个决定其重要性的优先级,都有一个无限循环的程序段规定其功能(如一个C语言过程),并相应有一个数据段、堆栈段及一个任务控制块TCB(用于保存CPU的现场,状态等)。910.1.4实时操作系统特性1.高精度计时系统计时精度是影响实时性的一个重要因素。在实时应用系统中,经常需要精确确定实时地操作某个设备或执行某个任务,或精确的计算一个时间函数。这些不仅依赖于一些硬件提供的时钟精度,也依赖于实时操作系统实现的高精度计时功能。2.多级中断机制一个实时应用系统通常需要处理多种外部信息或事件,但处理的紧迫程度有轻重缓急之分。有的必须立即作出反应,有的则可以延后处理。因此,需要建立多级中断嵌套处理机制,以确保对紧迫程度较高的实时事件进行及时响应和处理。103.实时调度机制实时操作系统不仅要及时响应实时事件中断,同时也要及时调度运行实时任务。但是,处理机调度并不能随心所欲的进行,因为涉及到两个进程之间的切换,只能在确保“安全切换”的时间点上进行,实时调度机制包括两个方面,一是在调度策略和算法上保证优先调度实时任务;二是建立更多“安全切换”时间点,保证及时调度实时任务。1110.2RTX51实时操作系统RTX51是用于8051系列单片机的一种多任务实时操作系统(RTOS)。它可以简化具有实时性要求的复杂软件的设计。RTX51有两个不同版本:RTX51Full和RTX51Tiny。RTX51Full允许4个任务优先级的轮转和抢先式任务切换,且它还可以与中断函数并行使用。任务之间可以使用邮箱系统(mailboxsystem)来传递信号和消息。可以从存储池进行分配或释放存储器,还可以使一个任务等待,如中断、超时、另一个任务或中断的信号及消息。1213RTX51Tiny是RTX51Full的子集,可以容易地在没有片外存储器的8051单片机系统上运行。RTX51Tiny也支持很多RTX51Full的功能,允许轮转式任务切换,支持信号传递。但它不支持抢先式的任务切换,不能进行信息处理,也不支持存储池的分配和释放。在许多单片机应用系统中要求能够同时处理多项工作或任务,实时多任务操作系统(RTOS)可以灵活地为几个任务调度系统的资源(CPU、存储器等)。RTX51是一个强大的实时操作系统,而且简单易用。它可以在所有的8051派生产品中使用。可以用标准C的结构编写RTX-51程序,并用C51编译它们。它只在指定任务ID和优先权方面与标准C有一点不同。RTX-51程序也要求包含实时可执行的头文件,并用BL51链接器/定位器和相应的RTX-51库文件链接。10.2.1RTX-51实时操作系统特点

RTX-51实时多任务操作系统,完全不同于一般的单片机C51程序。RTX-51有自己独特的概念和特点:1.中断:RTX-51系统可以使用中断,其中断函数以并行方式工作。中断函数可以与RTX-51内核通信,并可以将信号或者消息发送到RTX-51的指定任务中。在RTX-51FULL中,中断一般配置为一个任务。2.信息传递:

RTX-51FULL支持任务之间的信息交换,可以使用isr_recv_message、isr_send_message、os_send_message和os_wait函数来实现。在RTX-51系统中,信息是一个可以被存储器看作是数字或者指针的16位数值。RTX-51FULL中还可以支持使用存储器库系统的变量信息。1410.2.1RTX51实时操作系统特点3.CAN通信:

RTX-51FULL中集成了一个CAN总线通信模块RTX-51/CAN。通过RTX-51/CAN可以轻松地实现CAN总线的通信。RTX-51CAN作为一个任务来使用,可以通过CAN网络来实现信息的传递,其他的CAN终端可以配置为一般的C51程序,也可以是RTX-51的实时操作系。4.BITBUS通信:

RTX-51FULL系统中集成了BITBUS主控制器和从控制器。BITBUS任务主要用于支持与Intel8044之间的信息传递。155.事件

在os_wait函数中,RTX51支持下列事件:Timeout(超时):

挂起正在运行的任务,等待规定的时钟滴答数。Interval(间隔):

这和Timeout很相似,但不是用软件定时器的复位来产生周期性的间隔(时钟要求)。(仅RTX51Tiny)Signal(信号):任务之间协调。Message(消息):交换消息。(仅RTX51Full)Interrupt(中断):

一个可以等待8051硬件中断的任务。(仅RTX51Full)Semaphore(信号量):

管理共享的系统资源的二进制信号量。(仅RTX51Full)

166.运行环境RTX-51实时多任务操作系统使用标准的C51来编写程序,可以运行于所有的51系列单片机中。RTX-51自身提供了灵活的时间分配,以及任务的响应和切换。用户只需要用标准的C51语言编写RTX51程序,然后用C51编译器编译即可生成代码。其中,仅有少数内容和标准C语言有差异,这些内容是为了实现任务标识和优先级而设置的。RTX-51程序设计需要包含实时运行头文件和必要的库文件,并且要用BL51连接/定位器来实现连接。17在Keil中,在目标选项的Target标签中的operating中选择RTX-51Tiny,如图10-1;且在头文件中需要加上#include<rtx51tny.h>。在RTX51TINY环境下生成代码,需要用到下列工具:C51编译器BL51连接/定位器A51宏汇编器此外,库文件RTX51TNY.LIB必须存放在环境变量C51LIB所指定的路径下。1819图10-1RTX-51Tiny的设置界面RTX51Tiny的存储模式

RTX51Tiny版可以运行在8051的单芯片嵌入式系统上,且不需要任何外部数据存储器,但也不排斥应用程序访问外部的数据存储器。RTX51Tiny版本可以使用C51所支持的所有存储模式。所使用的存储模式只影响应用对象的存储位置。RTX51Tiny的系统变量和应用程序的堆栈区总是存储在8051的片内RAM中(即DATA和IDATA)。典型的RTX51Tiny应用程序一般运行于SMALL存储模式下。20RTX51Tiny定时使用的定时器

RTX51Tiny版本使用了8051的定时器0和定时器0的中断信号。SFR中的全局中断允许位或定时器0中断屏蔽位都可能使RTX51Tiny停止运行。因此,除非有特殊的应用目的,应该使定时器0的中断始终开启,以保证RTX51Tiny的正常运行。217.RTX51的性能参数实时操作系统的性能参数对嵌入式系统的应用开发也有着直接影响,RTX51的性能参数如表10-1所示。描述RTX51TINY版本任务数量最多16个RAM需求7字节DATA空间,3倍于任务数量的IDATA空间代码要求900字节硬件要求定时器0系统时钟1000~65535个时钟周期中断响应时间<20周期任务切断时间100~700周期,依赖于堆栈负载22表10-1RTX51的性能参数10.2.2RTX51的系统配置编写RTX51程序需要包含RTX51TNY.H文件。在程序中,需要用一个关键字“_task_”来声明一个函数的任务属性。RTX51程序不需要main函数。在进行连接处理时,会将启动任务0的执行所需要的代码连接进来,作为开始执行的代码。用户可以更改配置文件CONF_TNY.A51中的以下几个参数:①

系统定时器中断所用的寄存器组②系统定时器的时间间隔③

Round-Robin的超时(time-out)值④内部数据存储器的大小⑤RTX5l启动后的自由堆栈大小23以下是配置文件的部分内容:;RTX51的硬件定时器;用下面的EQU可预置RTX51的定时器时间常数;用8051定时器0作为控制软件的定时器;定义定时器中断用的寄存器组INT_REGBANKEQU 1;

默认为寄存器1组;定义8051定时器0溢出所需的机器周期数INT_CLOCKEQU10000;默认周期数为10000;定义Round-Robin的Timeout所需的定时器溢出数

TIMESHARING EQU 5;默认为5次;注意:Round-Robin任务切换可用TIMESHARING为0来屏蔽;24;RTX51堆栈空间;以下的EQU语句定义了堆栈区的片内RAM体积最小自由堆栈空间;定义了堆栈空间耗尽后所执行的宏代码;定义最大的堆栈RAM地址

RAMTOPEQU 0FFH;默认地址是255;定义最小的堆栈自由空间

FREE_STACKEQU20;默认为20字节堆栈自由空间;;发生堆栈用尽时的执行代码

STACK_ERRORMACRO

CLREA

;关闭所有中断SJMP$;如堆栈空间耗尽,进入死循环ENDM这些参数的说明详见表10-2。25

表10-2配置文件参数说明参数描述INT-REGBANK说明RTX51系统所用的寄存器组INT-CLOCK定义系统时间间隔,系统用这个间隔产生一个中断信号,定义的数据是指每次中断发生所需的CPU周期数TIMESHARING定义Round-Robin任务切换的超时间隔(time-out),是定时器溢出中断次数,发生指定次数中断后切换任务。如果是0,则多任务Round-Robin机制被屏蔽RAMTOP说明8051片内RAM的最大地址,8051为7FH,8052为0FFHFREE-STACK定义任务切换时堆栈自由空间体积字节数,RTX51会检验堆栈体积是否合理。如太小,引用STACK-ERROR宏STACK-ERROR当RTX51检测到堆栈出错时执行的宏,可以根据应用程序需求更换这个宏。2610.2.3RTX的典型功能函数在RTX-51Tiny的系统函数中,以“os_”开头的函数可以被任务专用,而以“isr_”开头的函数则表示可以被C51的中断函数专用。在使用RTX-51Tiny的系统函数时,需要在程序中加入“RTX51TNY.h”头文件。在该头文件中,提供了RTX-51Tiny系统函数的说明以及所有常数声明。27(1)发送信号函数isr_send_signal

发送信号函数isr_send_signal主要用于向一个任务发送信号。其函数原型如下:charisr_send_signal(unsignedchartaskid);

其中,参数taskid表示接收信号的任务号。发送信号函数isr_send_signal如果返回0,则表示信号发送成功,如果返回-1,则表示指向的任务不存在。28(2)清除信号标志函数os_clear_signal清除信号标志函数os_clear_signal主要用于清除指定任务的信号标志。其函数原型如下:charos_clear_signal(unsignedchartaskid);其中,参数taskid表示所需要清除信号标志的任务号。清除信号标志函数os_clear_signal如果返回0,则表示信号标志清除成功,如果返回-1,则表示指向的任务不存在。29(3)删除任务函数os_delete_task删除任务函数os_delete_task主要用于删除指定任务号的任务。其函数原型如下:

charos_delete_task(unsignedchartaskid);其中,参数taskid表示所需要删除任务的任务号,taskid必须与任务描述的数字相一致,可取值的范围为0~15。删除任务函数os_delete_task如果返回0,则表示删除任务成功,如果返回-1,则表示指向的任务不存在或者任务没有启动。30(4)当前任务号函数os_running_task_id当前任务号函数os_running_task_id主要用于获得当前运行任务的任务号。其函数原型如下:charos_running_task_id(void);其中,当前任务号函数os_running_task_id的返回值表示当前任务的任务号。使用函数os_delete_task的程序示例如下:voidtask_os_running_taskid(void)_task_2{unsignedcharrid;rid=os_running_task_id();……}31(5)发送信号函数os_send_signal发送信号函数os_send_signal主要用于向一个任务发送信号。其函数原型如下:

charos_send_signal(unsignedchartaskid);其中,参数taskid表示接收信号的任务号。发送信号函数os_send_signal如果返回0,则表示信号发送成功,如果返回-1,则表示指向的任务不存在。发送信号函数os_send_signal在向taskid所指定的任务发送信号时,如果该任务正在等待信号,则信号到达后,任务再次执行。如果任务正在执行其他操作,则信号将被存储在所访问的任务信号标志中。32使用函数os_send_signal的程序示例如下:voidtask_os_sendsignal(void)_task_2{……os_send_signal(3); //向任务3发送信号……}33(6)等待函数os_wait等待函数os_wait主要用于暂停当前任务,等待一个或多个事件发生。其函数原型如下:charos_wait(unsignedcharevent_sel,unsignedcharticks,unsignedintdummy);其中,参数event_sel表示等待发生的事件。可以选择的事件有如下几种形式:

K_IVL:等待的时间间隔。

K_SIG:等待的信号。

K_TMO:超时,即等待的时间到。

这些事件可以单独使用,也可以在一起组合使用,示例如下:

event_sel=K_TMO|K_IVL;

event_sel=K_SIG|K_IVL;34(7)等待函数os_wait1等待函数os_wait1主要用于暂停当前任务,等待信号的到来。其函数原型如下:

charos_wait1(unsignedcharevent_sel);其中,参数event_sel表示等待发生的事件,其不同于os_wait函数,只能设置为K_SIG。等待函数os_wait1如果返回SIG_EVENT,则表示信号被成功接受;如果返回NOT_OK,则表示该函数中所设置的event_sel参数无效。35(8)等待函数os_wait2等待函数os_wait2主要用于暂停当前任务,等待一个或多个事件发生。其函数原型如下

charos_wait2(unsignedcharevent_sel,unsignedcharticks);其中,参数event_sel表示等待发生的事件。可以选择的事件有如下几种形式。K_IVL:等待的时间间隔。K_SIG:等待的信号。K_TMO:等待的时间到。这些事件可以单独使用,也可以在一起组合使用,示例如下:event_sel=K_TMO|K_IVL;event_sel=K_SIG|K_IVL;36(9)启动任务函数os_create_task启动任务函数os_create_task主要用于启动已定义的由task_id说明的任务,此任务根据RTX51运行规则,标记为就绪,并准备执行。

charos_create_task(unsignedchartask_id);如果任务成功启动,此函数返回0值;如果没有task_id说明的任务,则返回-13710.2.4RTX51的任务调度方法RTX51实时多任务操作系统的程序结构与标准单进程C51语言程序不一样,RTX51不要求程序中一定要有一个main函数,它会自动地从任务0(task0)开始执行。如果程序有main函数,那么就必须用RTX51Tiny的os_creat_task函数或RTX51FULL的os_start_system函数手工启动RTX51。具体的程序运行方法有下面几种:381.RTX51的轮转式任务调度方法RTX51可以实现多任务的轮转调度,并允许“准并行”地执行多个循环或任务。任务不是同时执行,而是以不同的时间片轮转调度执行。RTX-51将可用的CPU时间划分成若干时间片,为每个任务指定一个时间片,每个任务允许在预先规定的一个时间片内执行。然后,RTX51切换到另一个就绪的任务,使这个任务也在规定的一个时间片内执行。时间片是很短的,通常是几个毫秒。因此,任务看起来是同时执行的。RTX51使用8051硬件定时器产生中断的定时程序,产生周期性的中断用于驱动RTX51的时钟。39下面的例子是一个简单的轮转任务调度的RTX51应用程序。这个程序中的两个任务是简单的计数器循环。RTX51开始执行任务job0。在任务job0里启动job1的任务。在任务job0的时间片执行完后RTX51切换到job1。job1时间片执行完后,RTX51又切换回job0,这个过程无限地重复。40

#include<rtx51tny.h>intcounter0;intcounter1;voidjob0(void)_task_0{os_create_task(1);//启动任务1//while(1){counter0++;}}voidjob1(void)_task_1{while(1){counter1++;}}

2.RTX51的事件任务调度方法事件程序调度方法可以用os_wait函数通知RTX51,让它执行下一个任务,而不是等待一个任务的时间片到期。这个函数会挂起当前正在执行的任务,等待一个指定的事件发生。在这段时间内,可以执行任意数量的其他任务。41(1)在RTX51中使用超时调度任务在os_wait函数中最简单的等待事件是一个RTX51时钟的超时周期。这个类型的事件可以在要求延时的任务中使用。下面的例子显示了如何使用os_wait函数延时,以允许另一个任务执行。42#include<rtx51tny.h>intcounter0;intcounter1;voidjob0(void)_task_0{/*创建任务1*/

os_create_task(1);while(1){counter0++;/*更新计数器*//*暂停3个时钟*/os_wait(K_TMO,3,0);}}voidjob1(void)_task_1{while(1){/*更新计数器*/counter1++;/*暂停5个时钟*/os_wait(K_TMO,5,0);}}在上面的例子中job0任务中使能任务job1。在counter0加1后job0调用os_wait函数,等待3个时钟滴答。这时,RTX51切换到另一个任务job1。在job1的counte1加1后,也调用os_wait函数,暂停5个时钟滴答。此时,RTX51没有其他任务要执行,因此它进入一个空闲的循环,等待3个时钟滴答,然后继续执行job0。这个例子的结果是counter0每3个时钟滴答加1,而counter1每5个时钟滴答加1。43(2)在RTX51中使用信号调度任务可以用os_wait函数暂停一个任务,等待另一个任务的信号。它可以协调两个或多个任务。等待一个信号的操作如下:如果一个任务要等待一个信号,而且信号标志是0,则任务会被挂起,直到收到信号。如果信号标志在任务查询信号时已经是1,则标志会被清除并继续执行任务。请看下面的例子:44

#include<rtx51tny.h>intcounter0;intcounter1;voidjob0(void)_task_0{os_create_task(1);/*任务1准备就绪*/while(1){if(++counter0==0)/*更新计数器*/os_send_signal(1);/*给任务1发信号*/}}voidjob1(void)_task_1{while(1){os_wait(K_SIG,0,0);/*等待一个信号*/counter1++;/*更新计数器*/}}45在上面的例子中,job0的counter0不断加1,当counter0溢出为0时job0发送一个信号到job1。job1等待从job0任务接收到一个信号时,counter1加1,然后再次等待另一个信号。RTX51将job1标记为就绪态,直到RTX51到下一个时钟滴答后job1才会启动。463.优先级和抢先RTX51允许给任务指定优先级。当高优先级的任务可执行时,会中断低优先级的任务,或比低优先级的任务抢先执行。这就叫做抢先式的多任务或就叫抢先(RTX51Tiny不支持抢先和优先级)。优先级可以从0~3,默认情况下,所有任务的优先级都是0,这是最低的优先级。可以修改上面job1的函数声明,使它的优先级比job0高。下面的例子显示如何将job1的优先级定义为1。47

voidjob1(void)_task_1_priority_1{while(1){os_wait(K_SIG,0,0);/*等待一个信号*/counter1++;/*更新计数器*/}}现在,无论何时job0发送一个信号到job1,job1都会立即启动。4810.2.6任务管理所定义的每个RTX51Tiny的任务可以处于多种不同状态中的一种。RTX51Tiny内核为每个任务维持正确的状态。表10-3是对各种状态的解释。49表10-3各种任务状态的解释状态说

明Running当前正在执行的任务处于Running态。在同一时间只能运行一个任务Ready等待执行的任务处于Ready态。当前的Running(运行的)任务处理完成后,RTX启动下一个在Ready态的任务。Waiting等待时间的任务处于Waiting态。如果任务等待的事件发生,则任务进入Ready态。Deleted没有启动的任务都处于Deleted状态Timeout由于轮转超时而中断的任务处于Timeout状态。这个状态相当于Ready10.3RTX精简版例程下面这个例子程序使用RTX-51Tiny控制3个任务循环执行。在每项任务程序中执行的是增量计数的功能。50#include<rtx51tny.h>/*RTX-51

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论