资源目录
压缩包内文档预览:(预览前20页/共60页)
编号:512186
类型:共享资源
大小:787.01KB
格式:RAR
上传时间:2015-11-11
上传人:QQ28****1120
认证信息
个人认证
孙**(实名认证)
辽宁
IP属地:辽宁
6
积分
- 关 键 词:
-
毕业设计
- 资源描述:
-
DZ204RTX51 Tiny的研究设计,毕业设计
- 内容简介:
-
摘 要 嵌入式系统为以应用为中心,以计算机技术为基础,软件、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积和功耗严格要求的专业计算机系统。 在制造工业、过程控制、通讯、仪器、仪表、 汽车、船舶、航空、航天、军事装备、消费类产品 等 方面均有广泛的应用 。 本设计 简要介绍 了小型实时操作系统 RTX51 TINY的主要特点和基本功能以及在单片机系统中的应用方法,并给出了一个 RTX51 的应用实例;详细地分析了这个内核创建任务时堆栈的配置和状态字结构及任务切换时的存储器管理,并给出创建任务及任务切换的主要代码流程图。 关键词: RTX51 TINY 嵌入式 实时操作系统 任务创建与切换 ntsAbstract The Embeded System with the base of computer technology, software and hardware can cut out, and fit in with the System of Special Computer that rigidly require to the function ,reliability, cost, volume and waste of power. There are plenty of applications in the industry of manufacture, the control of procedure ,communication, instrument, motorcar, shipping, aviation, the equipment of military affairs, the product of expenditure and so on. The main features and basic functions of RTX51 TINY, a small and real-time operation system, and its applications in the single-chip microcomputer systems are introduced simply in this paper, and an application example of it is given; stack configuration and the construction of task state are analyzed in detail when tasks are created, and, the memorizer manage is done in detail when tasks are switching, and the flow charts of primary codes are given in this paper. Key words: RTX51 TINY ; embeded real-time operating system; task creating and switching nts 目 录 第一章 概述 . 1 1.1 RTX51 TINY 的基本特性 . 1 1.2 RTX51 提供的基本功能 . 1 1.3 RTX51 的开发背景 . 2 1.4 使用 RTX51 意义及优点 . 4 1.5 KEIL C 软件使用 . 4 第二章 基本概念 . 13 2.1 嵌入式系统 . 13 2.2 实时系统 . 13 2.2.1 要和现实世界交互 . 14 2.2.2 系统庞大复杂 . 14 2.2.3 对可靠性和安全性的要求非常高 . 14 2.3 前、后台系统 . 15 2.4 操作系统 . 15 2.4.1 操作系统在计算机中的地位 . 15 2.4.2 操作系统的功能 . 16 2.5 实时操作系统 . 16 2.6 代码的临界区 . 17 2.7 资源 . 17 2.8 共享资源 . 17 2.9 任务 . 17 2.10 内核 . 18 2.11 调度 . 18 2.12 非占先式内核 . 18 2.13 占先式内核 . 19 2.14 可重入性 . 20 2.15 任务优先级 . 20 2.16 信号量 . 20 2.17 死锁 . 21 2.18 消息队列 . 21 2.19 中断 . 22 第三章 RTX51 TINY 内核的分析与应用 . 23 3.1 RTX51 TINY 的使用 . 23 3.2 RTX51 TINY 内核分析 . 23 3.2.1 同步机制与任务状态 . 23 3.2.2 调度规则 . 25 3.2.3 任务控制块 . 25 3.2.4 存储器管理 . 25 3.3 代码分析 . 26 3.3.1 主程序 main . 26 nts3.3.2 定时器 T0 中断服务程序 . 26 3.3.3 任务切换程序段 . 29 3.3.4 os_wait 程序段 . 31 3.3.5 其它程序段 . 31 3.4 应用实例 . 31 3.5 嵌入式操作系统的特殊问题处理 . 33 第四章 RTX-51 中任务的建立与任务切换 . 35 4.1 创建任务的函数 . 35 4.2 状态字结构 . 35 4.3 任务建立过程及流程 . 35 4.3.1 任务建立的堆栈分配 . 36 4.3.2 任务创建主要代码流程图 . 37 4.4 任务切换 . 39 4.4.1 任务切换概念 . 39 4.4.2 任务切换主要代码流程图 . 39 4.5 RTX51 TINY 中容易混淆的问题 . 42 4.5.1 关于时间片的问题: . 42 4.5.2 关于 os_wait 延时的问 题 . 43 第五章 RTX51 实时操作系统的简单应用程序 . 45 5.1 单任务程序 . 45 5.2 循环任务切换 . 45 5.3 等待时间到 . 46 5.4 等待信号 . 47 5.5 RTX51 TINY 的技术参数 . 48 5.6 应用程序例子 . 49 结束语 . 55 参考文献 . 56 nts 1 第一章 概述 1.1 RTX51 Tiny 的基本特性 RTX51是德国 Keil公司开发的一种应用于 MCS51系列单片机功能强大的、可用于目前世界上所有由 Intel 8051 标准内核派生出的 350多种增强微控制器的实时操作系统 。 RTX51有两个版本 :RTX51 Full和 RTX51 Tiny。 RTX51Tiny 短小精悍 , 是 RTX51Full的一个子集 ,仅支持按时间片循环任务调度,支持任务间信号传递, 最大 16个任务 ,可以并行地利用中断。具有以下等待操作:超时、另一个任务或中断的信号。但它不能进行信息处理,不支持存储区的分配和释放,不支持占先式调度。 RTX51 TINY是一个很小的内核,完全集成在 KEIL C51编译器中。更重要的是, 只占用 900 字节 ROM、 7字节 DATA型及 3倍于任务数量的 IDATA型 RAM空间 ,可以很容易地运行在没有扩展外部存储器的单片机系统上 。 RTX51Tiny 允许 “ 准并行 ” 同时执行几个任务。每一个任务在预先定义好的时间片内得以执行。时间到使正在执行的任务挂起 ,并使另一个任务开始执行。 RTX51 TINY下文简称为内核。 1.2 RTX51 提供的基本功能 RTX51功能众多 ,不能一一叙述 。 于此只介绍一些主要功能 : ( 1) 用 RTX51进行时间片轮转调度 RTX51能够完成多重任务的时间片轮转 ,并且允许准并行执行多个无限循环或任务 .多重任务并不是并行执行 ,而是按时间片执行的 .RTX51允许每个任务执行一个预先确定的时间 ,然后切换到另一个准备运行的任务 ,并且允许这个任务执行片刻 。 ( 2) RTX51事件 在等待一个任务的时间片到达时 , 可以使用 os-wait函数通知 RTX51, 让另一个任务开始执行 。 这个 函数 终止正在运行的当前任务 , 然后等待指定事件的发生 。 这时 , 任意数量的其它任务仍可以执行 。 RTX51的等待功能支持以下事件 : 超时 (timeout):挂起运行的任务指定数量的时钟报时周期 。 间隔 (interval):仅在 RTX51Tiny中使用 , 类似于超时 , 但是软件定时器没有 用 复位来产生循环的间隔 (时钟所需要的 )。 信号 (signal):用于任务内部协调 。 nts 2 ( 3) RTX51信号 os-wait函数可以暂停一个任务并等待从另一个任务发出的信号 。 这可以用于协调 2个或更多的任务 。 如果 1 个任务在等待 1 个信号 , 并且信号标志是 0, 在信号被发送之前 , 这个任务将一直处 于挂起状态 。 如果信号标志已经是 1, 当任务查询信号时 , 信号标志会被清除 , 并能继续执行该任务 。 ( 4) 用 RTX51进行编译和连接 RTX51 是完全地统一到 C51 程序设计语言中 , 也就是说 RTX51 程序要 用 C51 来 编写和编 译 ,仅在指定任务标志符和优先级上有一点差别 。 RTX51 程序要求在应用程 中使用include 命令引入实时管理的头文件 ,并使用 BL51Linker/Locator 连接和选择适当的RTX51库文件 。 操作 RTX51需以下软件 :( 1) C51编译程序 ; ( 2) BL51codebanking连接程序 ; ( 3) A51宏汇编程序 ; ( 4) 相应的库文件和包含文件 。 对于 RTX51Tiny来说 ,其库文件 RTX51TNY.LIB 必须保存在 DOS环境变量 C51LIB指定的程序库路径内 。 一般是目录C51LIB; 包含文件 RTX51tny.h必须保存在 DOS环境变量 C51INC指定的包含路径内 。一般是目录 C51INC。 1.3 RTX51的开发背景 传统的单片机应用系统程序一般是基于单任务机制的 。 在这种机制下 ,组成系统程序的各功能模块按固定的顺序构成系统程序整体 ,并且分别作为一个任务得到循环执行 ,如图 1-1所示 . 这种机制 具有程序流程简洁明了、易于控制和改变等特点。 nts 3 . . . 图 1-1 单任 务机制下的程序流程 在控制领域中多数单片机应用系统功能复杂并且时间要求严格而精确 。 在这种情 况下 , 单任务机制往往难以胜任 。 这时 , 单片机系统功能往往可以分解为多个 相对独立的模块 , 将这些模块理解为任务 , 从而可以引入多任务机制进行管理 。 引入多任务机制后 ,可以有效地改善程序结构 , 满足应用系统复杂的定时要求 。 在多任务机制下 , CPU 的运行时间被划分成许多小的时间片 , 由某种调度算法按不同的优先级别分配给不同的任务 。多个任务分别在各自的时间片内访问 CPU, 从而产生了微观上轮流运行、宏观上并行运行的多任务效果 ,如图 1-2所示 。 开始 任务 1 任务 2 任务 N nts 4 图 1-2 多任务机制下的程序流程 多任务的实现本质上都借助于中断机制 。 通用单片机都允许使用中断 , 从而保证了在单片机系统中的多任务切实可行 。 然而 , 单片机运算能力的有限又要求多任务调度算法必须简洁高效 。 若人为地构造调度程序和调度算法 , 在复杂的应用系统中 , 其工作量和难度可想而知 。 为了在更广泛的领域中应用单 片机系 统 , 小型实时操作系统 RTX51 应运而生 。 1.4 使用 RTX-51的意义及优点 许多微控制器应用程序需要同时执行多个任务,对这种应用程序,实时操作系统允许对多任务系统资源灵活的编目。 RTX51 提供功能强大的实时操作系统( RTOS),可以运行在所有 8051系列单片机系统中 。可以用标准的 C函数编写 RTX51程序并用 C51来编译,还可以用标准的 C 变量来定义任务号和优先权。 ( 1)在 KeilC51 开发系统中,综合 RTX-51的简单应用; ( 2)完全支持 C51的所有特性,例如:浮 点 操作、重装函数和中 断函数; ( 3)用户所用的 RTX-51的配置全为 8051/MCS251系列单片机; ( 4)完全的灵活性需要很少的系统资源,也能应用与时间要求严格的应用 。 1.5 KEIL C 软件使用 Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编 ,PLM 语言和 C 语言的程序设计,界面友好,易学易用。 下面介绍 Keil C51 软件的使用方法 进入 Keil C51 后,屏幕如下图所示。 几秒钟后出现编辑界 面, 开始 调度程序 任务 1 任务 2 任务 N nts 5 启动 Keil C51时的屏幕 进入 Keil C51后的编辑界面 , 简单程序的调试 学习程序设计语言、学习某种程序软件,最好的方法是直接操作实践。下面通过简单的编程、调试,引导大家学习 Keil C51 软件的基本使用方法和基本的调试技巧。 1) 建立一个新工程 单击 Project 菜单,在弹出的下拉菜单中选中 New Project 选项 , nts 6 2) 然后选择你要 保存的路径 , 输入工程文件的名字 , 比如保存到 C51目录里 , 工程文件的名字为 C51。 如下图所示 ,然后点击保存 。 3)这时会弹出一个对话框 , 要求你选择单片机的型号 ,你可以根据你使用的单片机来选择 ,keil c51几乎支持所有的 51核的单片机 ,我这里还是以大家用的比较多的 Atmel 的89C51来说明 ,如下图所示 ,选择 89C51之后 ,右边栏是对这个单片机的基本的说明 ,然后点击确定 。 nts 7 4)完成上一步骤后,屏幕如下图所示到现在为止,我们还没有编写一句程序,下面开始编写我们的第一个程序。 5)在下图中,单击 “File” 菜单,再在下拉菜单中单击 “New” 选项新建文件后屏幕如下图所示 nts 8 此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了,但笔者建议首先保存该空白的文件,单击菜单上的 “File” ,在下拉菜单中选中 “Save As” 选项单击,屏幕如下图所示,在 “ 文件名 ” 栏右侧的编辑框中,键入欲使用 的文件名,同时,必须键入正确的扩展名。注意,如果用语言编写程序,则扩展名为 (.c);如果用汇编语言编写程序,则扩展名必须为 (.asm)。然后,单击 “ 保存 ” 按钮。 nts 9 6)回到编辑界面后,单击 “Target 1” 前面的 “ ” 号,然后在 “Source Group 1”上单击右键,弹出如下菜单 然后单击 “Add File to Group Source Group 1” 屏幕如下图所示 nts 10 选中 Test.c,然后单击 “Add ” 屏幕好下图所示 注意到 “Source Group 1” 文件夹中多了一个子项 “Text1.c” 了吗?子项的多少与所增加的源程序的多少相同 。 7)现在,请输入如下的 C语言源程序 : #include /包含文件 #include void main(void) /主函数 SCON=0x52; TMOD=0x20; TH1=0xf3; TR1=1; /此行及以上 3行为 PRINTF函数所必须 printf(“Hello I am KEIL. n”); /打印程序执行的信息 printf(“I will be your friend. n”); while(1); 输入上述程序时,读者已经看到了事先保存待编辑的文件的好处,即 Keil c51会自动识别关键字,并以不同的颜色提 示用户加以注意,这样会使用户少犯错误,有利于提nts 11 高编程效率。程序输入完毕后,如下图所示 8)在上图中,单击 “Project” 菜单,再在下拉菜单中单击 “Built Target” 选项(或者使用快捷键 F7),编译成功后,再单击 “Project” 菜单,在下拉菜单中单击nts 12 “Start/Stop Debug Session” (或者 使用快捷键 Ctrl+F5) ,屏幕如下所示9)调试程序 :在上图中,单击 “Debug” 菜单,在下拉菜单中单击 “Go” 选项,(或者使用快捷键 F5),然后再单击 “Debug” 菜单,在下拉菜单中单击 “Stop Running” 选项(或者使用快捷键 Esc);再单击 “View” 菜单,再在下拉菜单中单击 “Serial Windows #1选 nts 13 项,就可以看到程序运行后的结果,其结果如下图所示至此,我们在 Keil C51上做了一个完整工程的全过程。 但这只是纯软件的开发过程,如何使用程序下载器看一看程序运行的结果呢 ? 10) 单击 “Project” 菜单,再在下拉菜单中单击 “ ” 在下图中,单击 “ Output” 中单击 “ Create HEX File” 选项 ,使程序编译后产生 HEX代码,供下载器软件使用。把程序下载到 AT89S51单片机中。 nts 14 第二章 基本概念 2.1 嵌入式系统 嵌入式系统被定义为:以应用为中心,以计算机技术为基础,软件、硬件可裁剪, 适应应用系统对功能、可靠性、成本、体积和功耗严格要求的专业计算机系统。 嵌 入式计算机在应用数量上远远超过了通用计算机,一台通用计算机的外部设备中就包括了 5 10 个嵌入式微处理器,键盘、鼠标、软驱、硬盘、显示卡、显示器、网卡、 Modem、声卡、打印机、扫描仪 、数字相机、 USB集线器等均是由嵌入式处理器控制的。在制造工业、过程控制、通讯、仪器、仪表、汽车、船舶、航空、航天、军事装备、消费类产品方面均是嵌入式计算机的应用领域。 嵌 入 式系统是将先进的计算机技术、半导体技术、电子技术和各行各业的具体 应用相结合的产物,这一特点就决定了它必然是一个技术密集、资金密集、 高度分散、不断创新的知识集成系统。 今天 嵌入式系统带来的工业年产值已超过了 1万亿美元, 1997 年来自美国嵌入式大会( Embedded System Conference)的报告指出,未来 5年 仅基于嵌入式 计算机系统 的全数字电视产品,就将在美国产生一个每年 1500亿美元的新市场。美国汽车大王福特公司的高级经理也曾宣称,“福特出售的计算能力已超过了 IBM”,由此可以想见嵌入式计算机工业的规模和广度。 1998 年 11月在美国加州何塞举行的嵌入式系统大会上,基于 RTOS的 Embedded Internet 成为一个技术新热点。 美国著名未来学家尼葛洛庞帝 99年 1月访华时预言, 4 5年之后嵌入式智能(电脑) 工具将是 PC和因特网之后最伟大的发明。我国著名嵌入 式系统专家、华中科技大学教授沈绪榜院 士 98 年 11月在武汉全国第 11次微机学术交流会上发表的计算机的发展与技术一文中,对未来 10年以嵌入芯片为基础的计算机工业给出了十分令人鼓舞的展望。 2.2 实时系统 实时系统是任何必须在指定的有限时间内给出响应的系统。在这种系统中,时间起到重要的作用,系统成功与否不仅要看是否输出了逻辑上正确的结果,而且还要看它是否在指 定时间内给出了这个结果。 按照对时间要求的严格程度,实时系统被划分为硬实时( hard real time)、固实 nts 15 时 ( firm real time)和软实时( soft real time)。硬实时系统是指系统响应绝对要求在指定的 时 间范围内。软实时系统中, 及时响应也很重要,但是偶尔响应慢了也可以接受。而在固实时系统中, 不能及时响应会造成服务质量的下降。 飞机的飞行控制系统是硬实时系统,因为一次不能及时响应很可能会造成严重后果。数据采集系统往往是软实时系统,偶尔不能及时响应可能会造成采集数据不准确,但是没什么严重后果。 VCD 机控制器如果不能及时播放画面,不会造成什么大的损失,但是可能会使用户对产品质量失去信心,这样的系统可以算作固实时系统。 常见的实时系统通常由计算机通过传感 器 输入一些数据,对数据进行加工处理后,再控制一些物理设备做出响应的动作。比如冰箱的温度控制系统需要读入冰箱内的温度,决定是否需要继续或者停止降温。由于实时系统往往是大型工程项目的核心部分,控制部件通常嵌入在大的系统中,而控制程序则固化在 ROM中,因此有时也被称作嵌入式系统( embedded system)。 实时系统需要响应的事件可以分成周期性( periodic)的和非周期性( aperiodic)的。比如空气监测系统每过 100ms通过传感器读取一次数据,这是周期性的;而战斗机中的飞行控制系统需要面对各种突发 时件,属于非周期性的。 实时系统有以下特点。 2.2.1 要和现实世界交互 这是实时系统区别于其它系统的一个显著特点。它往往要控制外部设备,使之及时响应外部事件。比如生产车间的机器人,必须把零部件准确地组装起来 。 2.2.2 系统庞大复杂 实时系统的复杂性不仅仅体现在代码行数上,而且体现在需求的多样性上。由于实时系统要和现实世界打交道,而现实世界总是变化的,这会导致实时系统在生命周期里时常面 对需求的变化,不得不做出相应的变化。 2.2.3 对可靠性和安全性的要求非常高 很多实时系统应 用在十分重要的地方,有些甚至关系到生命安全。系统的失败会导 致生命和财产的损失,这就要求实时系统有很高的可靠性和安全性。 nts 16 实时系统常常需要同时控制许多外部设备,例如,系统需要同时控制传感器、传送带和传动器等设备。多数情况下,利用把微处理机时间片分配给不同的进程 ,可以模拟并行。但是,在系统对响应时间要求十分高的情况下,分配时间片模拟的方法可能无法满足要求。这时,就得考虑使用多处理机系统。这也就是为什么多处理机系统最早是在实时系统领域里繁荣起来的原因所在。 2.3 前、后台系统 对于使用 51 系列单片 机的工程师来说,应用程序一般是一个无限的循环,可称为前、后台系统或超循环系统。 循环中调用相应的函数完成相应的操作,这部分可以看成后台行为。中断服务程序处理异步事件,这部分可以看成前台行为。后台也可以叫做任务级。前台也叫做中断级,时间相关性很强的关键操作一定是靠中断服务程序来保证的。因为中断服务提供的信息一直要等到 后台程序走到该处理这个信息这一步时才能得到进一步处理,所以这种系统在处理的及时性上比实际可以作到的要差。这个指标称 做 任务级响应时间。最坏情况下的任务级响应时间取决于整个循环的执行时间。因为循环的执行 时间不是常数,程序经过某一特定部分的准确时间也不能确定。进而,如果程序修改了,程序的时序也会受到影响。 很多基于微处理器的产品采用前、后台系统设计 ,例如微波炉、 电话机和玩具等。在另外一些基于微处理器的应用中,从省电的角度出发,平时微处理器处在停机状态,所有工作都靠中断服务来完成。 2.4 操作系统 操作系统是计算机中最基本的程序。操作系统负责计算机系统中全部软硬资源的分配以及回收、控制与协调等并发的活动;操作系统提供用户接口,使用户获得良好的工作环境;操作系统为用户扩展新的系统功能提供软件 平台。 2.4.1 操作系统在计算机中的地位 操作系统是计算机中必不可少的系统软件,只有配置了操作系统这一系统软件后,才能使计算机系统体现出系统的完整性和可利用性。当用户要求计算机帮助完成其计算任务时,用户仅仅需要编制好源程序(用户在源程序中,可以利用操作系统提供的系统nts 17 调用命令请求操作系统作相应的服务);而其余大量工作,如作业控制、并发活动 之间的协调与合作、系统资源的合理分配和利用、各种调度策略的制定以及人机联系方式等都是由操作系统来实施的。所以,操作系统使整个计算机系统实现了高度自动化、高效率及可靠性 。 2.4.2 操作系统的功能 操作系统的功能主要包括四大部分 : ( 1)处理机管理 计算机系统中最重要的资源就是 CPU。在处理机管理中,人们最关心的是 CPU 运行实践的分配。最简单的策略是让单个用户独占 CPU,直到完成计算任务为止。但是, 多数计算为了等待完成 I/O操作,会浪费一半的 CPU时间。出于经济上的考虑,一般系统(包括高档微型机)都是由多个用户同时分用。要满足多个用户同时分用 CPU,必须采用“微观上串行”的策略。此时,需要解决 CPU分配给哪个用户程序使用、占用多长时间以及下一个有该轮到哪个程序运行等 问题。所以,处理机分配的功能是提出调度策略和给出调度算法。 ( 2)存储器管理 在任何一个计算机系统中,仅次于 CPU的资源是内存。内存资源也十分宝贵。内存的存储调度应和 CPU 调度结合起来,即只有当程序在内存时,才有可能到处理机上运行,而且仅当程序需要在处理机上运行时才把它调入内存。这种调度策略将能实现对内存的最有效的利用。 ( 3)设备管理 各个用户程序在其运行的开始阶段、中间阶段或结束阶段都可能有输入或输出,因此需要请求使用外部设备。在一般情况下,外设的种类与数量是有限的,一般来讲 设备的种类和数量往往少于用户 的个数,所以正确分配这些设备是很重要的。 对设备分配通常采用以下三种基本技术: 1) 独享技术; 2) 共享技术; 3) 虚拟技术; ( 4)软件资源管理 软件资源简单地说就是指计算机系统中各种程序和数据的集合。其中,程序又分为系统程序和用户程序。 nts 18 软件资源管理需要解决的问题是,为用户提供一种简便、统一的存取和管理信息的方法,并要解决信息共享 、数据存取控制和保密等问题。 2.5 实时操作系统 实时操作系统( RTOS)是一段在嵌入式系统启动后首先执行的背景程序。用户的应用程序是运行于 RTOS 之上的各个任务, RTOS 根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、任务调度和异常处理等工作。在 RTOS支持的系统中,每个任务均有一个优先级, RTOS根据各个任务的优先级,动态地切换各个任务,保证对实时性的要求。工程师在编写程序时,可以分别编写各个任务,不必同时将所有任务运行的各种可能情况记在心中,大大减少了程序编写的工作量,而且减少了出错的可能,保证最终程序具有高可靠性。实时多任务操作系统,以分时方式运行多个任务,看上去好像是多个任务“同时“运行。任务之间的切换应当以优先级为根据,只有具有优先服务方式的 RTOS才是真正的实时操作系统,而时间分片方式和协作方式的 RTOS并不是真正的“实时”。 2.6 代码的临界区 代码的临界区也简称为临界区。该区代码在处理时是不可分割的。运行这些代码不允许被打断。一旦这部分代码开始执行 ,则不允许任何中断打入(这不是绝对的,如过中断不调用任何包含临界区的代码,也不访问任何临界区使用的共享资源,则这个中断可能可以执行)。为确保临界区代码的执行,在进入临界区之前要关中断,而临界区代码执行完成以后要立即开中断。 2.7 资源 程序运行时可使用的软硬件环境统称为资源。资源可以是 输入 /输出设备,例如打印机、键盘和显示器;资源也可以是一个变量、一个结构或一个数组等。 2.8 共享资源 可以被一个以上任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在nts 19 与共享资源打交道时,必须独占该资源,这叫做互斥。至于在技术上如何保证互斥条件,本章会做进一步讨论。 2.9 任务切换 当多任务内核决定运行另外的任务时,保存正在运行任务的当前状态,即保存 CPU寄存器中的全部内容。这些内容 保存在任务的当前状态保存区,也就是任务自己的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态 从任务的栈中重新装入 CPU的寄存器,并开始下一个任务的运行。这个过程就称为任务切换。这个过程增加了应用程序的额外负荷。 CPU 的内部存储器越多, 额外负荷就越重。做任务切换所需要的时间取决于 CPU 有多少寄存器要入栈。实时内核的性能不应该以每秒钟能做多少次任务切换来评价。 2.10 内核 多任务系统中,内核负责管理各个任务,或者说为每个任务分配 CPU时间,并且负责任务之间的通信。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理 它们。 。内核本身也增加了应用程序的外负荷。代码空间增加 ROM 的用量,内核本身的数据结构增加了 RAM的用量;但更主要的是,每个任务要有自己的栈空间,这一块占起内存来是相当厉害的。内核本身对 CPU的占用时间一般在 2 5个百分点之间。 通过提供比不可少的系统服务,诸如信号量管理、消息队列和延时等,实时内核使得CPU 的利用更为有效。一旦读者用实时内核做过系统设计,将决不再想返回到前、后台系统。 2.11 调度 调度是内核的主要职责之一。 调度就是决定该轮到哪个任务运行了。多数实时内核是基于优先级调度法的。 每个任务根据其重要程度的不同赋予一定的优先级。基于优先级的调度法是指 CPU 总是让处在就绪态的优先级最高的任务先运行。然而究竟何时让高优先级任务掌握 CPU 的使用权,有两种不同的情况。这要看用的是什么类型的内核,是占先式的内核还是非占先式的内核。 nts 20 2.12 非占先式内核 非占先式内核要求每个任务自我放弃 CPU的所有权。非占先式调度法也称做合作型多任务,各个任务彼此 合作共享一个 CPU。异步事件还是由中断服务来处理的。中断服务可以是一个高优先级的任务有挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断 了的那个任务,直到该任务主动放弃 CPU的使用权时,那个高优先级的任务才能获得 CPU的使用权。 在任务级,非占先式内核允许使用不可重入函数。函数的可重入性以后会讨论。每个任务都可以调用非可重入函数,而不必担心其他任务可能正在使用该函数,从而造成数据的破坏,因为每个任务要运行到完成时才释放 CPU的控制权。当然,该不可重入函数本身不得有放弃 CPU控制权的企图。 使用非占先式内核时,任务级相应时间比前、后台系统快的多。此时的任务级响应时间取决于最长的任务执行时间。 非占先式内核的另一个优点是,几乎不需要使用信号量保 护 共享数据。运行着的任务占有 CPU,而不必担心被别的任务抢占。但这也不是绝对,在某钟情况下,信号量还是用得着的。处理共享 I/O设备时仍需要使用互斥型信号量。例如,在打印机的使用上,仍需要满足互斥条件。 非占先式内核的最大缺陷在于其响应时间。高优先级的任务已经进入就绪态,但还不能运行,也许要等很长时间,直到当前运行着的任务释放 CPU。与前、后台系统一样,非占先式内核的任务级响应时间 是不确定的,不知道什么时候最高优先级的任务才能拿到 CPU的控制权。这完全取决于应用程序什么时候释放 CPU。 总之,非占先式内核允许 每个任务运行,直到该任务自愿放弃 CPU的控制权。中断可以打入运行着的任务,中断服务完成以后将 CPU控制权还给被中断了的任务。任务级响应时间要大大好于前、后台系统,但仍是不可知的。商业软件几乎没有非占先式内核。 2.13 占先式内核 当系统响应时间很重要时,要使用占先式内核。因此, 绝大多数商业上销售的实时内核都是占先式内核。最高优先级的任务一旦就绪,总能的到 CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪状态时,当前任务的 CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得 到了 CPU 的控制权。如果是中断nts 21 服务子程序使一个高优先级的任务进入了就绪态,则完成中断时,中断了的任务被挂起,优先级高的那个任务开始运行。 使用占先式内核,最高优先级的任务什么时候可以执行以及什么时候可以得到 CPU的控制权是可知的。使用占先式内核使得任务级响应时间得以最优化。 使用占先式内核,应用程序不应直接使用不可重入函数 。调用不可重入函数时,要满足互斥条件。这一点可以用互斥信号量来实现。如果调用不可重入函数时,低优先级的 CPU使用权被高优先级任务剥夺,则不可重入函数中的数据有可能被破坏。综上所述,占先式内 核总是让就绪态的高优先级的任务先运行,中断服务程序可以抢占 CPU,到中断服务完成时,内核让此时优先级高的任务运行(不一定是那个被中断了的任务)。这样,任务级系统响应时间得到了最优化,而且是可知的。 2.14 可重入性 可重入型函数可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候 都可以被中断,一段时间以后有可以运行,而响应数据不会丢失。如果重入型函数只使用局部变量,则局部变量保存在 CPU寄存器中或堆栈中;如果使用全局变量,则要对全局变量予以保护。 2.15 任务优先级 任务的优先级 是表示任务被调度的优先程度。每个任务都具有优先级。任务越重要,赋予的优先级应越高,越容易被调度而进入运行态。 2.16 信号量 信号量是 20 世纪 60年代中期由 Edgser dijkstra 发明的。它实际上是一种程序间的约定机制,这种约定决定哪个程序(任务)可以执行。 在多任务内核中普遍将信号量用于: 控制共享资源的使用权(满足互斥条件); 标志某事件的发生; 使两个任务的行为同步; 信号量像是通行证,且用行证的数目是有限的。任务要运行下去,要先拿到通行证。nts 22 如果信号 量被别的任务占用,则该任务只得被挂起,直到信号量被当前使用者释放掉。信号量的植可以是 0 255、 0 65535、 0 4294967295,取决于信号量规约机制使用的是 8 位、 16 位还是 32 位。到底是几位,实际上取决于用的哪种内核。根据信号量的植 ,内核跟踪那些等待信号量的任务。 一般地说,对信号量只能实施三种操作:初始化,也称做建立;等信号,也称做挂起;给信号或发信号。信号量初始化时要给信号量赋初值,等待信号量的任务表应清为空。 想要得到信号量的任务执行等待操作。如果该信号量有效(即信号量值大于 0),则信 号量值减 1,任务得以继续运行。如果信号量的值为 0,则等待信号量的任务就被列入等待信号量任务表。多数内核允许用户定义等待超时,如果等待时间超过了某一设定值 ,该信号量还是无效,则等待信号量的任务进入就绪态准备运行,并返回错代码(指出发生了等待超时错误)。 2.17 死锁 所谓死锁 ,是指各并发任务 彼此 等待对方所拥有的字,且这些并发任务在得到对方的资源之前不会释放自己所有的资源,从而造成大家都想得到资源而又都的不到资源,各并发任务不能继续向前推进的状态。最简单的防止发生死琐的方法是让每个任务做到: ( 1) 先得到全部 需要的资源,不再做下一步的工作。 ( 2) 用同样的顺序去申请多个资源,释放资源是使用相反的顺序。 内核大多数允许用户在申请信号量时定义等待超时,以此化解死锁。当等待时间超过了某一确定值, 信号量还是无效状态时,就会返回某种形式的出现超时错误的代码。这个出错代码告知该任务,不是得到了资源使用权,而是系统错误。死锁一般发生在大型多任务系统中,在嵌入式系统中不易出现。 2.18 消息队列 消息队列用于给任务发消息。通过内核提供的服务,任务或中断服务子程序可以将一条消息防入消息队列。同样,一个或多个任务可以通过内核 服务从消息队列中得到消息。通常,消息队列传递的是一个指针,以便任务可以通过它发送和接收任意类型数据(即消息,也就是指针指向的内容) 。通常,先进入消息队列的消息先传给任务,也就说,任务先得到的是先进入消息队列的消息,即先进先出原则( FIFO)。 nts 23 当一个以上的任务要从消息队列接受信息时,每个消息队列有一张 等待消息任务的等待列表。如故消息队列中没有消息,即消息队列是空,则等待消息的任务就被放入等待消息任务列表中直到有消息到来。通常,内核允许等待消息的任务定义等待超时的时间。如果在限定时间内任务没有受到消息,则该 任务就进入就绪态并开始运行,同时返回出错代码 ,指出出现等待超时错误。一旦一则消息放入消息队列,则该消息将传给等待消息的任务中优先级最高的那个任务,或是最先进入等待消息任务列表的任务。 内核提供的典型消息队列服务如下: ( 1) 消息队列初始化,队列初始化时总是清为空。 ( 2) 放一则消息到队列中去( POST)。 ( 3) 等待一则消息的到来( PEND)。 ( 4) 无等待取得消息。如故队列中有消息则任务可以得到消息,消息从队列中取走;但如果此时队列为空,则内核不将该任务挂起,只是用特别的返回代码通知调用者 ,队列中没有消息。 2.19 中断 中断是一种硬件机制,用于通知 CPU 有异步事件发生了。中断一旦被识别, CPU 保存部分(或全部)寄存器的值,跳转到专门的子程序。该子程序称为中断服务子程序( ISR)。中断服务子程序做时间处理,处理完成后,程序回道义下部分: ( 1) 在前、后台系统中,程序回到后台程序; ( 2) 对非占先式内核而言,程序回到了被中断了的任务; ( 3) 对占先式内核而言,让进入就绪态的优先级最高的任务开始运行。 中断使得 CPU 可以在事件发生时才予以处理,而不必让微处理器连续不断地查 询是否有事件发生。通过两条特殊指令,即关中断和开中断,可以让微处理器不响应 或响应中断。在实时环境中,关中断的时间应尽量短。 关中段影响中 段 延迟时间。关中断时间太长可能 会 引起中断丢失。微处理器一般允许中断嵌套,也就是在中断服务期间,微处理器可以识别到另一个更重要的中断,并服务于那个更重要的中断。 nts 24 第三章 RTX51 TINY 内核的分析与 应用 3.1 RTX51 TINY 的使用 RTX51 Tiny 内核完全集成在 Keil C51 编译器中 ,以系统函数调用的方式运行 ,因此可以很容易地使用 Keil C51语言编写和编译一个多任务程序 ,并嵌入到实际应用系统中。内核主要提 供以下函数供应用程序引用 ,见表 1所示。 表 1 RTX51Tiny主要系统函数说明 系统函数 文字说明 isr_send_signal 从一个中断发送一个信号到一个任务。 Os_clear_signal 删除一个发送的信号。 Os_create_task 移动一个任务到运行队列。 Os_delete_task 从运行队列中删除一个任务。 os_running_task_id 返回当前运行任务的任务标识符 (task ID)。 Os_send_signal 从一个任务发送一个信 号到另一个任务。 Os_wait 等待一个事件。 各函数的函数原型 和具体意义,可以阅读参考文献 1。 3.2 RTX51 TINY 内核分析 3.2.1 同步机制与 任务状态 RTX51 Tiny的用户任务具有表 2所列的几个状态 ,它们如图 2-1所示进行切换。 为了保证任务在执行顺序上的协调 ,必须采用同步机制。内核用以下事件进行任务间的通信和同步 : (1)SIGNAL:用于任务之间通讯的位 ,可以用系统函数进行置位或清除。如果一个任务调用了 os_wait 函数等待 SIGNAL 而 SIGNAL 未置位 ,则该任务被挂起直到 SIGNAL 置位 ,才返回到 READY状态 ,并可被再次执行。 (2)TIMEOUT:由 os_wait函数开始的时间延时 ,其持续时间可由定时节拍数确定。带有 TIMEOUT 值调用 os_wait 函数的任务将被挂起 ,直到延时结束 ,才返回到 READY 状态 ,nts 25 并可被再次执行。 (3)INTERVAL:由 os_wait函数开始的时间间隔 ,其持续时间可由定时节拍数确定。带有 INTERVAL 值调用 os_wait 函数的任务将被挂起 ,直到间隔时间结束 ,才返回到 READY状态 ,并可被再次执行。与 TIMEOUT不同的是 ,任务的节拍计数器不复位。 RTX51 Tiny采用微控制器 (51)内部定时器 T0来产生定时节拍 ,各任务只在各自分配的定时节拍数 (时间片 )内执行。当时间片用完后 ,切换至下一任务运行 ,因此各任务是并发执行的。 RTX51Tiny 调度程序定义这些任务按照下面的规则运行 : A: 如果出现以下情况 ,当前运行任务中断 : 任务调用 os_wait函数并且指定事件没有发生。 任务运行时间超过定义的时间片轮转超时时间。 B: 如果出现以下情况 ,则开始另一 个任务 : 没有其他的任务运行。 将要开始的任务处 READY或 TIME-OUT状态。 表 2 RTX51Tiny任务状态说明 状 态 说 明 RUNNING 当前正在运行的任务处于 RUNNING状态。 同一时间只有一个任务可以运行。 READY 等待运行的任务处于 READY 状态。在当前运行的任务处理完成后 ,RTX51 Tiny 开始下一个处于 READY 状态的任务。 WAITING 等待一个事件的任务处于 WAITING状态。 如果事件发生的话任务进入 READY状态。 DELETED 没有开始的任务处于删除状态。 TIME-OUT 被时间片轮转超时终端的任务处于 TIME-OUT状态。 这个状态与 READY状态相同。 nts 26 时间片到 时间片结束 信号或超时到来 等待信号或超时 3.2.2 调度规 则 RTX51 TINY使用 8051内部定时器 T0 来产生定时节拍,各任务只在各自分配的定时节拍数(时间片)内执行。当时间片用完后,切换至下一个任务运行,因此,各任务是并发执行的。调度规则如下:如果( 1)任务调用了 os_wait函数,且特定事件还没有发生,( 2)任务执行比循环切换所规定的时间长,则运行任务被中断 ;如果( 1)没有其它任务正在运行,( 2)任务处于“ READY“或“ TIMEOUT“状态下等待运行,则另一个任务开始。 3.2.3 任务控制块 为了能描述和控制任务的运行,内核为每个任务定义了称作任 务控制块的数据结构,主要包括三项内容: ( 1) ENTRYtask_id: task_id任务的代码入口地址,位于 CODE 空间, 2字节为一个单位。 ( 2) STKPtask_id: task_id任务所使用堆栈栈底位置,位于 IDATA空间, 1字节为一个单位。 ( 3) STATEtask_id.timer和 task_id.state:前者表示任务的定时节拍计数器,在每一次定时节拍中断后都自减一次;后者表示任务状态寄存器,用其各个位来表示任务所处的状态。位于 IDATA空间, 2字节为一个单位。 READY! TIMEOUT RUNNING WAITING nts 27 3.2.4 存储器管理 内核使用了 KEIL C51 编译器的对全局变量和局部变量采取 静态分配存储空间的策略,因此存储器管理简化为堆栈管理。内核为每个任务都保留一个单独的堆栈区,全部堆栈管理都在 IDATA 空间进行。为了给当前正在运行的任务分配尽可能大的栈区,所以各个任务所用的堆栈位置是动态的,并用 STKPtask_id来记录各任务的堆栈栈底位置。当堆栈自由空间小于 FREESTACK(默认为 20)个字节时,就会调用宏 STACK-ERROR,进行堆栈出错处理。 在以下情况会进行堆栈管理: A任务切 换,将全部自由堆栈空间分配给正在运行的任务; B任务创建,将自由堆栈空间的 2 个字节,分配给新创建的任务 task_id,并将ENTRYtask_id放入其堆栈; C.任务删除,回收被删除的任务 task_id 的堆栈空间,并转换为自由堆栈空间。 3.3 代码分析 内核代码用汇编语言写成,可读性差,但代码效率较高,主要由两个源程序文件conf_tny.a51 和 rtxtny.a51 组成。前者是一个配置文件,用来定义系统运行所需要的全局变量和堆栈出错的宏 STACK-ERROR,这些全局变量和 宏,用户都可以根据系统的配置灵活修改;后者是系统内核,完成系统调用的所有函数。 3.3.1 主程序 main 主程序 main的主要任务是初始化各任务堆栈栈底 指针 STKP、状态字 STATE和定时器T0,创建任务 0并将其导入运行队列。这个过程加上 KEIL C51 的启动代码 CSTARTUP 正是一般嵌入式系统中 BSP所作的工作。 3.3.2 定时器 T0中断服务程序 内核使用定时器 T0作为定时节拍发生器,是任务切换、时间片轮转的依据。中断服务程序有三个任务。 ( 1)更新各个任务节拍数:将 STATE task_id.timer 减 1,如果某任务超时nts 28 ( STATEtask_id.timer=0),并且该任务正在等待超时事件,则将该任务置为“ READY”状态,使其返回任务队列。 ( 2)检查自由堆栈空间:若自由堆栈空间范围小于 FREESTACK(默认为 20)个字节时,就会调用宏 STACK-ERROR,进行堆栈出错处理。 ( 3) 检查当前任务(处于 RUNNING状态)的时间片是否到时。若当前任务的时间片到时,将程序转到任务切换程序段 ( task switching)切换下一任务运行。 程序流程如图 2-2所示: nts 29 T I M E R I N G允 许 中 断保 护 现 场重 新 启 动 T 0自 由 堆 栈足 够 ?各 任 务 是 否 等 待 超时 且 超 时 事 件 发 生, 状 态 转 换 为 R E AD Y执 行 堆 栈 出 错 处 理S T A C K E R R O R当 前 任 务时 间 到 ?恢 复 现 场 恢 复 现 场跳 转 止 任 务 切 换 程 序 段T A S K S W I T CH I N G返 回 当 前 任 务图 2-2 T0中断服务程序 nts 30 3.3.3 任务切换程序段 这个程序段是整个内核中最核心的一个,主要功能是完成任务切换。它共有两个入口 TASKSWITCHING 和 SWITCHNOU。前者供定时器 T0的中断服务程序调用,后能供系统函数调用 os_delete 和 os_wait调用。相应也有两个不同的出口。 其基本工作流程是首先将当前任务置为“ TIMEOUT”状态, 等待下一次时间片循环,其次找到下一个处于“ READY”状态的任务并使其成为当前任务。然后进行堆栈管理,将自由堆栈空间 分配给该任务。清除使该任务进入
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。