首页资源分类嵌入式系统 > 《嵌入式计算机系统》VxWorks实验指导书

《嵌入式计算机系统》VxWorks实验指导书

已有 445117个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:嵌入式计算机系统

    分    享:

    文档简介

    《嵌入式计算机系统》VxWorks实验指导书,一些基础介绍

    文档预览

     《嵌入式计算机系统》VxWorks实验指导书 编写:魏晓敏 西北工业大学 2013年11月 实验一 基于VxWorks的多任务设计 第1部 搭建VxWorks开发环境 VxWorks 是专门为实时嵌入式系统设计开发的操作系统软件,为程序员提供了高效的实时任务调度、中断管理、实时的系统资源以及实时的任务间通信。 VxWorks是种功能强大而且复杂的操作系统,仅仅依靠人上编程调试,很难发挥它的功能并设计出可靠、高效的嵌入式系统,必须有与之相适应的开发工具。Tornado就是为开发基于VxWorks 的应用系统而提供的集成开发环境, Tornado中包含的工具管理软件,可以将用户自己的代码与VxWorks 的核心系统有效地组合起束,从而轻松、可靠地完成嵌入式应用厅发。 Tornado是Windriver 公司开发的嵌入式软件开发环境。Tornado开发环境的最新版本是2.2 ,它在延续了Tornado2.0 开发环境的基础上,增加了更多易于使用、性能优异的工具,因此在商业上取得了较大成功,获得了用户的好评。 Tornado开发环境是嵌入式实时领域里最新的开发调试环境,是编写嵌入式实时应用程序的完整的软件开发平台。它给嵌入式系统开发人员提供了一个不受目标机资源限制的超级开发和调试环境a。它包含3 个高度集成的部分: 运行在宿主机和目标机上的强有力的交叉开发工具和实用程序 运行在目标机上的高性能、可裁剪的实时操作系统VxWorks 连接宿主机和目标机的多种通讯方式,如以太网、串u 线、ICE 或ROM 仿真器 VxWorks的开发环境为Tornado,我们实验室用的是Tornado2.2。包括Wind_River_tornado2.2.1_vxworks5.5.1 和Wind_River_vxworks5.5.1_BSP_drivers 两部分,需要分别安装,安装的顺序是先安装VxWorks5.5.1,再安装BSP包。 1.1 Tornado安装步骤 1.1.1 获取Tornado安装文件 Tornado安装文件,包括 TORNADO2.2 和BSP的文件,可以从网上下载(http://www.ed2000.com/ShowFile.asp?FileID=62525)。包括以下两个文件: [风河VxWorks].WINDRIVER.TORNADO.V2.2.FOR.ARM.CD1(ED2000.COM).ISO [风河VxWorks].WINDRIVER.TORNADO.V2.2.FOR.ARM.CD2(ED2000.COM).ISO 以上两个,第一个是TORNADO2.2文件,第二个是BSP文件。它们的Install Key分别是x#yyo-YVXT#-nozVy-wwoyx-VXy#o-UbFBF和AGpge-QbEGp-haNb3-kUhsS-bEkpC。 1.1.2 安装Tornado2.2的步骤 首先,需要修改Tornado2.2文件的文件名,文件名只能包含字母、数字和下划线。(如果还是无法安装,那么把文件复制到C盘根目录下进行安装。) 然后,进行安装,安装过程如下: 1) 点击Tornado2.2文件,开始安装: Next Next 点击Accept,然后Next 2) 填写Name,Company,Install key。Name,Company可以填写你们自己想填的,Install Key为x#yyo-YVXT#-nozVy-wwoyx-VXy#o-UbFBF。 然后,Next 按默认的情况安装,不修改,直接点击Next 3) 输入Project Name和Number of Tornado Seat,该输入没有特殊的要求, 4) 接下来,按默认情况安装,只要点击Next,当到一下这一步,如下图 此时,选择Phone or Fax, 然后,一直按默认形式安装,直到如下图时,点击Finish。 1.1.3 安装BSP包 需要修改BSP包文件的文件名,文件名只能包含字母、数字和下划线。(如果还是无法安装,那么把文件复制到C盘根目录下进行安装。) 打开BSP包文件进行安装,如下图,按照提示进行安装即可。 1.1.4 配置环境变量 要能正常使用Tornado2.2开发Vxworks程序还需要进行环境变量的配置。  配置环境变量可以参照如下步骤进行: 1) 假设tornado安装在c:\tornado2.2,在该目录下新建flexlm文件夹(c:\tornado2.2\flexlm); 2) 将CRACK文件夹中的license.dat拷贝到c:\tornado2.2\flexlm; 3) 修改系统环境变量,新建变量,变量名称为LM_LICENSE_FILE,键值为c:\tornado2.2\flexlm\license.dat。 通过以上步骤,Tornado就安装好了,可以运行了。 1.2 SeaARM9_Power开发平台概述 SeaARM9_Power 是针对 S3C2410 的高性能开发平台,并适合用来作为开发高性能手持式以及便携式智能设备或终端。 S3C2410 由 ARM920T 内核(16-/32-bit RISC CPU),独立的 16KB 指令和 16KB 数据 cache,MMU 虚拟内存管理单元,LCD 控制器(支持 STN 和 TFT),NAND Flash boot loader, NOR Flash,系统管理单元(SDRAM 控制器等) SeaARM9_Power 采用核心板与接口板分离的形式,即:将 S3C2410的最小系统高度集成为核心板结构。而系统的外围设备,例如音频、液晶显示(LCD)、VGA显示、USB模块、232/485模块、IDE硬盘接口、DA模块、键盘、数码管显示、GPIO 等则放置在接口板上。SeaARM9_Power支持不同尺寸的液晶显示器、支持VGA显示、支持手机模块收发短信、数据等。 核心板的设计比较复杂,采用多层PCB设计;而接口板的设计相对简单,通常情况下采用两层板即可满足设计要求。平台详细的技术参数可参阅表SeaARM9_Power使用手册。 板子各个模块的具体位置可参阅下图所示。 SeaARM9_Power外围模块示意图 1.3 烧写BOOTLOADER到NandFlash 在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。 1.3.1 准备工作 首先在Windows 下进行以下的准备工作: a) 在PC中安装flashpgm224软件,并使用crack文件夹中的文件破解flashpgm224软件。 b) 板子上跳线(jp1的1和3相连,4和6相连其中1为挨着R11,2为挨着R12)。 c) 用产品中配置的并口线将PC机并口(DB25口)与H-JTAG卡的DB25口连接,用20Pin扁平电缆线将H-JTAG卡的ARM-JTAG口与SeaARM9.1型开发板上的Embedded-ICE 接口连接。 1.3.2 烧写步骤 接下来,是烧写Bootloader的步骤: 1) 让系统在Nor Flash启动,JTAG下载bootrom_uncmp.hex(BSP包中的,FTARM2410中),打开Flash Programmer进行此步骤,如下图 在File中选择Open,然后选择OK.ocd文件,打开。 选择Erase Target Flash Sector,然后点击Program。 然后,等待烧写完成,完成后进度条将消失。。 在烧录.bin或其他boot文件的时候出现“无法初始化并口”提示框,请确认: 1. 确认该电脑并口可用; 2. 在BIOS下设置并口参数:将Parallel Port参数设为“Enable”;将Parallel Mode参数设置为“EPP”或者“ECP”。 下载完后,请拔下H-JTAG。 1.3.3验证烧写是否成功 把PC的串口与开发板的串口(UART0)相联(注意:选用交叉串口线),上电开发板。将出现提示如下图,此时说明Bootloader下载成功。如果此时板上已烧好内核,那么按“Enter”后,开始启动内核。 第2部 开发环境的使用 2.1 为开发平台准备BSP 将FTARM2410.RAR解压后拷贝到C:\Tornado2.2\target\config目录下。 2.2 Tornado工程的类型 2.2.1 bootable VxWorks image 型工程 这种工程是可下载的VxWorks 映像,包含了必需的VxWorks 内核、组件以及BSP。在它的文件列表中,固定地包含了这样的一些文件: linkSyms.c、凹Config.c、romInit.s、romStart.c、sysAlib.g 、sysLib.c 、usrApplnit. c。 这里,特别需要注意的是usrApplnit.c 文件,它的函数usrApplnit 是应用的入口点,可以在其中加入应用工程的主程序入口函数,同时也必须在文件头包含入口函数的原型说明和相关的头文件。还有一种更简洁的方法叫静态链接,即在函数usrApplnit中加入应用工程的主程序入口函数,然后静态链接已编译好的应用工程模块。这里的bootable VxWorks Application可以认为是应用工程的release版本。 bootable VxWorks image 型工程是可配置的。除了Tornado 自身提供的、应用于仿真器VxSim 的工程sunpc_vx 外,所有的工程,包括系统提供的,均编译为VxWorks 系统文件。而工程slmpc_vx 则可编译为VxWorks.exe 文件,可以运行在VxSim 上。 2.2.2 downloadable application modules 型工程 这种工程可编译为可下载的应用模块。仔细察看编译规则中的rules项,可看到3 种类型:工程.out——编译目标文件并把它们链接而形成的文件;archive——编译目标文件并把它们放入一个名为工程.a 的文件中;objects——编译形成多个目标文件。这3 种规则形成的文件各有用途。 应用模块可以和VxWorks 映像静态链接起下载,也可以当VxWorks 映像在目标板中运行时,动态下载链接到映像中,再通过调试器激活而运行。此工程井没有可配置的操作系统组件,仅仅只是应用。除此之外,与bootable VxWorks image型工程类似。 2.3 启动Tornado环境 点击Tornado2.2的图标,运行Tornado2.2的开发环境,如图2-1。 在启动画面中包含一个“创建工程”窗口,利用“创建工程”窗口可以创建和打开现有的工程。 图2-1 启动界面 2.4 创建工作区和工程 1)选择第一项,Bootable VxWorks Image类型的工程是可下载的VxWorks映像,包含了必需的VxWorks内核、组件以及BSP,如图2-2, 图2.2 工程类型 2)填写要生成工程的名字和路径,如图2-3。 图2-3 填写工程名和路径 3)选择FTARM2410这个BSP,如图2-4。 图2-4 选择BSP 4)点击Finish,工程建立完成,如图2-5,项目文件如图2-6。 图 2-5 确认建立工程 图2-6 项目文件 5)点击Builds,看到Builds下的文件,如图2-7所示。右击default,查看属性,在Rules属性上选择VxWorks,然后确定OK。如图2-8。 图2-7 Bulids下的文件 图2-8 修改Rules属性值为vxWorks 6)右击default,选择生成VxWorks。 7)右击default_rom,在Rules属性上选择vxWorks_rom.hex,然后确定OK,如图2-9。 图2-9 修改Rules属性的值为vxWorks_rom.hex 8)右击default,选择生成生成vxWorks_rom.hex。 2.5 应用程序开发 编写应用程序,在usrApplnit.c文件下编写,如图2-10所示,可创建任务。usrApplnit.c程序代码如图2-11所示。程序写完后,右击项目,选择build该工程,直到“Done”为止,如下图所示。 图2-10 项目文件列表 图2-11 usrApplnit.c程序代码 Build结果 2.6 烧写VxWorks 准备工作: a) PC的串口与开发板的串口(UART0)相连(注意:选用交叉串口线)。 b) PC机与开发板通过网线相连。 烧写VxWorks,通过网络启动系统,此方法掉电后会丢失,步骤如下: 1) 首先,在C盘根目录下创建ftpRoot文件夹;然后,把生成的VxWorks(内核)文件放在C:\ftpRoot\,如图2-12。VxWorks是工程编译生成的,该文件在工程文件夹内的default文件夹中,即C:\Tornado2.2\target\proj\工程名称\default,工程名称由用户自己命名。 图2-12 vxWorks放置的位置 2) 修改PC的IP,让开发板和PC机在一个网段内,开发板的IP在C:\Tornado2.2\target\config\FTARM2410\ config.h中已经设置,该文件内设置了PC机的IP地址如图2-13,主机的IP地址是“10.10.111.88”。设置PC机的IP地址,如图2-14。 图2-13 config.h中对IP地址的定义 图2-14 设置PC机的IP地址 3) 打开FTP Server,在菜单栏Security项下,选择User/Rights…,新建用户,设置用户名和密码,如图2-13,已经设置了用户名和密码都是“target”,设置过程如下图2-15: 图2-15 新建用户 设置logging,在菜单栏Logging项下,选择Log Options…。除了Winsock Calls,其他都选,如图2-16: 图2-16 设置logging 4) 复位开发板,打开FTP Server通过网线自动下载,下载过程中DNW显示如图2-17,FTP Server显示如图2-18;下载完成后,等一段时间在串口1中打印出信息,即启动系统,如图2-19和2-20所示。DNW中显示结果,示例如图2-20所示,看到三个任务每隔一定的时间间隔通过串口打印一条信息。这三条信息以各自独立的时间间隔打印信息。 图2-17 DNW中显示 图2-18 ftp窗口中显示 图2-19 DNW显示 图2-14 DNW中显示结果示例 2.7 监视与调试 2.7.1 检查内存消耗 对于downloadable application modu1es 型工程文件。 Tornado集成开发环境的Browser 是个系统对集浏览器,被誉为Tornado Shell的图形伴侣。 Browser 提供了监视目标系统状态的工具。利用Browser 可以观察系统内活动的任务以及内存的使用等。在实际调试过程中,一般利用Browser 检查内存的消耗。 为了启动Browser,单击Tornado开发环境工具栏形如“i”的Browser 快捷按钮。当Browser窗口出现时,从下拉菜单中选择"Memory Usage" 并单击形如时钟的按钮即可看到如国2-15所示的内存消能列表,内存消耗列表会实时刷新。 图2-15 所示的内存消耗是前面所介绍的程序在VxWorks Simulator 上运行时的情况。 图2-15 在Browser 中查看内存的消耗 2.7.2软件逻辑分析 WindView 是Tornado集成开发环境针对实时应用的逻辑分析仪。 利用WindView 可以动态观察到任务上下文的切换、事件的发生,也可以查看信号量、消息队列和看门狗时钟的实时状态。因此WindView 是个强有力的调试诊断工具。 要想启动WindView ,可以在Tornado集成开发环境中选择"Tools" 菜单, 单击其中WindView->Configuration, 这时首先出现如图2-16 所示的WindView 的基本事件收集配置对话框。 图2-16 WindView的基本事件收集配置对话框 在这个对话框的"Base Event " 下拉菜单中可以选择如下事件: Context Switch,上下文切换 Task State Transition,任务状态跃迁 Additiooa1 Instrumentation ,其他事件 在图2-16中,还可以选择修改收集事件的属性, 如是否将收集信息直接显示到图形当中。默认情况下,收集信息将直接上传到图形文件中并显示。 在图2-16 中选择“Additiooa1 Instrumentation ”,然后单击"OK" 按钮。接着,在Tornado集成开发环境中选择"Tools" 菜单, 单击其中WindView->Launch,点击“OK”后,即可看到如图2-17所示的WindView 的控制窗口。这个窗口 显示了目前要收集的事件信息。 要想开始收集事件信息仅需点击图2-17中的“Go”按钮。几秒钟以后,单击眼状按钮刷新收集的事件信息。 图2-17 WindView 的控制窗口 当图2-17 的当前事件信息的Buffers 数目大于2 以后, 可以单击"Stop " 按钮停止事件的收集工作。这时候我们发现运行Tornado开发环境的计算机的运行速度放慢,这是因为我们的实时应用实例程序发生了一系列事件。为了将刚才收集到的信息上传到计算机观察,首先要在Shell 命令行上停止应用程序运行。 然后可以单击带箭头的上传按钮将事件数据上传到主机环境, 这样在主机的Tornado 开发环境上将显示事件发生的图形。WindView是一个图形化的动态诊断和分析工具,它可以向开发者提供目标机硬件上所运行应用程序的许多详细情况。WindView获取的运行结果如图2-18所示。 图2-18 WindView获取的上述程序的运行结果(三个任务) 2.7.3 应用程序调试 用户在Tornado 开发环境内开发VxWorks 应用程序时, 最关心的是如何在交叉开发环境中进行调试。Tornado开发环境为我们提供了便捷的交叉开发和调试环境,在启动Debugger 以后,可在Tornado环境提供的程序编辑窗口中直接设置应用程序的断点,进行调试。(详细内容请查看“tornado调试.ppt”文档) 第3部 基于VxWorks的多任务设计实验 3.1基础知识——任务管理 任务是代码运行的一个映象,从系统的角度看,任务是竞争系统资源的最小运行单元。任务可以使用或等待CPU、I/O设备及内存空间等系统资源,并独立于其它任务,与它们一起并发运行(宏观上如此)。VxWorks内核使任务能快速共享系统的绝大部分资源,同时有独立的上下文来控制个别线程的执行。 3.1.1 任务结构 多任务设计能随时打断正在执行着的任务,对内部和外部发生的事件在确定的时间里做出响应。VxWorks实时内核Wind提供了基本的多任务环境。从表面上来看,多个任务正在同时执行,实际上,系统内核根据某一调度策略让它们交替运行。系统调度器使用任务控制块的数据结构(简记为TCB)来管理任务调度功能。任务控制块用来描述一个任务,每一任务都与一个TCB关联。TCB包括了任务的当前状态、优先级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务最初被激活时以及从休眠态重新被激活时,要用到这些信息。 此外,TCB还被用来存放任务的"上下文"(context)。任务的上下文就是当一个执行中的任务被停止时,所要保存的所有信息。在任务被重新执行时,必须要恢复上下文。通常,上下文就是计算机当前的状态,也即各个寄存器的内容。如同在发生中断所要保存的内容一样。当发生任务切换时,当前运行的任务的上下文被存入TCB,将要被执行的任务的上下文从它的 TCB中取出,放入各个寄存器中。于是转而执行这个任务,执行的起点是前次它在运行时被中止的位置 VxWorks中,内存地址空间不是任务上下文的一部分。所有的代码运行在同一地址空间。如每一任务需各自的内存空间,需可选产品VxVMI的支持。 3.1.2 任务状态和状态迁移 实时系统的一个任务可有多种状态,其中最基本的状态有四种: 就绪态(Ready):任务只等待系统分配CPU资源; 悬置态(Pend):任务需等待某些不可利用的资源而被阻塞; 休眠态(Suspend):如果系统不需要某一个任务工作,则这个任务处于休眠状态; 延迟态(Delay):任务被延迟时所处状态; 当系统函数对某一任务进行操作时,任务从一种状态迁移到另一状态。处于任一状态的任务都可被删除。  3.1.3任务调度策略 多任务调度须采用一种调度算法来分配CPU给就绪态任务。Wind内核采用基于优先级的抢占式调度法作为它的缺省策略,同时它也提供了轮转调度法。 基于优先级的抢占式调度,它具有很多优点。这种调度方法为每个任务指定不同的优先级。没有处于悬置或休眠态的最高优先级任务将一直运行下去。当更高优先级的任务由就绪态进入运行时,系统内核立即保存当前任务的上下文,切换到更高优先级的任务。 Wind内核划分优先级为256 级(0~255)。优先级0为最高优先级,优先级255为最低。当任务被创建时,系统根据给定值分配任务优先级。然而,优先级也可以是动态的,它们能在系统运行时被用户使用系统调用taskPrioritySet()来加以改变,但不能在运行时被操作系统所改变。 3.1.4.抢占禁止 Wind内核可通过调用taskLock()和taskUnlock()来使调度器起作用和失效。当一个任务调用taskLock()使调度器失效,任务运行时没有基于优先级的抢占发生。然而,如果任务被阻塞或是悬置时,调度器从就绪队列中取出最高优先级的任务运行。当设置抢占禁止的任务解除阻塞,再次开始运行时,抢占又被禁止。这种抢占禁止防止任务的切换,但对中断处理不起作用。 3.1.5异常处理 程序代码和数据的出错,如非法命令、总线或地址错误、被零除等。VxWorks异常处理包,一般是将引起异常的任务休眠,保存任务在异常出错处的状态值。内核和其它任务继续执行。用户可借助Tornado开发工具,查看当前任务状态,从而确定被休眠的任务。 3.2多任务编程实例 3.2.1实验目的 1) 学习创建多个任务 3.2.2实验内容 在 Tornado 开发环境中,建立一个downloadable 的project。编写一段小程序:创建10 个任务,每个任务输出其任务ID。观察运行结果。 3.2.3实验设备及工具 1. 硬件: a) PC 机 2. 软件: a) PC 机操作系统windowsXP b) Tornado2.2 3.2.4实验原理 VxWorks 允许多任务。一个多任务环境允许实时应用构造多个独立任务,每个任务单独执行,拥有自己的一套资源。VxWorks 多任务内核wind 使用中断驱动,基于优先级的任务调度机制,具有较快的上下文切换时间和较低的中断延迟。 多任务制造一种多个任务同时执行的假象。事实上,内核通过调度算法让这些任务依次执行。每个任务拥有自己的上下文,包括CPU 环境和系统资源,这些是内核调度该任务运行时所必须的。 在上下文切换时,任务的上下文保存在任务控制块 TCB 中。一个任务的上下文包括: 代码执行点,也就是任务的程序计数器。 CPU 寄存器和浮点数寄存器(如果需要)。 动态变量和函数调用的堆栈。 标准输入输出和出错 I/O 分配 一个延时定时器。 一个时间片定时器。 内核控制结构。 信号处理器 调试和性能监视值。 任务的创建和激活 函数 taskSpawn()创建一个新的任务上下文,包括为程序执行分配和建立任务环境,传递参数。函数taskSpawn()的参数包括:任务名,优先级,选项字,堆栈大小,新任务入口,以及传递给该入口的10 个参数。原型为: 下面的例子中包含两个子程序。第一个子程序 multi_tasks()调用taskSpawn()创建TASKS(=10)个任务,每个任务执行task_print()显示其任务id 号。 #define ITERATIONS 10 void task_print(void) { printf("Hello, i am task %d.\n", taskIdSelf()); } void multi_tasks(void) { int i, taskId; for(i = 0; i < ITERATIONS; i++) taskId = taskSpawn("task_print", 90, 0x100, 2000, task_print, 0,0,0,0,0,0,0,0,0,0); } 3.2.5实验步骤 1.编程(假设编写的源文件为multiTasks.c) 2.将multiTasks.c 添加到project 中 3.编译(如果有错误,则改正) 4.下载工程文件,单击“download project.out”。这时候会启动VxSim工具,成功设置后会在任务栏右下角看到一个红色的图标。 5.运行程序。在Shell中输入主函数名multi_tasks,然后回车。观察输出结果,如下图所示。 5.如果将taskSpawn()调用中的优先级设置改为90+i,观察输出。 6.如果将taskSpawn()调用中的优先级设置改为90-i,观察输出。 7.Browser中显示: 8.运行过程shell中输入“i”,然后回车,显示各任务的运行状态和属性,如下: 9. WindView获取的运行结果。 10个任务,任务名都是“task_print”,分别占用了一段工作时间。 3.2.6思考题 分析4、5、6 步骤中输出变化或不变化的原因。 3.3时间片轮转调度(Round-Robin) 3.3.1实验目的 1) 学习并验证时间片轮转调度 3.3.2实验内容 在 Tornado 开发环境中,建立一个bootable 的project。3 个任务,对这三个任务使用轮转调度。观察运行结果。 3.3.3实验设备及工具 3. 硬件: a) PC 机 4. 软件: a) PC 机操作系统windowsXP b) Tornado2.2 3.3.4实验原理 任务调度就是基于某种规则约束,给一个任务集合中的每个任务分配开始和结束时间。约束一般包括时间约束和资源约束。在一个时间共享(time-sharing)的操作系统中,系统按照时间片一次轮流执行每个任务,从而制造出多个任务在单个处理器上同时执行的假象。 Wind 内核调度默认使用基于优先级抢占式调度,但同时也允许使用轮转调度。轮转调度的目的是使相同优先级的所有就绪任务共享CPU。如果不使用轮转调度,当多个相同优先级的任务需要共享处理器时,其中的一个任务可能会霸占处理器,直到该任务完成或因其他原因放弃执行(例如等待一个信号量),从而使得同优先级的其他任务得不到运行的机会。 时间片(time slicing)是轮转调度在多个相同优先级的任务间公平分配CPU时间的基础。每个任务执行一段确定的时间(一个时间片);然后另一个任务执行同样大小的一段时间,如此循环下去。这种分配是相当公平的;在这个优先级相同的任务组中,其他就绪任务没有得到一个时间片之前,不会出现一个任务得到第二个时间片的情形。 在 Wind 内核中,调用函数kernelTimeSlice()将允许轮转调度,时间片的大小由参数传给它,规定了每个任务一次允许占用CPU 的最长时间。 下面的例子创建三个优先级相同的任务,分别向控制台输出他们的任务id号和任务名。rrsched()调用kernelTimeSlice()允许系统使用轮转调度。本例中使用的时间片TIMESLICE 为1/60 秒(函数sysClkRateGet()返回每秒的时钟ticks数)。 在设置了调度时间片后,程序发起三个任务。注意:必须保证发起的任务的优先级要比rrsched 任务的优先级(100)低。例中三个任务的优先级定为101。另外为了演示时间片轮转的效果,要保证任务具有足够的执行时间,在本例中使用一个循环次数为LONG_TIME 的长循环。 /* usrAppInit.c - stub application initialization routine */ /* Copyright 1984-1998 Wind River Systems, Inc. */ /* modification history -------------------- 01a,02jun98,ms written */ #include "VXWorks.h" #include "taskLib.h" #include "kernelLib.h" #include "sysLib.h" #include "logLib.h" #define ITER1 100 #define ITER2 10 #define PRIORITY 101 #define TIMESLICE sysClkRateGet()/60 #define LONG_TIME (1<<25) static void taskOne (void) { int i, j; for(i = 0; i < ITER1; i++){ for(j = 0; j < ITER2; j++) logMsg("\n", taskIdSelf(), 0, 0, 0, 0, 0); for(j = 0; j < LONG_TIME; j++); } } static void taskTwo(void) { int i, j; for(i = 0; i < ITER1; i++){ for(j = 0; j < ITER2; j++) logMsg("\n", taskIdSelf(), 0, 0, 0, 0, 0); for(j = 0; j < LONG_TIME; j++); } } static void taskThree(void) { int i, j; for(i = 0; i < ITER1; i++){ for(j = 0; j < ITER2; j++) logMsg("\n", taskIdSelf(), 0, 0, 0, 0, 0); for(j = 0; j < LONG_TIME; j++); } } /* DESCRIPTION Initialize user application code. */ /****************************************************************************** * * usrAppInit - initialize the users application */ void usrAppInit (void) { #ifdef USER_APPL_INIT USER_APPL_INIT; /* for backwards compatibility */ #endif /* add application specific code here */ int taskIdOne, taskIdTwo, taskIdThree; /* 设置每个任务一次允许占用CPU 的最长时间为TIMESLICE */ if(kernelTimeSlice(TIMESLICE) == OK) logMsg("\n\n\n\n\t\t\tTIMESLICE = %d ticks\n\n\n", TIMESLICE, 0, 0, 0, 0, 0); taskDelay(sysClkRateGet()*2); if((taskIdOne = taskSpawn("task1", PRIORITY, 0x100, 20000, (FUNCPTR)taskOne, 0,0,0,0,0,0,0,0,0,0)) == ERROR) logMsg("taskSpawn taskOne failed.\n", 0,0,0,0,0,0); if((taskIdTwo = taskSpawn("task2", PRIORITY, 0x100, 20000, (FUNCPTR)taskTwo, 0,0,0,0,0,0,0,0,0,0)) == ERROR) logMsg("taskSpawn taskTwo failed.\n", 0,0,0,0,0,0); if((taskIdThree = taskSpawn("task3", PRIORITY, 0x100, 20000, (FUNCPTR)taskThree, 0,0,0,0,0,0,0,0,0,0)) == ERROR) logMsg("taskSpawn taskThree failed.\n", 0,0,0,0,0,0); } 3.3.5实验步骤 1.编程(假设编写的源文件为rrsched.c) 2.将rrsched.c 添加到project 中 3.编译(如果有错误,则改正) 4.烧写VxWorks到试验箱上运行,观察输出。(第二部分2.6已说明烧写方法) 5.增大时间片的长度,观察输出。 6.取消时间片轮转,观察输出。 7.增加第四个任务,其优先级为80,它和其他三个任务输出相同的信息,观察运行结果。 3.3.6 实验报告要求 1.写出实验过程。 2.记录输出结果。分析4~7 步骤的结果。 3.解答:在上例中,为什么三个被创建的任务必须比任务rrsched 的优先级低?(rrsched的优先级是100)。帮助信息:下图是将代码复制到downloadable工程中运行时,查询到的各任务的运行状态和信息,有任务名NAME,任务优先级PRI等等。 4.附上必要的源码。

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。