第6章 VxWorks与Tornado概貌 6.1 VxWorks的产品概况 6.2 VxWorks的交叉开发环境构成 6.5 目标机上的VxWorks Image 6.6 一个简单的工程项目实例 6.7 本章小结 习题
6.1 VxWorks的产品概况 操作系统面向不同领域的版本 VxWorks基本版:提供微内核和基本模块组件(如I/O系统、文件系统、网络系统等) VxWorks AE版:针对国防、航天、测量、控制系统推出的高可靠性产品 OSEKWorks版:集成的通信机制使控制器网络良好工作,适用于汽车工业 VSPWorks版:适用于多处理器的DSP系统
6.1 VxWorks的产品概况 2.交叉开发工具-Tornado 图形化的集成交叉开发工具 包括 项目管理工具 编辑器 编译器:GNU&Diab 下载器 调试器:命令行&图形
6.1 VxWorks的产品概况 对应安装后的目录文件: \Tornado2.2\host 例:
6.1 VxWorks的产品概况 3.相关文档 VxWorks操作系统方面的文档 Tornado方面的文档 位于安装目录下的\Tornado2.2\docs子目录中 VxWorks操作系统方面的文档 《VxWorks Programmer’s Guide》 《VxWorks OS Libraries-API Reference》 Tornado方面的文档 《Tornado User’s Guide》 《Tornado API Programmer’s Guide》
6.1 VxWorks的产品概况 Network方面的文档 《VxWorks Networking Programmer’s Guide》
6.2 VxWorks交叉开发环境构成 交叉开发环境构成 VxWorks的交叉开发环境
6.2 VxWorks交叉开发环境构成 1.交叉开发环境构成 (宿)主机(Host) 目标机(Target) 主机和目标机之间的通信机制 交叉编译器 交叉调试器 目标机 Image 串口或网口 主机: 目标机: 图6-1 (宿)主机与目标机
6.2 VxWorks交叉开发环境构成 (宿)主机(Host) 由通用机完成(如PC机或工作站) 用于辅助嵌入式系统软件开发 Windows95 /NT或 UNIX环境 安装集成开发环境(IDE),包括 交叉编译器(Cross Compiler):在主机上编译生成可以在目标机上运行的代码IMAGE 交叉调试器(Cross Debugger):通过主机和目标机之间的某种耦合方式实现前后台调试
6.2 VxWorks交叉开发环境构成 目标机(Target) 用户自己开发的嵌入式硬件设备 其上运行目标IMAGE
6.2 VxWorks交叉开发环境构成 主机和目标机之间的通信 采用目标服务器(Target Server)/ 目标代理(Target Agent)的方式 目标服务器:指在主机上运行的一个服务,它管理主机上的各开发调试工具之间以及主机和目标机之间的通信联系(每一个目标机要求对应有一个目标服务器) 目标代理:运行在目标机上,执行目标服务器送来的请求,然后回送执行结果
6.2 VxWorks交叉开发环境构成 2. VxWorks的交叉开发环境 图6-1 (宿)主机与目标机
6.2 VxWorks交叉开发环境构成 主机(Host) 集成开发环境为Tornado 系统安装时,集成调试环境Tornado和VxWorks操作系统的原材料安装到主机上
6.2 VxWorks交叉开发环境构成 目标机(Target) 可执行代码IMAGE通常取名为VxWorks (与VxWorks操作系统同名) IMAGE由 BSP(板级支持包)、VxWorks操作系统和应用程序三个部分组成
6.2 VxWorks交叉开发环境构成 主机和目标机之间的通信—— Target Server-Agent的方式 主机上Tornado的各调试工具通过VxWorks自定义的通信协议WTX与目标服务器通信 目标服务器与运行在目标机上的目标代理WDB Agent通过 WDB 协议交换信息 WDB Agent可运行在系统级和任务级两种模式下
6.3 VxWorks的操作系统 VxWorks操作系统的体系结构 VxWorks的内核 VxWorks的外挂基本模块组件
6.6.1 VxWorks操作系统体系结构 模块化组件体系结构 (见下图) 由内核和各种外挂模块组件构成 模块化组件体系结构 (见下图) 由内核和各种外挂模块组件构成 外挂基本模块组件包括I/O系统、文件系统、网络系统、加载调试等开发工具组件、POSIX接口等兼容性组件、图形界面组件等 外挂模块又可分为外挂基本模块组件和外挂附加模块组件两种类型
6.6.1 VxWorks操作系统体系结构 图6-3 VxWorks操作系统体系结构
6.6.1 VxWorks操作系统体系结构 具有可裁剪性 VxWorks库由400多个相对独立的、短小的目标模块组件组成 裁减的粒度较小,不会造成一个小功能的需求导致引入一个大的组件模块
6.6.2 VxWorks的内核 VxWorks操作系统的内核——Wind 操作系统的核心 功能 任务的创建与管理、抢占式任务调度、任务间通信机制、任务的同步与互斥、定时器和中断处理、内存管理、出错处理等 此外提供符合实时系统标准1006.1b的POSIX 接口,以提高应用程序代码可移植性
6.6.2 VxWorks的内核 特点 采用微内核结构 只关心CPU,对外设不做假设 如不关心总线类型、内存大小和I/O设备等 基本硬件是由BSP板级支持包驱动 客户定制硬件可由应用程序驱动
6.3.3 VxWorks的外挂基本模块组件 VxWorks提供的外挂基本模块组件包括 I/O系统 文件系统 网络系统 加载调试等开发工具组件 POSIX接口等兼容性组件等
6.3.3 VxWorks的外挂基本模块组件 I/O系统 提供与设备无关的统一访问接口 管理的设备 字符设备、块设备、虚拟设备 (管道、 Socket)、控制和监控设备、网络设备等 接口种类 与Unix标准兼容的基本I/O系统,如read() 与ANSI C兼容的带缓存I/O系统,如fread() 格式化I/O系统,如printf()、sprintf() POSIX接口的异步I/O系统
6.3.3 VxWorks的外挂基本模块组件 文件系统 提供多种文件系统,适用于不同环境 dosFs: 针对块设备提供,兼容MS-DOS,通常作为目标机的文件系统 rawFs:将整个硬盘视为单个文件来操纵 tapeFs: 针对磁带设备提供 cdromFs: 针对CD-ROM 设备提供 TSFS:主机文件系统在目标机中的映射,串口调试时常使用(自定义文件系统)
6.3.3 VxWorks的外挂基本模块组件 网络系统 提供 (见下图) 多种网络服务 兼容BSD的Socket接口 多种网络协议 仅在实时性上进行了较大的修改,如用信号量 代替原TCP/IP实现中的 Interrupt Lock 和修改原Socket代码中无Timeout的部分等 多种网络协议 包括ICMP、IGMP、IP、UDP、TCP、OSPF和RIP等 多种网络服务 包括FTP、Telnet、HTTP 和 DNS 等
6.3.3 VxWorks的外挂基本模块组件 图6-4 VxWorks网络系统结构
6.3.3 VxWorks的外挂基本模块组件 加载调试等开发工具组件 包括运行在目标机上的 动态加载器Loader 目标机调试代理 WDB Agent Target Shell Symbol Table等
6.3.3 VxWorks的外挂基本模块组件 兼容性组件 ANSI C组件 C++组件 包括 POSIX标准接口组件 提供实时系统的内核、I/O系统等扩展(1006.1b)的POSIX标准接口 ANSI C组件 提供可一套可重入的ANSI C库函数 C++组件 提供对C++语言的支持
6.6.4 VxWorks的外挂附加模块组件 内核方面 提供 VxMP组件:支持多CPU间的共享内存通讯方式 VxFusion组件:支持分布式应用中的消息队列 VxVMI组件:虚拟内存接口
6.6.4 VxWorks的外挂附加模块组件 I/O系统方面 提供 各种嵌入式处理器的BSP模板 Driver:包括RAM 、IDE和软盘 、键盘 、显示器 、串口、并口 、网络 BSP开发包 USB开发包 Wind Net802.1x无线局域网设备驱动程序等
6.6.4 VxWorks的外挂附加模块组件 文件系统方面 网络系统方面 提供TrueFFS(Flash文件系统) 提供Wind Net组件(支持PPP/PPPoE、Multilink、Radius Client、ISDN、IPv6、IPSec&IKE、DeviceNet、CAN、Ethernet/IP、DCOM、OPC等)、Wind Manage组件(支持CLI、MIBWay、SNMP、WEB Server等)
6.6.4 VxWorks的外挂附加模块组件 图形界面方面 提供 WindML :图形用户界面的媒体库 Zinc :主机上用于创建目标机图形界面的软件,产生的代码需要在WindML的支持下运行
6.4 VxWorks的集成开发工具Tornado
6.4.1 Tornado的基本结构 软总线的层次结构: 图6-5 Tornado的软总线结构
6.4.2 Tornado的功能特点 Tornado的功能 将与操作系统和应用程序运行无关的工作(如编辑、编译、调试、配置等)与目标机分离 一方面使这些工作不会与操作系统挣抢目标机上有限的资源 另一方面将它们集成在一个开发环境中以方便系统系统的开发和调试工作
6.4.2 Tornado的功能特点 Tornado的特点 集成性 开放性 集成了编辑、编译、调试、仿真测试、项目管理等方面的一系列工具 作为一开放环境,Tornado与目标机的连接通过统一接口进行,接口提供丰富的API,用户可方便的定制和扩展各开发工具
6.4.3 Tornado的工具集 针对各个阶段进行了需求分析,推出了一系列的工具: 编辑器:Editor 编译器:Compiler 工程项目管理工具:Project Facility 编辑器:Editor 编译器:Compiler 加载调试器: Launcher 、Increment Loader 、WindSh 、 CrossWind 、Browser、WindView 仿真器 :VxSim 等
6.4.3 Tornado的工具集 Project Facility Tornado的工程配置工具 提供图形化环境下的工程文件管理、对VxWorks操作系统及其组件的配置、编译环境的设置、Makefile自动生成等功能 支持与通用配置管理工具(如ClearCase)的集成
6.4.3 Tornado的工具集 Editor Tornado的源代码编辑器 提供基本的代码文字编辑功能 支持C和C++语法格式的高亮显示 Project Facility可根据编译器给出的错误或警告信息直接定位到Editor窗口相应源代码处 与Tornado的调试器也进行了集成 Editor窗口能跟踪代码的执行,实现源代码级的调试
6.4.3 Tornado的工具集 不足之处 不支持中文 不具备对代码间各函数调用关系等的分析及直接跳转定位能力
6.4.3 Tornado的工具集 Compiler 编译器 提供支持C和C++语言的GNU和Diab交叉编译器以及一些标准库
6.4.3 Tornado的工具集 Launcher 主机与目标机连接的配置器和启动器 可连接多个目标机同时调试
6.4.3 Tornado的工具集 Increment Loader Tornado的增量加载器 使开发者能够动态地加载新增模块到目标机上并与目标机上已存在的VxWorks Image实现动态链接
6.4.3 Tornado的工具集 WindSh Tornado的Command Shell(命令行执行工具 可执行大部分C语言表达式及TCL(Tools Command Language)语言 可执行已加载到目标机的模块中包含的任何函数,包括系统调用 此外提供简单的代码调试命令
6.4.3 Tornado的工具集 CrossWind Tornado的图形化的交叉调试器 支持源代码级调试 支持混合代码和汇编代码显示 支持多目标机同时调试 提供系统级和任务级两种调试模式
6.4.3 Tornado的工具集 Browser Tornado的系统对象的浏览器 可观察目标机上的任务、队列、信号量、模块、变量、堆栈、任务的CPU占用率的状态信息
6.4.3 Tornado的工具集 WindView Tornado的软件逻辑分析工具 提供图形化的动态跟踪分析功能 可监视任务的切换状况、每个任务状态的变化、中断的发生、系统事件的发生(信号量、消息队列、定时器)及用户自己定义的事件,还可以检查系统崩溃
6.4.3 Tornado的工具集 VxSim Tornado的目标机仿真器 运行在主机上,在没有目标机的情况下可以提供和真实目标机一致的调试和仿真运行环境以进行程序的调试 VxSim的单用户版本的仿真器集成在Tornado 开发环境中,它只提供基本的操作系统功能,不具有网络功能 完整的VxSim是作为Tornado的附件产品出售,支持多用户和网络功能等
6.5 目标机上的VxWorks Image 目标机上的可执行代码—Image通常取名为VxWorks(与VxWorks嵌入式实时操作系统同名) VxWorks Image在主机上的Tornado集成开发环境中编译生成,通过某种方式加载到目标机的内存中运行 Tornado可以为VxWorks和应用程序代码生成多种类型的Image,以灵活的适应多种不同的目标机开发运行环境
6.5.1 VxWorks Image的种类与结构 VxWorks Image包括两大类型 : Bootable Image Downloadable Image
6.5.1 VxWorks Image的种类与结构 1.Bootable Image Bootable Image 的功能
6.5.1 VxWorks Image的种类与结构 Bootable Image的结构 图6-6 Bootable Image基本结构
6.5.1 VxWorks Image的种类与结构 (1) BSP 由初始化和基本驱动程序两部分功能组成 初始化 初始化是指从系统上电复位开始直到Wind内核和UsrRoot根任务启动的这段时间,系统的执行过程 初始化过程包括:(见下图)
6.5.1 VxWorks Image的种类与结构 CPU Init:初始化CPU的内部寄存器 Board Init:初始化I/O的寄存器,将I/O device驱动 System Init:为系统的运行准备数据结构,进行数据初始化 图6-7 BSP的初始化过程
6.5.1 VxWorks Image的种类与结构 基本驱动程序 功能:完成最小I/O设备的读写访问操作 特点:不能自动执行,只能被动调用 调用有三种方式: (见图6-8) 任务直接调用 任务调用System Call 任务调用组件提供的服务 对应驱动程序三种抽象层次(见图6-9)
图6-8 驱动程序的调用方式 图6-9 驱动程序的三个层次
6.5.1 VxWorks Image的种类与结构 常规操作 设备的固有操作逻辑,包括I/O编址和CPU操作Device的各寄存器两个方面的内容 优点:不需通过操作系统而直接访问设备 ,效率高 缺点:可移植性差 适用场合:简单的嵌入式系统 驱动程序与VxWorks内核和扩展的Component接口 包括I/O管理、操作类型规整和参数规整三个方面 优点:具有较好的层次性和抽象性 ,可移植性好 缺点:通过操作系统管理设备,增加了系统开销 适用场合:复杂的嵌入式系统
6.5.1 VxWorks Image的种类与结构 (2) VxWorks (3) APP 中间层 上层 为用户编写的应用程序(APP)
6.5.1 VxWorks Image的种类与结构 Bootable Image的种类 ROM Image RAM Image 例:BootROM(即BootLoader或BootImage) 根据加载方式不同(见后),可进一步分类为: ROM-based Image ROM-resident Image RAM Image 通过网口或串行口由BootROM加载到内存中运行
6.5.1 VxWorks Image的种类与结构 2.Downloadable Image 功能 动态加载的程序映象—— 结构 通过网口或串行口加载到目标机上与目标机中已存在的Bootable Image动态链接后运行 结构 只包含用户应用程序(APP)部分
6.5.2 VxWorks Image在内存中的存放与加载 静态分配的IMAGE占用空间(.text、 .data、.bss) 系统的动态空间 (Wind kernel创建的REGION#0) 用户的动态空间
6.5.2 VxWorks Image在内存中的存放与加载 静态链接与加载(Bootable Image) 动态链接与加载(Downloadable Image)
6.5.2 VxWorks Image在内存中的存放与加载 (1) Bootable Image的加载 Bootable Image的加载分为以下类型: ROM Image ROM-Resident Image ROM-Based Image RAM Image
6.5.2 VxWorks Image在内存中的存放与加载 ① ROM-resident Image的加载 加载过程:(见下图) BSP初始化时将ROM-resident Image中的Data段和BSS段复制到RAM中 code(即Text段)在ROM中运行
6.5.2 VxWorks Image在内存中的存放与加载 图6-11 ROM-resident Image的加载
6.5.2 VxWorks Image在内存中的存放与加载 ② ROM-based Image的加载 加载过程:(见下图) BSP初始化时将ROM-based Image(分压缩和非压缩两种类型)从ROM/Flash完全搬到RAM中执行,包括Image中的Text段和Data段、BSS段
6.5.2 VxWorks Image在内存中的存放与加载 图6-12 ROM-based Imag的加载
6.5.2 VxWorks Image在内存中的存放与加载 ③ RAM Image的加载 加载过程: 目标机上电后,由引导代码将BootROM搬到RAM中,BootROM初始化调试下载通道和调试信息输出通道 在目标机上的BootROM(此时充当FTP Client)和主机上的FTP Server作用下,被调试的主机上的Downloadable Image通过FTP协议下载(download)到Target的RAM中,然后接受控制权,实现调试
6.5.2 VxWorks Image在内存中的存放与加载 (2) Downloadable Image的加载 加载过程: (见下图) 目标机上电后,BootROM(或者是Bootable Image)自举到RAM中,BootROM(或者是Bootable Image)初始化调试下载通道和调试信息输出通道
6.5.2 VxWorks Image在内存中的存放与加载 在目标机上BootROM(或者是Bootable Image)的动态加载器的作用下,被调试的主机上的Downloadable Image通过Host与Target之间的Target-Server/Target Client耦合方式下载(download)到Target的RAM中,然后接受控制权,实现调试
6.5.2 VxWorks Image在内存中的存放与加载 图6-13 Downloadable Image的加载
6.5.3 VxWorks Image的运行 初始化 自下而上 (bottom_up) 执行 自上而下 (top_down)
6.5 目标机上的VxWorks Image 小结:VxWorks Image的种类 非压缩 ROM-based Image 压缩 ROM Image ROM-resident Image Bootable Image RAM Image Downloadable Image
6.5 目标机上的VxWorks Image VxWorks Image的应用 在开发阶段 一般使用Downloadable Image 动态下载后与操作系统及其它目标文件动态链接(与DOS的*.EXE文件相类似,地址在编译链接后是浮动的,只在装载到内存后才与绝对物理地址相对应) 节省开发过程中每次编译链接操作系统的时间 便于团队进行大型应用程序的并行合作开发 也可使用RAM Bootable Image
6.5 目标机上的VxWorks Image 在成品阶段 一般使用Bootable Image 采用静态链接,一次生成并固化到目标机中后一般很少修改变化 具体类型根据ROM/RAM大小和运行效率要求选用
6.6一个简单的工程项目实例 使用Tornado及其目标仿真器VxSim,开发调试一个Downloadable Image的工程项目: (1) 创建一个工作空间和工程项目 (2) 在工程项目中创建应用程序 (3) 编译链接生成目标映象Downloadable Image (4) 在主机上,将目标映象下载到目标机VxSim
6.6一个简单的工程项目实例 (5)目标映象的运行调试 包括 使用 WindSh启动运行程序 使用 Browser 观察目标机内存使用情况 (5)目标映象的运行调试 包括 使用 WindSh启动运行程序 使用 Browser 观察目标机内存使用情况 使用 WindView 逻辑分析器动态分析任务的调度过程 使用CrossWind进行debug
6.6.1 创建工程项目 (1) 启动 Tornado Tornado安装完成后,选择 Windows 的菜单【开始】→【程序】→【 Tornado2.2 】→【 Tornado 】,开始 Tornado,出现如图6-16所示的【 Create Project in New/Existing Workspace 】对话框
6.6.1 创建工程项目 图6-16 创建项目对话框
6.6.1 创建工程项目 如果没有出现如图6-16所示的【 Create Project in New/Existing Workspace 】对话框 , 单击 Tornado 的【 File 】→【 New Project... 】菜单。出现【 Create Project inNew/Existing workspace 】对话框。选择创建一个可下载的 (downloadable) 应用程序 , 如图 6-17 所示。
6.6.1 创建工程项目 图6-17 创建可下载的应用程序对话框
6.6.1 创建工程项目 (2) 单击【 OK 】按钮 , 出现如图6-18所示的 Tornado 应用程序向导,通过此向导创建新的项目。 6.6.1 创建工程项目 (2) 单击【 OK 】按钮 , 出现如图6-18所示的 Tornado 应用程序向导,通过此向导创建新的项目。 在图6-18的对话框中, 键入: 项目名称 项目文件的存放路径和目录名 项目描述(可选项) 工作空间的名称和工作空间文件的存放位置
6.6.1 创建工程项目 图6-18 指定项目名称对话框
6.6.1 创建工程项目 本例中: 项目名称为"Projectl“ 项目位置为 "C:\嵌入式系统基础\Project1“ 6.6.1 创建工程项目 本例中: 项目名称为"Projectl“ 项目位置为 "C:\嵌入式系统基础\Project1“ 工作空间为 "C:\嵌入式系统基础\Project1\Workspace1.wsp“
6.6.1 创建工程项目 (3) 单击【 Next 】按钮,出现如图 6-19 所示的对话框 ,在这里可以设置应用程序的工具链。这里从下拉列表中选择使用默认的工具链名称 "SIMNTgnu"
6.6.1 创建工程项目 图6-19 指定工具链对话框
6.6.1 创建工程项目 (4) 单击【 Next 】按钮,出现如图6-20 所示的向导的最后一步 , 确认向导前面的选择
6.6.1 创建工程项目 图6-20 确认项目对话框
6.6.1 创建工程项目 (5) 单击【 Finish 】按钮,出现如图6-21 所示的工作空间窗口。工作空间窗口的标题指示工作空间的名称 , 整个工作空间由【Files 】、【 VxWorks 】和【 Builds 】三项选项卡组成
6.6.1 创建工程项目 图6-21 工作空间与项目
6.6.2 在工程项目中创建应用程序 本示例使用\Tornado2.2\target\src\demo\start下的例程cobble.c,将该例程的源文件增加到项目
6.6.2 在工程项目中创建应用程序 “cobble.c”是一个模拟数据采集系统的多任务的应用程序 (详见下章) 第一个任务 (tCosmos) 模拟 ISR, 产生新的数据 第二个任务 (tSchlep) 采集数据 第三个任务 (tCrunch) 计算处理采集的数据, 并得出结果 第四个任务 (tMonitor) 监测这个结果并显示出来。
6.6.2 在工程项目中创建应用程序 (l) 从 Tornado 的安装目录“c: \Tornado2.2\target\src\demo\start ”下将 “cobble.c” 文件复制到项目所在的目录。 注:这里的Tornado安装目录是默认的安装目录是 " c: \Tornado2.2 " ,项目所在的目录是 " C:\嵌入式系统基础\Project1\ "
6.6.2 在工程项目中创建应用程序 (2) 在工作空间的【 Files 】选项卡的 "Projectl Files" 上右击,选择快捷菜单中的【 Add Files..】 如图 6-22 所示。在出现的【 Add Sourcenle to Project1 】对话框中选择 cobble.c
6.6.2 在工程项目中创建应用程序 图6-22 选择快捷菜单中的【 Add Files..】
6.6.2 在工程项目中创建应用程序 (3) 在工作空间的 "Projectl Files " 目录下可以看到源文件和可以创建的Downloadable目标映象文件——Project1.out,如图6-23所示
6.6.2 在工程项目中创建应用程序 图6-23 项目文件选项卡
6.6.3 将项目编译链接生成程序映象 (1) 首先查看默认的项目编译链接的属性。选择工作空间中的【 Builds 】选项卡,打开"Project1 Builds"目录,右击此目录下的默认创建名称 "SIMNTgnu",在快捷菜单中选择【 Properties…】,如图6-24 所示。
6.6.3 将项目编译链接生成程序映象 创建项目的".out"文件 项目编译链接的属性 图6-24 选择编译链接的属性
6.6.3 将项目编译链接生成程序映象 (2) 出现编译链接属性对话框,如图 6-25 所示。在此对话框中,可以设置编译、汇编、链接的选项。在【 C/C++compiler 】选项卡中 , 可以看到默认地选择了 “Include debug info”, 复选框 , 此选项确保当编译项目的时候具有调试信息 , 且无优化编译
6.6.3 将项目编译链接生成程序映象 图6-25 设置项目的编译链接属性 单击【 OK 】,关闭此属性对话框。
6.6.3 将项目编译链接生成程序映象 (3) 在工作空间中的【 Bui1ds 】选项卡的 "Project1 Builds" 目录下, 右击 "SIMNTgnu",在快捷菜单中选择【 Build 'Project1.out' 】,如图 6-24 所示。
6.6.3 将项目编译链接生成程序映象 Tornado 在创建项目之前,出现【 Dependencies 】对话框(见下图),告知cobble.c文件没有产生 Makefile 依赖关系 图6-26 【 Dependencies 】对话框
6.6.3 将项目编译链接生成程序映象 (4) 单击【 OK 】按钮 , 开始创建项目。在【 Build Output 】窗口显示项目的编译链接信息,如图 6-27 所示
6.6.3 将项目编译链接生成程序映象 图6-27 【 Build Output 】窗口
6.6.3 将项目编译链接生成程序映象 若【 Build Output 】窗口中显示了错误和告警信息,则双击错误或告警信息,就会打开相应的源文件,通过指针指示发生错误或告警所在行,进行相应错误的修改,完成后重新Build一次。
6.6.4 将程序映象下载到目标机中 可以从工作空间的【 Files 】选项卡上下载程序映象 , 并开始目标机——集成仿真器的运行调试。 (l) 打开工作空间窗口中的【 Files 】选项卡,在 "Projectl Files" 上右击选择快捷 菜单中的【 Download 'Project1.out'】, 如图 6-28 所示
6.6.4 将程序映象下载到目标机中 图6-28 选择菜单中的下载程序映象
6.6.4 将程序映象下载到目标机中 此时,Tornado 会提示启动一个仿真器 , 如图 6-28 所示。 图 6-29 启动仿真器对话框
6.6.3 将项目编译链接生成程序映象 (2) 单击【是】,出现如图 6-30 所示的【 VxSim-Lite Launch 】对话框。选择默认的"Standard simulator" 选项
6.6.4 将程序映象下载到目标机中 图 6-30 【 VxSim-Lite Launch 】对话框
6.6.3 将项目编译链接生成程序映象 (3) 单击【 OK 】,则目标仿真器VxSim将启动,如图 6-31 所示
6.6.3 将项目编译链接生成程序映象 (4) 之后,Tornado提示需要启动一个目标服务器(Target Server),如图 6-32 所示。 注意 , 一次只能运行 VxWorks 目标仿真器的一个实例;如果要关闭仿真器,需要关闭 VxWorks 仿真器窗口
6.6.4 将程序映象下载到目标机中 图 6-32 启动目标服务器对话框
6.6.4 将程序映象下载到目标机中 目标服务器管理所有的Tornado主机工具之间以及Tornado与目标之间的通信。 目标服务器的名称约定为 “ 目标名◎主机名 ”,本实例中,目标服务器的名称为 vxsim@jsw,在 “Tornado Launch” 工具栏上显示了此目标服务器的名称,如图 6-33 所示
6.6.4 将程序映象下载到目标机中 图 6-33 Tornado Launch工具栏
6.6.4 将程序映象下载到目标机中 此时在 Windows 的任务栏上可以看到一个红色的图标表示目标服务器正在正常运行,如图 6-34 所示 目标服务器运行状态指示图标 图 6-34 目标服务器运行图标
6.6.4 将程序映象下载到目标机中 双击Windows 的任务栏上的目标服务器图标,出现如图3-35所示的目标服务器日志窗口 图 6-35 目标服务器日志窗口
6.6.4 程序的运行调试 1. 配置与启动运行调试器 (1) 从 Tornado 主窗口 , 选择菜单【 Tools 】→【 Options 】→【 Debugger】,在自动附着到任务 "Auto attach to tasks" 选项栏中选择 "Always" 单选按钮,以便当发生异常时调试器自动附着到任务上,如图 6-36 所示。单击【 OK 】,关闭【 Options 】对话框。
6.6.4 程序的运行调试 图 6-35 配置调试器
6.6.4 程序的运行调试 (2) 单击 “Tornado Launch” 工具栏上的Debugger调试器按钮 , 就开始使用CrossWind调试器了
6.6.4 程序的运行调试 (3) 程序的启动运行 程序的启动运行即可通过CrossWind,也可通过命令行的调试工具WindSh。本实例中采用WindSh启动程序运行 WindSh一个 C 语言的命令解释器 ,可以通过在WindSh的 命令行激活任何已经下载到目标机上的例程。WindSh同时也包含了它自己的一套命令集 , 用于管理任务、访问系统信息、调试等
6.6.4 程序的运行调试 单击 “Tornado Launch” 工具栏上的Shell按钮 ,就启动WindSh了。在Shell窗口中命令行上输入主例程名字progStart(),则程序启动运行,如图6-36所示
6.6.4 程序的运行调试 图6-36 从WindSh命令行开始程序运行
6.6.4 程序的运行调试 此时可使用CrossWind进行断点设置、单步跟踪等调试
6.6.4 程序的运行调试 2.使用Browser查看目标的内存使用情况 6.6.4 程序的运行调试 2.使用Browser查看目标的内存使用情况 Tornado 浏览器 (Browser) 是一个配合 WindSh使用的面向系统的监视器,它可以用来监视目标系统的状态,包括当前激活任务的汇总、内存分配的汇总等
6.6.4 程序的运行调试 (1) 单击“Tornado Launch” 工具栏上的浏览器按钮 , 就可以开始使用浏览器了 6.6.4 程序的运行调试 (1) 单击“Tornado Launch” 工具栏上的浏览器按钮 , 就可以开始使用浏览器了 (2) 当出现浏览器窗口后 , 从下拉列表中选择 "Memory Usage", 并单击周期性刷新按钮 , 这样就会每隔几秒更新显示。可以看到类似如图 6-37 所示的内存使用情况
6.6.4 程序的运行调试 图6-37 使用Browser查看目标的内存使用情况
6.6.4 程序的运行调试 可以看到应用程序的内存使用量无限增大,内存被无限制地消耗了,出现了内存泄漏(即使用完毕的内存空间没有被释放)
6.6.4 程序的运行调试 3.使用WindView动态跟踪程序查找错误 6.6.4 程序的运行调试 3.使用WindView动态跟踪程序查找错误 WindView 是实时应用程序的逻辑分析器,是一个动态的可视化的实时调试工具 在启动WindView之前需要配置WindView,之后运行WindView就可跟踪程序的实时运行情况
6.6.4 程序的运行调试 在WindView的运行时间内,它将指定的事件信息记录下来,如ContextSwitch(任务的上下文切换)、Task State Transition(任务的状态转移)、Additional Instrumentation(附加的事件)等; 跟踪运行结束后,WindView将记录下来的信息传递给Tornado集成开发环境进行解析,以图形化的方式将程序运行过程中发生的各种信息显示出来,以便开发者分析解决问题
6.6.4 程序的运行调试 (1) 单击 "Tornado Launch"工具栏上的WindView Config 按钮,就可显示【 WindView Control 】窗口,同时出现【Collection Configuration】对话框,如图 6-38 所示
6.6.4 程序的运行调试 图6-38 WindView 窗口及配置对话框
6.6.4 程序的运行调试 在【Collection Configuration 】对话框的下拉列表中选择 " Additional Instrumentation ", 单击 【 OK 】
6.6.4 程序的运行调试 (2) 单击【 WindView Control】 窗口的 “Start WV” 按钮 ,开始收集数据,收集的数据状态如图 6-39 所示
6.6.4 程序的运行调试 图6-39 WindView 窗口收集数据状态
6.6.4 程序的运行调试 (3) 几秒钟后,单击 “Look for Event Log” 按钮 ,更新数据收集的状态 6.6.4 程序的运行调试 (3) 几秒钟后,单击 “Look for Event Log” 按钮 ,更新数据收集的状态 (4) 当达到数据缓冲的 50% 以上的时候 , 单击 “Stop WV” 按钮 , 停止收集数据。 (5) 在 Shell 的命令行上键入命令停止当前的应用程序 ( 本例中通过键入 progStop 来停止当前的应用程序 ),然后才能将 WindView 数据从模拟目标仿真器上传到主机。
6.6.4 程序的运行调试 (6) 单击【 WindView Control 】窗口的 “Upload” 按钮 , 将数据上传到主机 6.6.4 程序的运行调试 (6) 单击【 WindView Control 】窗口的 “Upload” 按钮 , 将数据上传到主机 (7) 当上传完成后 ,出现一个消息框提示上传完成,单击消息框的【 OK 】按钮 , 显示记录的数据图形化视图如图6-40所示。可以使用 “WindView” 工具栏上的放大和缩小按钮 改变显示的范围大小
6.6.4 程序的运行调试 图6-40 WindView 窗口任务运行状态视图
6.6.4 程序的运行调试 在图6-40中的小旗标用于指示信号量状态、水平线指示任务的状态 ( 如执行、阻塞、就绪等 ),例如:
6.6.4 程序的运行调试 :intEnt,即进入 ISR 。 :intExit,即从 ISR 退出。 :semGive,即释放一个信号量。 6.6.4 程序的运行调试 :intEnt,即进入 ISR 。 :intExit,即从 ISR 退出。 :semGive,即释放一个信号量。 :semTake, 即获得一个信号量。 :Executing,即任务处于运行状态 :Ready,即任务处于就绪状态 :Pended,即任务处于阻塞状态 :Delayed,即任务处于延时状态 :Locked,即任务处于加锁状态
6.6.4 程序的运行调试 从以上显示的任务视图中可以看出,tCrunch 始终处于 Ready 状态 , 永远没有获得执行
6.6.4 程序的运行调试 4.查找并修改程序错误 (bug ) (1)重新返回应用程序创建状态 6.6.4 程序的运行调试 4.查找并修改程序错误 (bug ) (1)重新返回应用程序创建状态 关闭Browser和WindView Control及其任务视图窗口;点击CrossWind工具栏上的Stop Debugging按钮 ,停止CrossWind的运行
6.6.4 程序的运行调试 右击Windows任务栏上的Target Server红色小图标,在弹出的快捷菜单上点击【 Shutdown】,关闭目标服务器Target Server,如图3-41所示;然后关闭目标仿真器窗口。此时重新返回到应用程序创建状态 图6-41 关闭目标服务器Target Server
6.6.4 程序的运行调试 (2) 在工作空间的【 Files 】选项卡中双击 “cobble.c” 文件 ,在编辑器中打开此文件。 6.6.4 程序的运行调试 (2) 在工作空间的【 Files 】选项卡中双击 “cobble.c” 文件 ,在编辑器中打开此文件。 找到 progStart() 函数,发现 tCrunch 的优先级(240)比 tMonitor的优先级(230)低,导致 tCrunch 永远不被执行,结果数据永远不被处理,节点永远没有从链表中删除,因此内存使用量无限增大,内存被无限制地消耗了
6.6.4 程序的运行调试 (3) 将两个任务的优先级颠倒 , 即 6.6.4 程序的运行调试 (3) 将两个任务的优先级颠倒 , 即 tidCrunch=taskspawn("tCrunch",230,0,STACK_SIZE,(FUNCPTR)crunch,0,0,0,0,0,0,0,0,0,0); tidMonitor=taskspawn("tMonitor",240, 0,STACK_SIZE,(FUNCPTR)monitor,0,0,0,0,0,0,0,0,0,0); 保存文件。
6.6.4 程序的运行调试 (4) 选择【 Build 】→【 Rebuild Al1 】,重新编译链接生成目标程序映象 6.6.4 程序的运行调试 (4) 选择【 Build 】→【 Rebuild Al1 】,重新编译链接生成目标程序映象 (5) 重复6.6.4节中所有操作步骤,将新的目标程序映象下载到目标机,并启动目标机VxSim和相应的目标服务器 (6) 运行CrossWind和WindSh,在WindSh命令行上输入命令 progStart启动程序运行。此时发现在仿真器窗口和WindSh窗口中均显示了错误信息 , 如图 6-42 和图 6-43 所示
6.6.4 程序的运行调试 图6-42 仿真器窗口中显示的错误信息
6.6.4 程序的运行调试 图6-43 WindSh窗口中显示的错误信息
6.6.4 程序的运行调试 此时CrossWind调试器将自动打开编辑器窗口,指向错误产生的crunch() 函数的位置 6.6.4 程序的运行调试 此时CrossWind调试器将自动打开编辑器窗口,指向错误产生的crunch() 函数的位置 if (!((pDiv = NULL) && (*pDiv != 0))) /* if ((pDiv != NULL) && (*pDiv != 0)) */ result = sampleSum / (*pDiv); /* 这里产 生被 0 除 的错误 */
6.6.4 程序的运行调试 (7) 再次Stop Debugging,关闭目标服务器和目标仿真器,重新返回应用程序创建状态 6.6.4 程序的运行调试 (7) 再次Stop Debugging,关闭目标服务器和目标仿真器,重新返回应用程序创建状态 (8) 修改以上 bug 的方法是用下面被注释掉一行语句代替上一行语句,保存文件。修改后的程序代码为: /* if (!(pDiv = NULL) && (*pDiv != 0)) */ if ((pDiv != NULL) && (*pDiv != 0)) result = sampleSum / (*pDiv);
6.6.4 程序的运行调试 (9) 重复6.6.4节中所有操作步骤,将新的目标程序映象下载到目标机,并启动目标机VxSim和相应的目标服务器 6.6.4 程序的运行调试 (9) 重复6.6.4节中所有操作步骤,将新的目标程序映象下载到目标机,并启动目标机VxSim和相应的目标服务器 (10) 运行CrossWind和WindSh,在WindSh命令行上输入命令 progStart启动程序运行 此时在仿真器窗口和WindSh窗口中显示运行信息均正常,如图 6-44 和图 6-45 所示
6.6.4 程序的运行调试 图6-44 仿真器窗口中显示的运行信息
6.6.4 程序的运行调试 图6-45 WindSh窗口中显示的运行信息
6.6.4 程序的运行调试 (11) 使用WindView动态跟踪程序,从任务运行视图(见图6-46)可以看出,所有的任务都按照一定的次序获得了执行,包括 tCrunch 使用浏览器Browser查看内存使用情况,可以看到,内存消耗只是在一定的范围内循环,应用程序的内存没有无限增大 , 消灭了内存泄漏 (12) 至此,程序的错误修改调试完毕。最后,在 WindSh 中输入 progStop 命令停止程序的运行
6.7 本章小结 本章是VxWorks的概要介绍 VxWorks的产品组成 VxWorks的交叉开发环境构成 Tornado开发流程实例 6.7 本章小结 本章是VxWorks的概要介绍 VxWorks的产品组成 VxWorks的交叉开发环境构成 操作系统VxWorks的体系结构与组成 交叉开发工具Tornado的体系结构与组成 VxWorks Image的种类与结构 Tornado开发流程实例
习题 1.简述VxWorks的产品组成。 2.在VxWorks交叉开发环境中,通信协议WTX和WDB的作用分别是什么? 3.VxWorks的模块化组件结构相对pSOSystem和Nucleus有何不同? 4.阐述VxWorks的集成开发环境Tornado的基本结构、功能与特点
习题 5.从结构而言,Bootable Image与Downloadable Image由何区别?说明两者各自的适用场合及其原因。