第十三章RTX51实时多任务操作系统资料讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for(i=0;i<1000;i++);
P1_0=!P1_0;
}
}
*/ */ */ */
job1 () _task_ 1 {
int i;
while (1) {
/* 无穷循环
counter1++;
/* counter1加1
for(i=0;i<1000;i++);
P1_1=!P1_1;
}
}
job1 () _task_ 1 {
13.2 RTX51的特点及运行要求
RTX51 执行循环多任务处理,允许几个循环任务 准并行执行。
任务并不同时执行而是按时间分段执行,有效的 CPU 时间划分成时间段并由RTX51 将时间段分配 给每个任务。每个任务允许执行预定数量的时间, 然后RTX51 切换到另一个任务运行,时间段非常 短,通常仅有几个毫秒,因此任务看起来好象是 同时执行的。RTX51 使用一个定时子程序,其中 断驱动是由8051的硬件定时器产生周期性中断来 驱动RTX51时钟。
RTX51 不要求程序中有主函数。它自动从任务0 开始执行,如果有主函数,则必须使用 os_create_task(RTX51 Tiny)或 os_start_system(RTX51 Full)函数启动RTX51。
13.2.1 RTX51的特点
RTX51有2个模式:RTX51完全模式和最小模 式。RTX51 Tiny是RTX51的一个子集,支持RTX51 中绝大多数的特性,且不需要外部RAM (XDATA)。 RTX51 Tiny 支持RTX51 Full 的许多特性,但不具 有以下功能: 由循环多任务处理和信号实现任务切换 不支持优先任务切换 不包含信息子程序 无存储器库分配子程序
while (1) {
/* 无穷循环
*/
counter1++;
/*counter1加1
*/
os_wait (K_TMO, 10, 0);
/*等待超时信号: 10个时钟报时 */
}
}
job0先启动 job1, 然后在counter0加1计数以后job0呼 叫 os_wait函数暂停5个时钟报时信号。这时rtx51切换到下一 个任务 job1。在 job1增加counter1计数以后,它也调用 os_wait以暂停10个时钟报时信号。现在rtx51没有其他的任 务需要执行。因此在它可以延续执行 job0之前,它进入一个 空循环,等待5个时钟报时信号过去。
单片机接口技术(C51版)
第十三章 RTX51实时多任务操作系统
内容概述
主要介绍多任务编程思想、RTX51操作系统的特点、 模式及运行要求,RTX51 的工作原理、RTX51 TINY的配 置及基于RTX51 TINY的键盘显示系统设计。
教学目标
1.了解多任务编程思想,理解多任务编程与单任务编程的区 别及优点。
图13-3-1 任务状态切换图
例13-3-1 简单的RTX51程序
该程序中的三个任务都是简单的计数器循环,并分别对
P1.0、P1.1、P1.2取反。RTX51 开始执行函数名为job0 的 任务0 ,由该任务创建任务1和任务2。程序在任务0执行 一段时间后到任务1执行一个时间段,再到任务2执行,在 任务2执行一会儿后,RTX51 TINY切换到任务0。该处理 过程无限重复下去。
13.2.2 RTX51对硬件的要求
13.2.3 RTX51对软件的要求
在使用实时多任务操作系统 RTX51 TINY 时,需要以 下软件支持: 1)C51 编译器 2)BL51 连接定位器 3)A51 宏汇编器
库文件 RTX51TNY.LIB 必须存储在 C51\LIB 下,必须 指定 C51 运行库的路径。头文件 RTX51TNY.H 必须存储 在C51\INC下,必须指定C51包含文件的路径。
sbit P1_1=P1^1;
sbit P1_2=P1^2;
ob0 () _task_ 0 {
int i;
os_create_task (1); /*启动任务 1
os_create_task (2); /*启动任务 2
while (1) {
/* 无穷循环
counter0++;
/* counter0 加1
13.1 多任务编程思想
13.1.1 单任务机制工作原理 在单任务机制下,各功能模
块按固定顺序构成一个整体, 作为一个任务得到执行。各 个模块要求的执行频率不一 致时程序难以满足。 需在运行时动态改变执行结 构的系统,程序需用许多条 件判断和分枝转移语句进行 控制,增加了程序的复杂性。 其可读性和可维护性很差, 调试不便。增加了系统扩充 难度。
3)阻塞(BLOCKED):等待一个事件的任务处于 BLOCKED状态,如果事件发生且优先级比正在运 行的任务高,此任务进入运行状态;如果优先级 比正在运行的任务低,此任务进入READY状态。
4)删除(DELETED):没有开始的任务处于删除状态。
RTX51任务状态
5)任务切换 RTX51是抢占式多任务系统;在时间片轮转模式下,同级
例13-3-3 信号使用示例。
#include <rtx51tny.h>
long counter0;
/*任务0的计数器
*/
long counter1;
/*任务1的计数器
*/
long counter2;
/*任务2的计数器
*/
long counter3;
2.了解RTX51的完全模式和最小模式的区别。 3. 理解任务的几种状态及其定义,掌握任务切换过程,能进
行简单的任务切换程序设计;理解事件的定义,了解 RTX51系统中的超时、间隔、信号、消息、中断等几个事 件,能使用os_wait()函数同步2个或几个任务,能使用信 号控制任务的启动和停止。 4.了解RTX51处理中断的中断函数和RTX51的任务中断(分为 快速任务中断和标准任务中断)及实现过程。 5.了解 RTX51 TINY的同步机制、调度规则、任务控制块、存 储器管理等。掌握 RTX51 TINY的配置,能够修改RTX51 TINY配置文件conf_tny.a51 。 6. 掌握基于RTX51 TINY的键盘、显示系统的程序设计。
13.3 RTX51基本概念及实例分析
13.3.1 任务的状态及定义
RTX51区分2类任务:快速任务和标准任务。 快速任务有很快的响应速度,每个快速任务使用 8051一个单独的寄存器组,并且有自己的堆栈区 域。RTX51支持最大同时有3个快速任务。标准任 务需要多一点的时间来进行任务切换,因此使用 的内部RAM相对快速任务要少,所有的标准任务 共用1个寄存器组和堆栈。当任务切换的时候,当 前任务的寄存器状态和堆栈内容转移到外部存储 器中。
RTX51 TINY 可以在没有外部数据存储器的单片机 8051系统中运行,但应用程序可以存取外部存储器。 RTX51 TINY 可以使用 C51 编译器支持的存储器模式,存 储器模式的选择仅影响应用程序目标文件的定位。RTX51 TINY 的系统变量以及应用程序的堆栈区总是位于8051 的 内部数据存储器中(DATA/IDATA),典型地,RTX51 TINY 应用程序应采用 SMALL 编译模式。
*/
job0 () _task_ 0 {
os_create_task (1);
/* 启动任务1
*/
while (1) {
/* 无穷循环
*/
counter0++;
/* counter0加1
*/
os_wait (K_TMO, 5, 0);
/*等待超时信号: 5个时钟报时 */
}
}
job1 () _task_ 1 {
RTX51 FULL支持任务最多达64个,但一般 RTX51 TINY支持最大16个标准任务。
RTX51任务状态
1)运行(RUNNING):当前正在运行的任务处于 RUNNING状态,同一时间只有1个任务可以运行。
2)就绪(READY):等待运行的任务处于READY状态, 在当前运行的任务退出运行状态后,就绪队列中 优先级最高的任务进入到运行状态。
int i;
while (1) {
/* 无穷循环
counter1++;
/* counter1加1
for(i=0;i<1000;i++);
P1_1=!P1_1;
}Βιβλιοθήκη Baidu
}
*/ */
*/ */
13.3.2 RTX51事件
在等待一个任务的时间片到达时, RTX51使 用os_wait函数通知RTX51,让另一个任务开始执 行。这个功能终止正在运行的当前任务,然后等 待指定事件的发生。这时,任意数量的其它任务 仍可以执行。
RTX51支持的事件
*中断(interrupt):适用于RTX51 Full,一个 任务可以等待8051硬件中断。
*信号量(semaphore):适用于RTX51 Full, 信号量用于管理共享的系统资源。通过使用 “令牌”,允许在同一时刻只有一个任务使 用某些资源。如果几个任务申请访问同一个 资源,那么首先提出申请的将允许访问,其 它的任务进入等待队列,直到第1个任务操 作完毕,下一个任务才能继续。
本例子的结果是 counter0每5个时钟报时周期加1,而 counter1每10个时钟报时周期加 1。
2 使用RTX51的信号
可以使用 os_wait功能暂停一个任务并等待从另一个 任务发出的信号或旗标。这可以用于协调两个或更多的任
务,等待一个信号会系统会执行如下工作:如果一任务在 等待一个信号并且信号标志是0,在这个信号被发送之前, 这个任务将一直处于挂起状态;如果信号标志已经是1, 当任务查询信号时,信号标志会被清除并且继续执行任务。
例13-3-2 下面的例子演示在允许其它任务执行时,如何使用 os_wait 函数延迟执行。
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */
long counter0;
/*任务0的计数器
*/
long counter1;
/*任务1的计数器
别的任务是按照时间片分别占用CPU 的。 RTX51任务有4个优先级:0、1、2 可以分配给标准任务,
优先级3是为快速任务保留的。每个任务都可以等待事件的发 生,而并不增加系统的负担;任务可以等待消息、信号、 中断、 超时事件或者它们的组合。
任务切换是按照一定规则进行的,包括:进入到“就绪” 状态的优先级高的任务先执行;如果“就绪” 状态的几个任务 是同一个优先级,那么最先进入“就绪”状态的先执行。 任务 状态切换如图13-3-1所示。
RTX51的等待功能支持以下事件: *超时(timeout):挂起运行的任务指定数量的时 钟周期。
*间隔(interval):类似于超时,但是软件定时器 没有复位,典型应用是产生时钟。
*信号(signal):用于任务内部同步协调。
RTX51支持的事件
*消息(message):适用于RTX51 Full用于信息的 交换。我们可以把一个消息发送到一个特定的邮 箱。消息由2字节组成,可以是用户按照自己的需 求定义的数据,也可以是指向数据的指针。 如果邮箱的消息列表已满,而且是中断发送 消息,这个消息将会丢失;如果是任务发送消息, 那么任务将会进入到等待状态,直到邮箱重新有 了位置可以接收这一条信息。 邮箱是按照FIFO的原则来管理消息的,如果 几个任务都在等待接收消息,那么最先进入等待 接收队列的将接收消息。一个邮箱最多可以存储8 条消息。当邮箱满的时候,最多只能有16个等待 任务。
#include <rtx51tny.h> /* RTX-51 tiny 头文件 */
#include<reg52.h>
long counter0;
/* 任务0的计数器 */
long counter1;
/*任务1的计数器
*/
long counter2;
/*任务2的计数器
*/
sbit P1_0=P1^0;
1 使用os_wait函数
os_wait()函数挂起一个任务来等待一个事件的发生。这样可 以同步2个或几个任务。它的工作过程如下:当任务等待的事 件没有发生的时候,系统挂起这个任务;当事件发生时,系 统根据任务切换规则切换任务。使用os_wait函数等待的最简 单的事件是RTX51 时钟报时信号中的超时周期,该类型的事 件可用于需要产生延时的任务。这可用作代码中的切换查询 在这样的情况下只需要每50ms 检查一次切换。