OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 ·...

122
OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司 www.myorbita.net 欧比特严禁复制

Transcript of OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 ·...

Page 1: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM平台应用开发手册

V2.0

珠海欧比特控制工程股份有限公司

www.myorbita.net

欧比特严禁复制

Page 2: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

目 录 1 概述...............................................................................................................................................1

1.1 VXWORKS操作系统 .........................................................................................................1

1.2 OBT-BSP-VXWORKS6.7...................................................................................................1

2 搭建VxWorks开发环境................................................................................................................3

2.1 安装WORKBENCH .............................................................................................................3

2.2 安装VXWORKS 6.7 SERVICE PACK 1 ................................................................................4

2.3 安装GNU GCC工具链 .....................................................................................................4

2.4 安装BSP包 .......................................................................................................................5

2.5 编译VXWORKS 的KERNEL和库.......................................................................................6

2.6 更新WORKBENCH的编译规则 .........................................................................................9

2.7 WORKBENCH使用说明 ..................................................................................................10

3 基本操作说明 .............................................................................................................................14

3.1 创建VIP工程 ..................................................................................................................14

3.2 RTP和ROMFS ..............................................................................................................23

3.3 WDB调试 .......................................................................................................................35

4 驱动程序应用说明 .....................................................................................................................43

4.1 UART应用开发..............................................................................................................43

4.1.1 工程配置.............................................................................................................43

4.1.2 例程解析.............................................................................................................44

4.1.3 接口说明.............................................................................................................47

4.1.4 运行结果.............................................................................................................49

4.2 GPIO应用开发...............................................................................................................51

4.2.1 工程配置.............................................................................................................51

4.2.2 例程解析.............................................................................................................51

4.2.3 接口说明.............................................................................................................57

4.2.4 运行结果.............................................................................................................61

4.3 TIMER应用开发 ..............................................................................................................65

4.3.1 工程配置.............................................................................................................65

4.3.2 例程解析.............................................................................................................67

4.3.3 接口说明.............................................................................................................70

4.3.4 运行结果.............................................................................................................79

4.4 CAN应用开发 ................................................................................................................82

4.4.1 工程配置.............................................................................................................82

4.4.2 例程解析.............................................................................................................82

4.4.3 接口说明.............................................................................................................86

4.4.4 运行结果.............................................................................................................89

4.5 1553B应用开发 .............................................................................................................92

4.5.1 工程配置.............................................................................................................92

i

欧比特严禁复制

Page 3: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

ii

4.5.2 例程解析.............................................................................................................93

4.5.3 接口说明.............................................................................................................97

4.5.4 运行结果...........................................................................................................102

4.6 ETHERNET应用开发.....................................................................................................104

4.6.1 工程配置...........................................................................................................104

4.6.2 例程解析...........................................................................................................110

4.6.3 接口说明...........................................................................................................114

4.6.4 运行结果...........................................................................................................117

欧比特严禁复制

Page 4: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 1

1 概述

本文主要介绍基于 S698PM 处理器的 OBT-BSP-VxWorks6.7 板级支持包的应用与开发方法。

详细介绍了 VxWorks 环境的搭建、Wind River Workbench 3.1 软件的使用、基于

OBT-BSP-VxWorks6.7 的 VIP 、 RTP 和 ROMFS 等 工 程 的 创 建 , 并 重 点 说 明 了 使 用

OBT-BSP-VxWorks6.7 调用 S698PM 的各驱动模块进行应用开发的过程和方法,每个模块都给出

了应用实例和运行结果。

1.1 VxWorks操作系统

VxWorks 操作系统是美国 WindRiver 公司于 1983 年设计开发的一种嵌入式实时操作系统

(RTOS),是嵌入式开发环境的关键组成部分。VxWorks 以其良好的持续发展能力、高性能的

内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它也以其良好的

可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求

极高的领域中,如通讯卫星、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18 战

斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连 1997 年 4 月在火星表面登陆的火星探测器上

也使用到了 VxWorks。

实时多任务操作系统是能在确定的时间内执行其功能,并对外部的异步事件作出响应的

计算机系统。VxWorks 就是这样一个实时多任务的操作系统。

VxWorks 是专门为实时嵌入式系统设计开发的操作系统内核,为程序员提供了高效的实时

多任务调度、中断管理,实时的系统资源以及实时的任务间通信。在各种 CPU 平台上提供了

统一的编程接口和一致的运行特性,尽可能的屏蔽了不同 CPU 之间的底层差异。应用程序员

可以将尽可能多的精力放在应用程序本身,而不必再去关心系统资源的管理。基于 VxWorks

操作系统的应用程序可以方便的移植到不同的 CPU 平台上。

1.2 OBT-BSP-VxWorks6.7

针对 VxWorks 6.7 嵌入式实时操作系统,欧比特公司自主研制了基于 S698 系列处理器的

的专用板级支持包 OBT-BSP-VxWorks6.7,它既支持 S698-ECR、S698-MIL、S698-T 等单核处理

器,也支持 S698P4、S698PM 等多核处理器;OBT-BSP-VxWorks6.7 包含丰富的、定制化的驱动

程序。由于配置参数和驱动类型不同,OBT-BSP-VxWorks6.7 针对不同的处理器有不同的版本。

针对 S698PM 的 OBT-BSP-VxWorks6.7 有以下主要特点:

欧比特严禁复制

Page 5: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 2

适用于 MMU 系统;

支持 MPIRQ 中断控制;

支持 APBUART UART 控制台及驱动;

支持 Timer 定时器单元;

支持以太网驱动(GRETH);

支持 CAN 总线驱动;

支持 1553B 总线驱动,包括对 BC、RT 和 MT 模式的支持;

支持通用 I/O 接口驱动(GRGPIO)。

欧比特严禁复制

Page 6: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 3

2 搭建VxWorks开发环境

VxWorks 是一种功能强大而且比较复杂的操作系统,包括了进程管理、存储管理、设备管

理、文件系统管理、网络协议及系统应用等几个部分。VxWorks 只占用了很小的存储空间,并

可高度裁减,保证了系统能以较高的效率运行。所以,仅仅依靠人工编程调试,是很难发挥

它的功能和设计出可靠、高效的嵌入式系统,必须要有与之相适应的开发工具。Workbench 便

是为开发 VxWorks 应用程序而设计的集成开发环境。Workbench 是基于 Eclipse 架构设计的高

性能、高实用性和高稳定性的开发软件。

VxWorks 支持在 Windows 和 Linux 等主机下进行安装开发。本章节主要介绍在 Windows 下

安装 VxWorks 的开发环境。Workbench 版本是 3.1, VxWorks 版本是 6.7。

安装 VxWorks 主要有以下 6 个步骤:

1) 安装风河 VxWorks 平台;

2) 安装 VxWorks 6.7 Service Pack 1;

3) 安装 LEON GNU GCC 工具链;

4) 安装基于 LEON 的 BSP 包;

5) Build VxWorks 的 kernel 和库;

6) 更新 Workbench 的 Build 规则。

2.1 安装Workbench

安装 Workbench 的整个过程中除了选择对应的 license 文件外,其余采用默认选项即可。

并且安装路径可以改。如下图为 Workbench 3.1 的安装界面之一。 欧比特严禁复制

Page 7: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 2-1 Workbench 3.1 安装界面图

2.2 安装VxWorks 6.7 Service Pack 1

解压 Patch 光盘上的 DVD-R138711.1-6-01.zip 文件,进入解压的目录,运行 setup.exe

进行安装。安装过程中除选择对应的 license 文件外,其余采用默认设置,路径要和 Workbench

的一致。下图为安装界面。

图 2-2 VxWorks 6.7 SP1 安装界面

2.3 安装GNU GCC工具链

Windows 上安装的 GCC 工具链文件名叫 sparc-wrs-vxworks-mingw-4.1-1. 0.9.exe,运

珠海欧比特控制工程股份有限公司 4

欧比特严禁复制

Page 8: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

行其并安装,安装完后会出现在 C:\opt\sparc-wrs-vxworks-mingw 目录下,其安装目录不

可改。安装界面如下图。

图 2-3 GCC 安装界面

注意:安装完 GNU 工具链后需要手动重启电脑。

2.4 安装BSP包

(1)安装 LEON BSP,双击 dist-1.0.5/install/setup-6.5-x.y.z.exe 进行安装,如下

图为 LEON BSP 安装界面。

图 2-4 LEON BSP 安装界面

LEON BSP 安装程序需要安装到 WindRiver 目录下,故将本安装路径指定到 WindRiver 目

珠海欧比特控制工程股份有限公司 5

欧比特严禁复制

Page 9: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

录下。点击“Next>”进入下一步时会出现一个 Windows 控制台如下图所示,这个控制台现在

不能被关闭。这个程序需要一些时间,当出现下图提示时再按【Enter】键完成安装。

图 2-5 Windows 控制台

(2)安装 S698 补丁包,“开始”->“cmd”->“C:/windRiver/wrenv.exe -p vxworks-6.7”

打开 VxWorks shell(注:C:/windRiver 为本机 VxWorks 安装目录);进入 BSP/patch/

目录,运行 install-patch(sh install-patch)脚本。执行结束后,再重启 workbench

软件即可。

2.5 编译VxWorks 的kernel和库

WindRiver 公司提供 VxWorks 的部分源码和部分库文件,安装过程需要将这些编译成对应

的库文件,方便应用。这一步将编译 VxWorks kernel 和库。编译生成的 kernel 将根据不同

的工具链和编译标志(TOOL)编译而成。下表为 Makefile 中编译变量 TOOL 的选项。

表 2-1 TOOL 选项

TOOL 编译器 浮点类型 MUL/DIV

gnu GNU GCC 硬 SPRACv7(软 MUL/DIV)

gnuv8 GNU GCC 硬 SPRACv8(硬 MUL/DIV)

sfgnu GNU GCC 软 SPRACv7(软 MUL/DIV)

sfgnuv8 GNU GCC 软 SPRACv8(硬 MUL/DIV)

diab WindRiver DIAB 硬 Mix of SPARC v8 and v7 (Hardware

MUL, software DIV)

sfdiab WindRiver DIAB 软 Mix of SPARC v8 and v7 (Hardware

MUL, software DIV)

VxWorks kernel 和 库 文 件 可 以 通 过 两 种 方 式 编 译 而 成 , 第 一 种 是 通 过

dist-x.y.z/install/compile-6.5.exe 应用程序进行编译;第二种是在 WindRiver 的 Shell

珠海欧比特控制工程股份有限公司 6

欧比特严禁复制

Page 10: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

下执行编译脚本。接下来介绍这两种编译方式。

方法 1:用户界面下编译 kernel 与库文件

如下图为编译 kernel 和库文件程序的界面。

图 2-6 LEON VxWorks kernel build 界面

这个安装也是必须指定到 WindRiver 目录下进行编译。然后进行编译工具的选择,kernel

可以选择多种不同的编译工具。整个编译需要较长的时间。如何选择 TOOLs 的参数将依据不

同硬件信息而定。当然也可以多选,但是 DIAB 和 GNU 是不能同时存在的。如 S698 系列的 MCU

为 SPARC v8 架构,带有标准的硬件 FPU。这里为了兼容 SPARC v7 系列的 MCU,故我们将选择

gnu、sfgnu、gnuv8 和 sfgnuv8。

图 2-7 kernel build

点击下一步将打开一个 Windows 控制台,如下图 2-8,这个控制台暂时不能被关闭,而且

珠海欧比特控制工程股份有限公司 7

欧比特严禁复制

Page 11: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

这个编译过程将会需要较长的时间。

图 2-8 build kernel 界面

方法 2:WindRiver shell 下 build kernel

从 WindRiver shell 中使用 make 功能需要启动 WindRiver shell。启动方式是:

当 C:\WindRiver 是 WindRiver 的安装目录时,在 windows 下点击【开始】->【运行】->

输入【C:\WindRiver\wrenv.exe –p vxworks-6.5 sh】并回车。

赋值 TOOLs 变量用于何种工具编译 kernel 和库文件。下面举例说明编译一个带硬 FPU 的

SPARC v7 架构 MCU 的 kernel 和一个带硬 FPU 的 SPARC v8 架构 MCU 的 kernel。如下图所示。

$ cd dist-x.y.z

$ make multibuild TOOLS=”gnu gnuv8”

图 2-9 WindRiver shell 终端

珠海欧比特控制工程股份有限公司 8

欧比特严禁复制

Page 12: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

通过以上二种方法编译完成后,kernel 和库文件的信息会出现在以下目录:

vxworks-6.5/target/_sparc-compile-TOOL

vxworks-6.5/target/usr/src/_lib-compile_usrtool_TOOL_tool_TOOL

注意:安装完后需要手动重启电脑。

2.6 更新Workbench的编译规则

这个更新是在 Workbench 里面进行的,故需要打开 Workbench 软件。而且在创建每一个

workspace 工作区时编译的规则必须被重新更新。当这步更新没有被执行时,基于 SPARC/LEON

的 RTP 应用将不能被创建成功。

编译规则的更新方法在 Workbench 的工具栏上的“Window->Preferences-> WindRiver->

Build-> Build Properties”。如下图 2-10 和图 2-11 所示。

图 2-10 打开 workbench 3.1 的 preferences

所有 VxWorks 工程的编译规则必须被更新。即在“Specify default build properties for

new:”中下拉选择每一种工程,并在每一个组合框中点击“restore Defaults“用于更新编

译的默认规则。而且在每一次更换工作区间(workspace)时也要进行此操作。

珠海欧比特控制工程股份有限公司 9

欧比特严禁复制

Page 13: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 2-11 workbench 3.1 的 build 规则

2.7 Workbench使用说明

风河的 Workbench 是基于 Eclipse 架构开发的软件,其提供一套高效的方法用于开发实

时的、与目标板无关的嵌入式应用程序。Workbench 可以在 Windows、Linux 和 Solaris 等主

机上进行安装。

前一小节已经介绍了如何在 Windows 上安装 Workbench3.1。接下来介绍如何使用。双击

Windows 桌面上的“Wind River Workbench 3.1”图标,打开 Workbench。第一次使用需要指

定工作目录,即将 workspace 设置在哪个目录下,如 D:\workspace。设定好后进入欢迎界面,

点击界面中间的 Workbench 进入其工作区间。主界面如下图所示。

珠海欧比特控制工程股份有限公司 10

欧比特严禁复制

Page 14: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 2-12 Workbench 主界面图

以下是主界面的图解:

1.菜单栏

2.工具栏

3.工程管理视图

4.远程连接视图

5.编辑视图

6.捷径工具列

7.大纲视图

8.控制台视图

Workbench 主界面的最上端为工具栏。工程管理视图用于显示当前 workspace 下所打开的

工程信息,包括工程组成文件等内容。控制台视图用于输出编译信息、调试信息和输出一些

查询结果信息等。主界面的最底端为状态栏,用于显示行列数等提示信息。

下列按钮将会出现在工作台的工具栏、视图工具栏和快捷方式栏中:

表 2-2 Workbench 按钮

按钮 描述 按钮 描述

创建 Workbench 工程 创建文件或工程

珠海欧比特控制工程股份有限公司 11

欧比特严禁复制

Page 15: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

保存活动编辑器内容 打印编辑器内容

编译所有工程 运行连接目标板的系统视图配置

运行触发目标板连接 调试程序

运行程序 外部工具

下载程序 内存模拟器

打开文档搜索视图 查找定义类型

查找定义的函数和变量 查找元素

搜索快捷键 更改编辑器的编写模式

绑定 Emacs 标记痕迹

显示白色空间字符 只显示编辑器中选择的源码

下一个提示 上一个提示

最后一个编辑的位置 前一个编辑的位置

后一个编辑的位置 连接目标板调试代码

连接目标板分析内存 连接目标板性能分析

连接数据监控 显示数据监控信息

启动 shell 终端

Workbench 可以创建多种 VxWorks 工程,如 VIP、Boot loader、DKM、ROMFS 和 RTP 等工

程。

VIP 全称为 VxWorks Image Project。使用 VIP 工程去配置和编译 VxWorks kernel 镜像

文件,并将镜像文件下载到目标板上启动 VxWorks 系统。我们可以在此类工程中加入 VxWorks

的 ROMFS 文件系统工程、kernel 模块、应用程序、库和源文件等等,并将其与系统编译连接

成单个镜像文件,用于开发一个完整的 VxWorks 应用系统。新建的 VxWorks Image 工程,可

以建立在一个已经存在的相同的工程或一个 BSP 包中。

使用 VxWorks Boot Loader/BSP 工程去创建 VxWorks 的 boot loader,用于引导目标板

VxWorks kernel 的启动。也可以使用这种工程将一个存在的 BSP 源文件复制到自己的工程中,

用于定制一个新的 BSP 包。

VxWorks Downloadable Kernel Module Project 简称 DKM。使用 DKM 工程去管理和编译

一个将应用于 VxWorks kernel 空间的模块。我们可以分别在一个运行中的 VxWorks 系统中编

译、运行和调试这个模块。当我们的开发工作完成时,可以将这些模块静态的连接到一个

kernel 中,构成一个完整的系统。

珠海欧比特控制工程股份有限公司 12

欧比特严禁复制

Page 16: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 2-13 DKM 视图

VxWorks Real-time Process Project 简称 RTP。使用 RTP 工程去管理和编译一个可以在

VxWorks 系统中执行的应用程序。我们可以分开的编译、运行和调试这些可执行的应用程序。

这个实时的可执行文件作为一个独立的进程运行在独立的进程地址空间。

图 2-14 RTP 视图

ROMFS 即 ROM file system,是在 ROM 上建立的只读文件系统。VxWorks ROMFS 文件系统

工程可以作为其他需要文件系统功能工程的子工程。VxWorks 系统中的 ROMFS 文件系统是用于

绑定应用程序和其他文件。而且这个文件系统不需要其他的存储介质。

图 2-15 ROMFS 视图

珠海欧比特控制工程股份有限公司 13

欧比特严禁复制

Page 17: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

3 基本操作说明

3.1 创建VIP工程

VxWorks Image Project 简称 VIP。此工程编译后生成 VxWorks 的镜像用于下载到目标板

上运行 VxWorks 系统。接下来我们以 S698PM 为例。打开 Workbench 软件,通过“File -> New

-> VxWorks Image Project”新建 VIP 工程。如下图所示。

图 3-1 新建 VIP 工程

输入工程名称:test1,并点击“Next”进入下一步。

珠海欧比特控制工程股份有限公司 14

欧比特严禁复制

Page 18: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-2 新建 VIP 工程

S698PM 为 SPARC v8 架构,并带有硬 FPU 的 MCU,故选择“s698pm”BSP 包和“gnuv8”编

译工具。点击“Next >”,进入下一步,如下图所示。

图 3-3 VIP 工程设置 1

根据工程需求添加 IPv6 库,如果 BSP 包带 SMP 功能,则这里将出现 SMP 选项。点击“Next

>”,进入下一步。

珠海欧比特控制工程股份有限公司 15

欧比特严禁复制

Page 19: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-4 VIP 工程配置 2

Workbench 提供工程模板,如下图所示,在“Profile”选项框中可以选择相应的 kernel

配置模板。模板内容如下:

PROFILE_ENHANCED_NET:增强网络型

PROFILE_BOOTAPP:应用型

PROFILE_CERT:精简型

PROFILE_COMPATIBLE:兼容型

PROFILE_DEVELOPMENT:开发型

由于开发型模板包含了许多组件,因此我们选择开发型的模板进行 VxWorks 开发。

珠海欧比特控制工程股份有限公司 16

欧比特严禁复制

Page 20: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-5 VIP 模板

点击“Finish”完成新建 VIP 工程。

图 3-6 VIP 工程

在 Workbench 左侧的 Project Explorer 窗口中会出现我们刚新建的 VIP 工程。展开 test1

工程,“Kernel Configuration”为 VIP 工程的 Kernel 配置文件。“Includes”为 VIP 工程包

含的 VxWorks 源码文件。“S698PM”为 S698PM 的 BSP 源码文件。接下来的文件为新建 VIP 工

程时生成的文件,其中 linkSyms.c、prjComps.h、prjConfig.c 和 prjParams.h 文件为动态

生成的文件,这些文件根据 Kernel 的配置而改变,不需要修改,而 prjComps.h 文件是指当

珠海欧比特控制工程股份有限公司 17

欧比特严禁复制

Page 21: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

前 VIP 工程的组件所包含的内容。romStart.c 文件是用于初始化 ROM,进行必要的解压和 ROM

Image 的放置。usrAppInit.c 用于添加编译进 kernel 的用户任务,usrRtpAppInit.c 用于添

加 RTP 任务。如下图所示。

图 3-7 Project Explorer

双击“test1”中的“Kernel Configuration”,出现如下图所示的 Kernel 配置窗口。

图 3-8 Kernel 配置窗口

我们根据 S698PM 开发板上的 RAM 和 ROM 大小,设置 Kernel 的内存配置。如 DDR 大小为

64M 字节,SRAM 大小为 4M 字节,FLASH 16M 字节,起始地址在 0X60000000 上。故将“RAM high

珠海欧比特控制工程股份有限公司 18

欧比特严禁复制

Page 22: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

Address”设置为 0x62003000,“RAM low Address”设置为 0x60003000,“ROM size”设置为

0x00200000,“local memory address”设置为 0x60000000,“local memory size”设置为

0x01ffe000。如下图所示。

图 3-9 kernel memory 设置

我们将 S698PM 的串口波特率设置为 38400,串口数量为 2,并将 UART0 设置为控制台输

出口。如下图所示。

珠海欧比特控制工程股份有限公司 19

欧比特严禁复制

Page 23: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-10 S698PM 串口设置

由于 GNU 和 DIAB 不能共存于一个工程中,而我们在编译 kernel 时选择的是 GNU 工具,

因此我们应该将配置中有关 DIAB 工具的信息去除。在这我们使用 Workbench 的搜索功能,快

捷键【Ctrl】+【F】,输入【*diab】,双击【Matching】下的“Diab compiler support routines”。

如下图所示。

图 3-11 Workbench 的搜索界面

选中“Diab compiler support routines”,右击选择“Exclude (quick exclude)”,即

珠海欧比特控制工程股份有限公司 20

欧比特严禁复制

Page 24: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

可快速将 DIAB 组件去掉。如下图所示.

图 3-12 去除 DIAB 组件

用相同的操作,分别搜索“built-in symbol table”和“shell banner”,并将这二个

组件添加(include)进来。其中“shell banner”为 VxWorks 系统启动时的 LOGO 标志。如

不需要打印显示此 LOGO,则可以不添加此组件,此时将工程编译便可以通过。编译方法右击

“test1”工程选择“Build project”。编译完成后,在工程目录下生成 VxWorks 镜像文件,

通过 v8mon 下载到目标板上运行。运行方法如下:

打开 cygwin 终端,进入工程目录,连接 v8mon,并将生成的 VxWorks 镜像文件下载进目标

板。步骤如下:

$ v8mon.exe -i –u -eth –ip 192.168.0.80 –regmem –nb -freq 70

$ lo vxWorks

$ run

珠海欧比特控制工程股份有限公司 21

欧比特严禁复制

Page 25: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-13 下载 VxWorks 到目标板中

运行中的 VxWorks,如下图所示。

图 3-14 运行 VxWorks

珠海欧比特控制工程股份有限公司 22

欧比特严禁复制

Page 26: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

3.2 RTP和ROMFS

上一小节介绍了 VxWorks 系统工程,此 VIP 工程尚未将用户应用程序添加进去。VxWorks

的应用程序有二种模式。一种是在 usrAppInit.c 文件中添加用户应用程序,在编译 VIP 工程

时便可以将此应用程序与 kernel 编译在一起。另一种是创建 RTP 工程,将应用程序编译成模

块再由 VxWorks 调用。二者的区别在于前者与 kernel 编译一起,如果应用程序崩溃,则会引

起整个系统的崩溃。而 RTP 方式则不会,因为 VxWorks 会开辟一段新内存用于运行 RTP 任务,

当 RTP 崩溃时,不会影响系统,并且系统会重新启动此 RTP 任务。

RTP 全称为 VxWorks Real Time Process Project,即运行于 VxWorks 上的实时应用程序。

我们仍然以 S698PM 为例。新建 RTP 工程,选择“File”->“New”->“VxWorks Real Time Process

Project”,如下图所示。

图 3-15 新建 RTP 工程

在打开的 New VxWorks Real Time Process Project 窗口中输入工程名称:testRTP1,

并点击【Next >】进入下一步。如下图所示。

珠海欧比特控制工程股份有限公司 23

欧比特严禁复制

Page 27: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-16 新建 RTP 窗口

点击【Next >】,进入下一步。

图 3-17 新建 RTP 工程

点击【Next >】,进入下一步。

珠海欧比特控制工程股份有限公司 24

欧比特严禁复制

Page 28: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-18 新建 RTP 工程

点击【Next >】,进入下一步。

图 3-19 新建 RTP 工程

根据我们的 S698PM 的编译器要求,在“Active build spec”框中选择“SPARCgnuv8_RTP”

为我们的编译器,并点击【Next >】,进入下一步。如下图所示。

珠海欧比特控制工程股份有限公司 25

欧比特严禁复制

Page 29: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-20 新建 RTP 工程

点击【Next >】,进入下一步。

图 3-21 新建 RTP 工程

点击【Finish】完成 RTP 工程的创建。

图 3-22 新建 RTP 工程

在左侧的“Project Explorer”窗口中将有刚才我们新建的 RTP 工程:testRTP1,如下

珠海欧比特控制工程股份有限公司 26

欧比特严禁复制

Page 30: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图所示。

图 3-23 Project Explorer 窗口

此时我们在新建的 RTP 工程中新建源文件,选中“testRTP1”工程鼠标右击,选择“New”->

“File”。如下图所示。

图 3-24 新建文件

在“File name”框中输入新建源文件名:test.c,并点击【Finish】。如下图所示。

珠海欧比特控制工程股份有限公司 27

欧比特严禁复制

Page 31: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-25 新建源文件

在新建的 test.c 中输入以下程序,并编译这个 RTP 工程。

代码清单 3-1 test.c

#include<stdio.h>

int main(int argc, char *argv[])

{

int i;

printf("Input %d parameter!\n", argc);

for(i=0; i<argc; i++){

printf("parameter[%d] = %s\n", i, argv[i]);

}

while(1);

return 0;

}

以上代码在调用时将在终端打印运行该程序所带入参数的总数和所有的参数。

完成上述操作,编译 RTP 工程,在弹出来的提示框中点击[Continue]进行编译。

图 3-26 创建 ROMFS 工程

VxWorks 系统在调用 RTP 应用程序时,是需要在文件系统中以文件形式调用的,故我们需

珠海欧比特控制工程股份有限公司 28

欧比特严禁复制

Page 32: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

要在工程中添加一个文件系统,即 ROMFS。ROM file system 简称 ROMFS,从字面上可以看出,

ROMFS 是用于 ROM 上的文件系统,是在 ROM 上建立只读的文件系统。创建过程如下图所示。

图 3-27 创建 ROMFS 工程

在“New VxWorks ROMFS file system project”对话框中填入工程名称:ROM1,并点击

【Next >】。如下图所示。

图 3-28 ROMFS 工程名称

在“Referenced subprojects 建的 RTP 工程 testRTP1,此操

作将之前的 RTP 工程包含进来,点击【Finish】完成创建 ROMFS 工程。如下图所示。

”选项框中选择前一小节创

珠海欧比特控制工程股份有限公司 29

欧比特严禁复制

Page 33: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-29 ROMFS 工程

完成 ROMFS 工程的创建后可以在“Project Explorer”窗口上看到名为 ROM1 的 ROMFS 工

程,并在其工程下包含了之前创建的 RTP 工程。如下图所示。

图 3-30 ROMFS 目录结构

双击 ROMFS 工程目录下的“VxWorks ROMFS File System Contents”,在工作窗口中出

现 ROM1 工程的目标板文件链接窗口,即将 testRTP1 中编译生成的“testRTP1.vxe”添加到

目标板上来。如下图所示。

珠海欧比特控制工程股份有限公司 30

欧比特严禁复制

Page 34: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-31 ROMFS 中添加 RTP 应用

接下来将 ROMFS 工程添加进之前创建的 test1 工程中,实现 VxWorks 中添加 RTP 应用程

序。选中 test1 工程并右击,选择“Properties”,在“Properties for test1”对话框中选

中“Project References”,并勾选 ROM1 工程,点击【OK】完成 test1 工程配置。如图 3-32

和图 3-33 所示。

珠海欧比特控制工程股份有限公司 31

欧比特严禁复制

Page 35: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-32 test1 工程属性

图 3-33 test1 工程属性框

在 test1 工程的目录结构中可以看到 ROM1 工程被添加进来。如下图所示。

珠海欧比特控制工程股份有限公司 32

欧比特严禁复制

Page 36: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-34 test1 工程目录

到目前为止,我们已将 RTP 应用添加进 VxWorks 的 Image 工程中来,接下来我们应该将

此 RTP 应用在 VxWorks 系统中运行起来。

双击打开“usrRtpAppInit.c”文件,在“usrRtpAppInit”函数中添加以下内容,如下

图所示。

代码清单 3-2 usrRtpAppInit.c

#include<rtpLib.h>

#include<stdio.h>

/******************************************************************

*

* usrRtpAppInit - initialize the users RTP applications.

*/

void usrRtpAppInit (void)

{

printf("Start myVxApp application.\n");

/* TODO - add your own application launch code here */

const char * vxeName = "/romfs/testRTP1.vxe";

const char * argv[5];

RTP_ID rtpId = NULL;

珠海欧比特控制工程股份有限公司 33

欧比特严禁复制

Page 37: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

/* set the application's arguments */

argv[0] = vxeName;

argv[1] = "first";

argv[2] = "second";

argv[3] = "third";

argv[4] = NULL;

/* Spawn the RTP. No environment variables are passed */

if ((rtpId = rtpSpawn(vxeName, argv, NULL, 220, 0x10000, 0, 0))

== NULL)

{

printf("Impossible to start myVxApp application (err)\n");

}

}

以上代码在 VxWorks 系统启动后会调用 usrRtpAppInit()函数,而函数 rtpSpawn()将调

用系统目录"/romfs"下的"testRTP1.vxe"文件,也就是我们在 ROMFS 文件系统中的 RTP 应用

程序,并且运行时带入 argv 数组中的 5 个参数,

添加 4 个组件,用于启动此 RTP 应用程序。分别是:“boot application filesystem

components”、“boot application network components”、“boot application”和“boot

application test functions”。然后编译 test1 工程,再下载到目标板上运行。运行时可以

用【rtp】命令查看正在运行的 RTP 任务。如图 3-35 和图 3-36 所示。

图 3-35 添加组件

珠海欧比特控制工程股份有限公司 34

欧比特严禁复制

Page 38: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-36 运行结果

3.3 WDB调试

Workbench 支持软件调试,即 WDB 模式。在开发阶段 WDB 可以用于调试 RTP 应用程序和

Kernel。当调试完成后,建议将 WDB 模块去除,以防止系统漏洞。

Wind Debug 简称 WDB。与 GDB 类似,WDB 是用于调试 VxWorks,支持单步、设置断点和全

速运行等调试方式。WDB 与目标板的连接方式有二种,接下来本小节介绍这二种连接方式。连

接前,请确认目标板与主机连接的串口端口没有被其他串口软件占用。

1)串口连接 WDB

我们仍然以 S698PM 为例。在 test1 工程中添加“WDB serial connection”组件。由于

我们之前将 VxWorks 的控制台输出设置在 S698PM 的串口 1(UART0),所以我们设置 WDB 的串

口号为 1(UART1),波特率为 38400,然后重新编译工程,并将 image 下载到目标板上运行。

注意,运行时在终端输出完系统启动信息后,要断开终端的连接,防止终端占用串口,而导

致 Workbench 不能连接目标板。如下图所示。

珠海欧比特控制工程股份有限公司 35

欧比特严禁复制

Page 39: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-37 WDB 串口连接

图 3-38 Image 中 WDB 设置参数

接下来在主机上建立连接服务,在 Workbench 的工具栏中选择【Target】->【New

Connection...】,如下图所示。

图 3-39 创建 WDB 连接

选择“Wind River VxWorks 6.x Target Server Connection”,并点击【Next >】进入

下一步。如下图所示。

珠海欧比特控制工程股份有限公司 36

欧比特严禁复制

Page 40: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-40 Target Server Connection

在“Backend”中选择“wdbserial”;在“Process”中选择“SIMSPARCSOLARIS”;根据

目标板连接在主机上的串口号,选择“Host serial device”上的串口;根据“WDB_TTY_CHANNEL”

组件上的端口号连接目标板上的串口;再根据“WDB_TTY_BAUD”组件上设置的波特率设置

“Serial device speed (bit/s):”。如下图所示。

图 3-41 SIMSPARCSOLARIS

珠海欧比特控制工程股份有限公司 37

欧比特严禁复制

Page 41: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-42 主机连接设置

其余设置按照默认即可,点击【Finish】完成设置。如下图所示。

图 3-43 主机连接设置

点击完成后将自动建立与目标板的连接。连接成功后在 Workbench 右下角的“Remote

Systems”窗口中会显示正在连接的系统、正在运行的 kernel 任务和 RTP 任务,如下图所示。

珠海欧比特控制工程股份有限公司 38

欧比特严禁复制

Page 42: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-44 Remote Systems 窗口

如要调试 RTP 任务,则选择对应的 RTP 任务,右击,选择【Debug】->【Attach to iTestRTP1

(Task Mode)】,如下图所示。

图 3-45 打开调试任务

在添加上需要调试的任务后,在 Workbench 的右上角的 Debug 窗口上便可以调试对应的

任务了。如下图所示。

珠海欧比特控制工程股份有限公司 39

欧比特严禁复制

Page 43: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 3-46 Debug 窗口

2)网口连接 WDB

由于之前的主机下载程序的方式是用网络下载,而现在要用网口连接 WDB,故我们要更改

为串口下载程序,即将 S698PM 上的 DSU 端口与主机的串口 1(COM1)相连接。并且将主机的

串口 2(COM2)与 S698PM 的串口 1 相连接。S698PM 的串口 1(UART0)用于目标板的控制端输

出。所有串口都用 38400 的波特率。

$ v8mon.exe –i –freq 33

$ lo vxWorks

$ run

网口连接 WDB 需要将 VxWorks 的网络部分的组件添加进来,所有我们需要添加以下组件。

首先更改 WDB 连接方式为 network,添加组件“WDB network connection”。再有添加相对应

的网络功能组件,即“INCLUDE_IFCONFIG”组件。如下图所示。

图 3-47 INCLUDE_IFCONFIG 组件

在添加完网络组件后,重新编译,下载进目标板上运行。通过【ifconfig】命令测试网

珠海欧比特控制工程股份有限公司 40

欧比特严禁复制

Page 44: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

络添加成功与否,如下图,已成功添加了网络功能。

图 3-48 ifconfig 结果图

接下来在 Workbench 中创建 Target Server 连接方式,创建过程如上小节创建 WDB 串口

连接方式一样,只是在设置中选择网络的方式。具体如下:

在“Backend”中选择“wdbrpc”;“Process”中选择“SIMSPARCSOLARIS”;“Kernel image”

中选择“File”,并将 test1 工程中的 image 文件路径添加进去;在“Advanced target server

options”中添加 test1 工程的路径,其余按默认即可。如下图所示。

图 3-49 Target Server 设置

珠海欧比特控制工程股份有限公司 41

欧比特严禁复制

Page 45: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

点击完成后将自动建立与目标板的连接。连接成功后在 Workbench 右下角的“Remote

Systems”窗口中会显示正在连接的系统、正在运行的 kernel 任务和 RTP 任务,如下图所示。

图 3-50 Remote Systems 窗口

与串口连接的 WDB 一样,可以选择需要调试的 kernel 任务或 RTP 任务,然后再 Debug 窗

口中进行相应的调试操作。如下图所示。

图 3-51 Debug 窗口

珠海欧比特控制工程股份有限公司 42

欧比特严禁复制

Page 46: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

4 驱动程序应用说明

本章围绕 S698PM BSP 中的各驱动模块展开说明,指导用户编写应用程序实现对硬件驱动

程序的调用。每个模块都分别就工程的配置、驱动接口说明、示例程序说明、示例程序运行

结果四个部分进行了说明。

4.1 UART应用开发

4.1.1 工程配置

在 VxWorks 中,UART 是默认添加的组件,S698PM BSP 包中 UART 的组件名称是“APBUART

driver”,如下图所示:

图 4-1 APBUART 设置组件

我们可以根据开发板的 UART 数量进行设置,在“hardware ”-> “peripherals” –>

“serial” -> “SIO”中,设置控制台的波特率为 38400;控制台的 UART 号是 0,即用 UART0

作为控制台;目标板的 UART 数量为 2个。如下图:

珠海欧比特控制工程股份有限公司 43

欧比特严禁复制

Page 47: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-2 SIO 组件

4.1.2 例程解析

接下来我们对 S698PM 的 UART1 进行设置,将其波特率设置为 9600,串口工作模式为

RAW_MODE,UART 应用测试流程如下图所示:

图 4-3 UART 应用流程图

接下来进行 UART 应用程序的编写与调试。在 VIP 工程中新建的 uart.c 源文件,并输入

以下程序。

珠海欧比特控制工程股份有限公司 44

欧比特严禁复制

Page 48: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 45

代码清单 4-1 应用程序

#include "VxWorks.h"

#include "selectLib.h"

#include "taskLib.h"

#include "sysLib.h"

#include "ioLib.h"

#include "stdio.h"

#include "string.h"

STATUS SerialTask(void);

int sd;

int uartmain(void)

{

int status;

int taskId;

//初始化串口

if((sd = open("/tyCo/1",O_RDONLY,0)) == ERROR)

return ERROR;

printf("Testing S698PM UART !\n");

sd = open("/tyCo/1",O_RDWR,0);//OPEN UART

status = ioctl(sd, FIOBAUDRATE, 9600);//设置串口波特率

status = ioctl(sd, FIOSETOPTIONS, OPT_RAW);//设置串口工作模式为RAW_MODE

status = ioctl(sd, FIOFLUSH, 0);//清空输入输出缓冲

taskId = taskSpawn("SerialTask",120,0,10240,(FUNCPTR)SerialTask,

0,0,0,0,0,0,0,0,0,0);

return OK;

}

STATUS SerialTask(void)

{

char send_buffer[] = "S698PM UART test.";

char receive_buf[] = {0};

int i,j;

//串口发送

write(sd,send_buffer,sizeof(send_buffer));

while(1)

{

if(ERROR != read(sd, receive_buf,1)) //从串口读字符

{

欧比特严禁复制

Page 49: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 46

for(i=0;i<20;i++)

for(j=0;j<10;j++);

write(sd,receive_buf,1);

}

memset(receive_buf,0,sizeof(receive_buf));

}

close(sd);

return ERROR;

}

完成以上 UART 应用的编写后,在 VxWorks 中连接此程序,连接的方法是在 VIP 工程的

usrAppInit.c 文件中声明 uart.c 的入口函数,并在 usrAppInit 函数中调用。最后编译下载

到 S698PM 中运行。

代码清单 4-2 应用程序

/* usrAppInit.c - stub application initialization routine */

/* Copyright (c) 1998,2006 Wind River Systems, Inc.

*

* The right to copy, distribute, modify or otherwise make use

* of this software may be licensed only pursuant to the terms

* of an applicable Wind River license agreement.

*/

/*

modification history

--------------------

01b,16mar06,jmt Add header file to find USER_APPL_INIT define

01a,02jun98,ms written

*/

/*

DESCRIPTION

Initialize user application code.

*/

#include <vxWorks.h>

#if defined(PRJ_BUILD)

#include "prjParams.h"

#endif /* defined PRJ_BUILD */

#include <stdio.h>

extern int uartmain(void);

/*******************************************************************

欧比特严禁复制

Page 50: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 47

*

* usrAppInit - initialize the users application

*/

void usrAppInit (void)

{

#ifdef USER_APPL_INIT

USER_APPL_INIT; /* for backwards compatibility */

#endif

/* add application specific code here */

if(uartmain() == ERROR)

printf("OPEN UART ERROR!\n");

}

4.1.3 接口说明

1、Open():打开一个文件

函数原型为:

int open

(

Const char * name, /* 要打开的文件名 */

int flag, /* O_RDONLY,O_WRONLY,O_RDWR, or O_CREAT */

int mode, /* 文件模式 */

)

2、ioctl():执行 I/O 控制函数

函数原型为:

Int ioctl

(

int fd; /* 文件描述符*/

int function, /* 函数代码 */

int arg, /* 传入的参数 */

)

3、taskSpawn():创建一个任务

函数原型为:

int taskSpawn

欧比特严禁复制

Page 51: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 48

(

Char * name, /* 创建新任务的名称 */

int priority, /* 新任务的优先级 */

int options, /* 任务的可以选项 */

int stackSize, /* 任务的堆栈大小 */

FUNCPTR entryPt, /* 新任务的函数入口 */

int arg1, /* 以下为入口函数的 1~10 个参数 */

int arg2,

int arg3,

int arg4,

int arg5,

int arg6,

int arg7,

int arg8,

int arg9,

int arg10,

)

利用 taskSpawn()函数创建完任务之后,如果创建成功则返回一个任务的 ID 值,否则返回

-1。

4、write():向一个文件写数据

函数原型为:

int write

(

int fd, /* 要写的文件描述符 */

char *buffer, /* 要输出的数据缓冲指针 */

size_t nbytes, /* 要写的字节数 */

)

如果文件描述符不存在、没有写操作的驱动函数、设备写操作返回错误都会返回 ERROR,

否则返回所写的字节数。

5、read():从文件或设备上读取数据

函数原型为:

int read

(

int fd, /* 要读的文件描述符 */

char *buffer, /* 接收数据的 buffer 指针 */

size_t maxbytes,/* 读到缓冲中的最大字节数 */

欧比特严禁复制

Page 52: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

)

如果文件描述符不存在、没有读操作的驱动函数、设备读操作返回错误都会返回 ERROR,

否则返回读取到的字节数。

6、close():关闭一个文件

函数原型为:

STAUTS close()

(

int fd, /* 要关闭的文件描述符 */

)

如果 close(fd),成功操作后返回 OK。

4.1.4 运行结果

此时 S698PM 上的二个串口的作用分别是:UART0 用作 VxWorks 的控制台;UART1 用

作测试输入输出。

图 4-4 VxWorks 控制台截图

珠海欧比特控制工程股份有限公司 49

欧比特严禁复制

Page 53: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

此时我们往 S698PM 的 UART1 上进行串口发送与接收测试,测试结果如下图:

图 4-5 运行串口发送与接收截图

启动 VxWorks 系统,在控制台中输入【i】,可以查看到当前系统中的任务。可以看到任

务“SerialTask”,即为我们在 uart.c 中创建的任务。

图 4-6 运行 VxWorks

珠海欧比特控制工程股份有限公司 50

欧比特严禁复制

Page 54: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

4.2 GPIO应用开发

4.2.1 工程配置

进行 GRGPIO 的测试要先将其组件添加进 VIP 工程中,即添加“GRLIB GPIO Library”

和“GRLIB GPIO driver”,如下图所示:

图 4-7 添加 GRGPIO 组件

然后在我们的 VIP 工程中添加 GPIO 测试程序。

4.2.2 例程解析

在 VIP 工程中新建 gpio_demo.c 文件,输入以下内容:

代码清单 4-3 应用程序

/*include*/

#include <vxWorks.h>

#include <stdio.h>

#include <stdlib.h>

#include "hwif/grlib/gpiolib.h"

#include "taskLibCommon.h"

#include "prjParams.h"

#include <vxbTimerLib.h>

STATUS GPIOTask(void);

珠海欧比特控制工程股份有限公司 51

欧比特严禁复制

Page 55: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 52

int gpioTestOutput(void);

int gpioTestInput(void);

int gpioTestInterrupt(void );

void gpioTestIsrA(void);

struct gpiolib_config port_config;

int InterruptNum = 0;

int taskId;

/*

* Test GPIO Demo Function

*/

void gpio_demo(void)

{

taskId = taskSpawn("GPIOTask",120,0,10240,(FUNCPTR)GPIOTask,0,0,0,

0,0,0,0,0,0,0);

}

/*

* Create a task

*/

STATUS GPIOTask(void)

{

/*test gpio output*/

gpioTestOutput();

/*test gpio input*/

gpioTestInput();

/*test gpio interrupt*/

gpioTestInterrupt();

/*Exit task*/

exit(taskId);

return OK;

}

/*

* Test GPIO Output

*/

int gpioTestOutput(void)

{

int i=0,j;

void *port[64];

printf("GPIO TEST Output...\n");

/* Configure interrupt disabled */

port_config.mask = 0;

port_config.irq_level = GPIOLIB_IRQ_LEVEL;

欧比特严禁复制

Page 56: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 53

port_config.irq_polarity = GPIOLIB_IRQ_POL_LOW;

for(i=0; i<port_nr; i++){

/*** OPEN PORTS ***/

port[i] = gpioLibOpen(i);

if(port[i] == NULL){

printf("open port %d ERROR.\n",i);

}

else{

/*** Set up both ports ***/

if ( gpioLibSet(port[i], 0, 0) ){

printf("Set up GPIO %d fail.\n",i);

}

/* Configure interrupt disabled */

if ( gpioLibSetConfig(port[i], &port_config) ){

printf("Configure GPIO %d fail.\n",i);

}

}

}

/*show all gpio*/

//gpioLibShow();

//gpioLibShowInfo(-1,NULL);

for(j=0; j<10; j++){

for(i=0; i<port_nr; i++){

/*** Test Ouput High Level ***/

if ( gpioLibSet(port[i], 1, 1) )

printf("set high GPIO %d fail.\n",i);

}

vxbMsDelay(800);

for(i=0; i<64; i++){

/*** Test Ouput Low Level ***/

if ( gpioLibSet(port[i], 1, 0) )

printf("set low GPIO %d fail.\n",i);

}

vxbMsDelay(800);

}

for(i=0; i<port_nr; i++){

/*** CLOSE PORTS ***/

gpioLibClose(port[i]);

}

printf("GPIO TEST Output End.\n");

return OK;

欧比特严禁复制

Page 57: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 54

}

/*

* Test GPIO Input

*/

int gpioTestInput(void)

{

void *port25;

int val,j;

printf("GPIO TEST Input...\n");

/*** OPEN PORTS ***/

port25 = gpioLibOpenByName("/grgpio/1/25");

if ( port25 == NULL ) {

printf("OPEN GPIO1_25 fail...\n");

return -1;

}

/*** Set up both ports ***/

if ( gpioLibSet(port25, 0, 0) ){

printf("Set up GPIO1_25 fail...\n");

return -1;

}

/* Configure interrupt disabled */

port_config.mask = 0;

port_config.irq_level = GPIOLIB_IRQ_LEVEL;

port_config.irq_polarity = GPIOLIB_IRQ_POL_LOW;

if ( gpioLibSetConfig(port25, &port_config) ){

printf("Configure GPIO1_25 fail...\n");

return -1;

}

/*** Set Input***/

if ( gpioLibSet(port25, 0, 0) )

return -1;

printf("Test GPIO1_25 success.\n");

for(j=0; j<10; j++){

val = 0x99887766;

if ( gpioLibGet(port25, &val) )

return -1;

vxbMsDelay(800);

if(val != 0x99887766){

if ( val == 1 )

欧比特严禁复制

Page 58: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 55

printf("GPIO1_25 Input High.\n");

else

printf("GPIO1_25 Input Low.\n");

}

else

return ERROR;

}

gpioLibClose(port25);

printf("GPIO TEST Input End.\n");

return OK;

}

/*

* Test GPIO Interrupt

*/

int gpioTestInterrupt(void)

{

void *port4;

int j;

printf("GPIO TEST Interrupt...\n");

/*** OPEN PORTS ***/

port4 = gpioLibOpenByName("/grgpio/0/4");

if ( port4 == NULL ) {

printf("OPEN GPIO1_4 fail...\n");

return -1;

}

/*** Set up both ports ***/

if ( gpioLibSet(port4, 0, 0) ){

printf("Set up GPIO1_4 fail...\n");

return -1;

}

/* Configure interrupt disabled */

port_config.mask = 1;

port_config.irq_level = GPIOLIB_IRQ_LEVEL;

port_config.irq_polarity = GPIOLIB_IRQ_POL_LOW;

if ( gpioLibSetConfig(port4, &port_config) ){

printf("Configure GPIO1_4 fail...\n");

return -1;

}

/* Register interrupt handler for both ports */

欧比特严禁复制

Page 59: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 56

if ( gpioLibIrqRegister(port4, gpioTestIsrA, NULL) )

return -1;

if ( gpioLibIrqEnable(port4) )

return -1;

taskDelay(2);

for(j=0; j<10; j++)

{

printf("Interrupt Number = %d\n",InterruptNum);

vxbMsDelay(800);

}

printf("GPIO TEST Interrupt End.\n");

return OK;

}

/*

* GPIO Interrupt ISR

*/

void gpioTestIsrA(void)

{

InterruptNum++;

}

usrAppInit.c 中调用 gpio_demo()。方法如下:

代码清单 4-4 应用程序

/******************************************************************

*

*

* usrAppInit - initialize the users application

*/

extern void gpio_demo(void);

void usrAppInit (void)

{

#ifdef USER_APPL_INIT

USER_APPL_INIT; /* for backwards compatibility */

#endif

/* add application specific code here */

gpio_demo();

}

欧比特严禁复制

Page 60: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 57

4.2.3 接口说明

1、taskSpawn():创建一个任务

所在头文件"taskLibCommon.h",函数原型为:

int taskSpawn

(

Char * name, /* 创建新任务的名称 */

int priority, /* 新任务的优先级 */

int options, /* 任务的可以选项 */

int stackSize, /* 任务的堆栈大小 */

FUNCPTR entryPt, /* 新任务的函数入口 */

int arg1, /* 以下为入口函数的 1~10 个参数 */

int arg2,

int arg3,

int arg4,

int arg5,

int arg6,

int arg7,

int arg8,

int arg9,

int arg10,

)

利用 taskSpawn()函数创建完任务之后,如果创建成功则返回一个任务的 ID 值,否则返回

-1。

2、gpioLibOpen():打开一个 GPIO 口。

所在头文件“hwif/grlib/gpiolib.h”,函数原型:

void *gpioLibOpen

(

int port

)

参数说明:

port:根据 BSP 注册的 GPIO 端口数量,在 S698PM 一共是 64 个 GPIO,故 port 的取值为

0 至 63。

返回值:

返回打开 GPIO 端口的句柄。

欧比特严禁复制

Page 61: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 58

3、gpiolib_config 结构体:配置一个 GPIO 端口

所在头文件“hwif/grlib/gpiolib.h”, 结构体原型:

/* GPIO Config of one GPIO port */

struct gpiolib_config {

char mask; /* 0=Masked/1=Unmasked IRQ */

char irq_level; /* Edge or Level triggered IRQ */

char irq_polarity; /* Polarity of IRQ */

};

结构体成员说明:

mask:当 mask=0 时屏蔽中断,当 mask=1 时开启中断;

irq_level:当 irq_level=0 时,边缘触发中断;当 irq_level=1 时电平触发中断;

irq_polarity:低电平中断或高电平中断。

4、gpioLibSet():设置一个 GPIO 端口

所在头文件“hwif/grlib/gpiolib.h”,函数原型:

int gpioLibSet

(

void *handle,

int dir,

int outval

)

参数说明:

handle:为 GPIO 端口的句柄;

dir:为设置端口为输入或输出,1 为输出,0 为输入;

outval:当设置为输出时输出的值。

返回值:

当返回值为-1 时,设置失败。

5、gpioLibSetConfig():根据 gpiolib_config 结构体信息设置 GPIO

所在头文件“hwif/grlib/gpiolib.h”,函数原型:

int gpioLibSetConfig

(

void *handle,

欧比特严禁复制

Page 62: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 59

struct gpiolib_config *cfg

)

参数说明:

handle:为 GPIO 端口的句柄;

cfg:gpiolib_config 结构体信息。

6、gpioLibClose():关闭 GPIO 口

所在头文件“hwif/grlib/gpiolib.h”,函数原型:

void gpioLibClose

(

void *handle

)

参数说明:

handle:为 GPIO 端口的句柄;

7、gpioLibOpenByName():根据端口名字打开 GPIO 端口

所在头文件“hwif/grlib/gpiolib.h”,函数原型:

void *gpioLibOpenByName

(

char *devName

)

参数说明:

devName:注册到 VxWorks 中的设备名字,例如:"/grgpio/0/1"。

8、gpioLibIrqRegister():注册外部中断函数

所在头文件“hwif/grlib/gpiolib.h”,函数原型:

int gpioLibIrqRegister

(

void *handle,

VOIDFUNCPTR func,

void *arg

)

参数说明:

handle:为 GPIO 端口的句柄;

欧比特严禁复制

Page 63: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 60

func:IRQ 函数名;

arg:IRQ 的输入参数。

9、taskDelay():将指定任务延迟一段时间

所在头文件"taskLibCommon.h",函数原型:

STATUS taskDelay

(

int ticks

)

参数说明:

ticks:要延迟的 tick 数。

10、vxbMsDelay():延时函数

所在头文件"vxbTimerLib.h",函数原型:

void vxbMsDelay

(

int delayTime

);

参数说明:

delayTime:要延迟的 delayTime 毫秒。

11、gpioLibShow():显示当前系统所有注册的 GPIO 信息

所在头文件“hwif/grlib/gpiolib.h”,函数原型:

void gpioLibShow(void)

12、gpioLibShowInfo():显示要查看的 GPIO 信息

所在头文件"vxbTimerLib.h",函数原型:

void gpioLibShowInfo

(

int port,

void *handle

)

参数说明:

欧比特严禁复制

Page 64: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

port:GPIO 端口号,如果要查看所有的 GPIO,则该参数设置为-1;

handle:为 GPIO 端口的句柄;

4.2.4 运行结果

运行上述编译好的 VIP 工程,并下载到 S698PM 上,结果如下图。并且在 S698PM-V6 开

发板的对应 GPIO 口的 LED 灯闪烁 10 次。

图 4-8 GPIO 测试截图

在目标板上的控制台中输入“vxBusShow”可以看到挂载在系统中的相关设备及其驱动程

序。如下图所示:

珠海欧比特控制工程股份有限公司 61

欧比特严禁复制

Page 65: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-9 vxBusShow

输入“gpioLibShow”可以查看该系统中所有注册的 GPIO 信息。如下图所示:

珠海欧比特控制工程股份有限公司 62

欧比特严禁复制

Page 66: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-10 gpioLibShow

输入“gpioLibShowInfo(-1)”可查看所有 GPIO 当前的状态。如下图所示:

珠海欧比特控制工程股份有限公司 63

欧比特严禁复制

Page 67: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-11 gpioLibShowInfo 命令 1

输入“gpioLibShowInfo(1)”可以查看对应端口号的 GPIO 口信息。

珠海欧比特控制工程股份有限公司 64

欧比特严禁复制

Page 68: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-12 gpioLibShowInfo 命令 2

4.3 Timer应用开发

4.3.1 工程配置

在 VxWorks 中,定时器是默认的组件,所以默认已添加到 Kernel 组件中。如下图所示:

珠海欧比特控制工程股份有限公司 65

欧比特严禁复制

Page 69: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-13 Timer 组件

修改好后再编译,然后通过 GRMOM 下载到目标板上运行。运行方法如下:

打开 cygwin 终端,进入工程目录,连接 GRMOM,并将生成的 Image 文件下载进目标板。

步骤如:

$ grmon.exe -i -u –eth –ip 192.168.0.80 –regmem -nb -freq 70

$ lo vxWorks

$ run

运行 vxWorks,如下图所示。

图 4-14 运行 vxWorks

珠海欧比特控制工程股份有限公司 66

欧比特严禁复制

Page 70: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 67

S698PM 中含有 4 个 32 位的定时器。在 VxWorks 中,第一个定时器将用于系统时钟

(sysClk),第二个定时器用于辅助时钟(auxClk)。第三个定时器未使用。第四个定时器用于

时间戳(stamp clock)。

4.3.2 例程解析

接下来我们进行定时器应用程序编程。在 VIP 工程中添加 TimerDemo.c 文件,输入以下

内容:

代码清单 4-5 应用程序

/* includes */

#include <vxWorks.h>

#include <taskLib.h> /* for taskSpawn() and taskDelay() */

#include <sysLib.h> /* for sysClkRateGet() */

#include <string.h> /* for bfill() */

#include <vxbTimerLib.h>

#include "hwif/vxbus/vxBus.h"

#include "hwif/util/vxbParamSys.h"

#include <stdio.h>

#include "dshm/adapt/timer.h"

#include "time.h"

#define POSIXTESTing 2

#define POSIXTESTOPEN 1

#define POSIXTESTCLOSE 0

void ISRAUXtimer(int arg);

STATUS mytimerApp(void);

void alarmHandle (timer_t ti, int arg);

STATUS POSIXTest(void);

/* globals */

int HW_Timer_syb = 0;

char syb_POSIX = POSIXTESTCLOSE;

int auxnum = 0;

int taskId;

int num = 0;

timer_t timerId;

struct itimerspec time_value;

欧比特严禁复制

Page 71: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 68

STATUS wrTimerAppInit (void)

{

timerHandle_t systimer,auxtimer,stamptimer;

systimer = sysClkHandleGet();

printf("---System clock structure---\n");

printf("Structure addr=[0x%x]\n",&systimer);

printf("Timer Name=[%s]\n",systimer->timerName);

printf("Clock Frequency=[%d]\n",systimer->clkFrequency);

printf("Features=[%d]\n",systimer->features);

printf("maxFrequency=[%d]\n",systimer->maxFrequency);

printf("-----End--------------------\n");

auxtimer = sysAuxClkHandleGet();

printf("---Auxiliary clock structure---\n");

printf("Structure addr=[0x%x]\n",&auxtimer);

printf("Timer Name=[%s]\n",auxtimer->timerName);

printf("Clock Frequency=[%d]\n",auxtimer->clkFrequency);

printf("features=[%d]\n",auxtimer->features);

printf("maxFrequency=[%d]\n",auxtimer->maxFrequency);

printf("-----End--------------------\n");

stamptimer = sysTimestampHandleGet();

printf("---Timestamp clock structure---\n");

printf("Structure addr=[0x%x]\n",&stamptimer);

printf("Timer Name=[%s]\n",stamptimer->timerName);

printf("Clock Frequency=[%d]\n",stamptimer->clkFrequency);

printf("Features=[%d]\n",stamptimer->features);

printf("maxFrequency=[%d]\n",stamptimer->maxFrequency);

printf("------End----------------------\n");

printf("---Open Auxiliary Timer---\n");

sysAuxClkConnect((FUNCPTR)ISRAUXtimer,0);

sysAuxClkRateSet(100);

printf("---Testing-----------------------\n");

taskId = taskSpawn("tMyTimerTask",102,0,10240,(FUNCPTR)mytimerApp,

0,0,0,0,0,0,0,0,0,0);

return OK;

}

STATUS mytimerApp(void)

欧比特严禁复制

Page 72: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 69

{

printf("tMyTimerTask task run.\n");

auxnum = sysAuxClkRateGet();

printf("[Auxiliary Timer ticksPerSecond value is = %d]\n",auxnum);

sysAuxClkEnable();

while(1){

vxbMsDelay(200);

if(syb_POSIX == POSIXTESTOPEN){

printf("Auxiliary Timer test end.OK!\n",HW_Timer_syb);

printf("POSIX timer testing.\n");

if(POSIXTest() == ERROR){

exit(taskId);

}

}

else if(syb_POSIX == POSIXTESTing){

if(num > 10){

syb_POSIX = POSIXTESTCLOSE;

timer_cancel(timerId);

printf("POSIX timer test end.\n");

exit(taskId);

}

}

}

}

STATUS POSIXTest(void)

{

/* create a new timer and put its id in timerId */

if(timer_create (CLOCK_REALTIME, NULL, &timerId) == ERROR){

printf ("POSIX timer_create ERROR!\n");

return ERROR;

}

/* When the timer goes off we want to call alarmHandle */

timer_connect (timerId, (VOIDFUNCPTR) alarmHandle, (int)&timerId);

/* initialise time-value */

bzero ((char *) &time_value, sizeof (struct itimerspec));

/* Timer goes off after .5 secs */

time_value.it_value.tv_nsec = 500000000;

time_value.it_interval.tv_nsec = 500000000;

/* arm timer */

欧比特严禁复制

Page 73: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 70

timer_settime (timerId, 0, &time_value, NULL);

syb_POSIX = POSIXTESTing;

return OK;

}

void alarmHandle (timer_t ti, int arg)

{

printf ("POSIX Timer ID 0x%x. time %d OK.\n", arg,num);

num++;

}

void ISRAUXtimer(int arg)

{

logMsg ("ISRAUXtimer %d\n", HW_Timer_syb, 0, 0, 0, 0, 0);

HW_Timer_syb++;

if(HW_Timer_syb > 10){

sysAuxClkDisable();

syb_POSIX = POSIXTESTOPEN;

}

}

4.3.3 接口说明

1、 timerHandle_t:定时器句柄结构体。

结构体原型:

typedef struct vxbTimerFunctionality* timerHandle_t;

struct vxbTimerFunctionality

{

BOOL allocated; /* flag used to denote timer allocation */

UINT32 clkFrequency; /* clock frequency */

UINT32 minFrequency; /* min period timer can provide */

UINT32 maxFrequency; /* max period timer can provide */

UINT32 features; /* features of timer */

UINT32 ticksPerSecond; /* ticks per second */

char timerName[32] ; /* timer Name */

UINT32 rolloverPeriod; /* rollover period of the timer in seconds */

/* allocate dedicated timer */

STATUS (*timerAllocate)

(

VXB_DEVICE_ID pInst, /* IN */

欧比特严禁复制

Page 74: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 71

UINT32 flags, /* IN */

void ** pCookie, /* OUT */

UINT32 timerNo /* IN */

);

/* release dedicated timer */

STATUS (*timerRelease)

(

VXB_DEVICE_ID pInst, /* IN */

void * pCookie /* IN */

);

/* get count between rollover/ISR events */

STATUS (*timerRolloverGet)

(

void * pCookie, /* IN */

UINT32 *count /* OUT */

);

/*

* get current timestamp timer count value.

* The driver should ensure returning the count as that of

* an up counter.

*/

STATUS (*timerCountGet)

(

void * pCookie, /* IN */

UINT32 * count /* OUT */

);

/* disable the timer */

STATUS (*timerDisable)

(

void * pCookie /* IN */

);

/* enable the timer */

STATUS (*timerEnable)

(

void * pCookie, /* IN */

UINT32 maxTimerCount /* IN */

欧比特严禁复制

Page 75: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 72

);

/* set the function to be called on every interrupt */

STATUS (*timerISRSet)

(

void * pCookie, /* IN */

void (*pIsr)(int), /* IN */

int arg /* IN */

);

/* enable the timer */

STATUS (*timerEnable64)

(

void * pCookie, /* IN */

UINT64 maxTimerCount /* OUT */

);

/* get count between rollover/ISR events */

STATUS (*timerRolloverGet64)

(

void * pCookie, /* IN */

UINT64 *count /* IN */

);

/*

* get current timestamp timer count value.

* The driver should ensure returning the count as that of

* an up counter.

*/

STATUS (*timerCountGet64)

(

void * pCookie, /* IN */

UINT64 * count /* OUT */

);

};

2、itimerspec:装载定时器值结构体。

结构体原型:

struct itimerspec

欧比特严禁复制

Page 76: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 73

{

struct timespec it_interval; /* timer period (reload value) */

struct timespec it_value; /* timer expiration */

};

参数说明:

it_interval:定时器重载值;

it_value:定时器值。

3、 sysClkHandleGet():获取系统时钟句柄。

函数原型:

extern timerHandle_t sysClkHandleGet (void);

参数说明:

输入参数:

无;

返回值:

timerHandle_t:返回系统时钟的句柄。

4、 sysAuxClkHandleGet():获取辅助时钟句柄。

函数原型:

extern timerHandle_t sysAuxClkHandleGet (void);

参数说明:

输入参数:

无;

返回值:

timerHandle_t:返回辅助时钟的句柄,

5、 sysTimestampHandleGet ():获取辅助时钟句柄。

函数原型:

extern timerHandle_t sysTimestampHandleGet (void);

参数说明:

输入参数:

无;

欧比特严禁复制

Page 77: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 74

返回值:

timerHandle_t:返回时间戳的句柄,

6、 sysAuxClkConnect():注册辅助时钟的中断函数。

函数原型:

STATUS sysAuxClkConnect

(

FUNCPTR routine,

int arg

)

参数说明:

输入参数:

routine:辅助时钟的中断函数;

arg:辅助时钟中断函数的参数。

返回值:

无。

7、 sysAuxClkRateSet():设置辅助时钟每秒产生的 tick值。

函数原型:

STATUS sysAuxClkRateSet

(

int ticksPerSecond

)

参数说明:

输入参数:

ticksPerSecond:每秒钟 tick值。

返回值:

无。

8、 taskSpawn():创建一个任务

函数原型:

int taskSpawn (char * name, int priority, int options,

int stackSize, FUNCPTR entryPt, int arg1,

int arg2, int arg3, int arg4, int arg5,

欧比特严禁复制

Page 78: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 75

int arg6, int arg7, int arg8, int arg9,

int arg10);

输入参数:

name:创建新任务的名称

priority:新任务的优先级

options:任务的可以选项

stackSize:任务的堆栈大小

entryPt:新任务的函数入口

以下为入口函数的 1~10个参数

arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10,

返回值:

利用 taskSpawn()函数创建完任务之后,如果创建成功则返回一个任务的 ID 值,否则

返回-1。

9、 sysAuxClkRateGet():获取辅助时钟 tick值。

函数原型:

int sysAuxClkRateGet (void)

参数说明:

输入参数:

返回值:

返回当前辅助时钟设置的 tick值。

10、sysAuxClkEnable():使能辅助时钟。

函数原型:

void sysAuxClkEnable (void)

参数说明:

输入参数:

返回值:

欧比特严禁复制

Page 79: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 76

11、sysAuxClkDisable():屏蔽辅助时钟。

函数原型:

void sysAuxClkDisable (void)

参数说明:

输入参数:

返回值:

12、exit():删除任务。

函数原型:

Void exit

(

int __status

)

参数说明:

输入参数:

__status:需要删除的任务的 ID;

返回值:

13、timer_create():创建一个 POSIX标准的定时器。

函数原型:

int timer_create

(

clockid_t clock_id,

struct sigevent *evp,

timer_t *ptimer

);

参数说明:

输入参数:

clock_id:定时器 ID;

evp:用户句柄;

欧比特严禁复制

Page 80: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 77

ptimer:返回定时器句柄的指针;

返回值:

创建成功,返回 OK,反之返回 ERROR。

14、timer_connect():连接用户函数

函数原型:

int timer_connect

(

timer_t timerid,

VOIDFUNCPTR routine,

int arg

);

参数说明:

输入参数:

timerid:定时器 ID;

routine:用户函数;

arg:用户函数输入参数;

返回值:

连接成功,返回 OK,反之返回 ERROR。

15、timer_settime():设置定时器的时间。

函数原型:

int timer_settime

(

timer_t timerid,

int flags,

const struct itimerspec *value,

struct itimerspec *ovalue

);

参数说明:

输入参数:

timerid:定时器 ID;

flags:1为绝对时间,0为相对时间;

value:设置定时器的值;

欧比特严禁复制

Page 81: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 78

ovalue:NULL;

返回值:

连接成功,返回 OK,反之返回 ERROR。

16、timer_cancel():取消定时器。

函数原型:

int timer_cancel

(

timer_t timerid

);

参数说明:

输入参数:

timerid:定时器 ID;

返回值:

连接成功,返回 OK,反之返回 ERROR。

17、logMsg():打印信息。

函数原型:

int logMsg

(

char *fmt, /* format string for print */

int arg1, /* first of six required args for fmt */

int arg2,

int arg3,

int arg4,

int arg5,

int arg6

)

参数说明:

输入参数:

fmt:需要打印的字符串;

arg1, arg2, arg3, arg4, arg5, arg6:六个必须的参数。

返回值:

返回打印字符串的字节数,或返回 EOF(-1)。

欧比特严禁复制

Page 82: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 79

4.3.4 运行结果

完成上述定时器的应用程序编写后,我们需要将此应用程序在 VxWorks 中连接,在 VIP

工程的 usrAppInit.c 中 usrAppInit 函数添加相应入口函数。

代码清单 4-6 应用程序

/* usrAppInit.c - stub application initialization routine */

/* Copyright (c) 1998,2006 Wind River Systems, Inc.

*

* The right to copy, distribute, modify or otherwise make use

* of this software may be licensed only pursuant to the terms

* of an applicable Wind River license agreement.

*/

/*

modification history

--------------------

01b,16mar06,jmt Add header file to find USER_APPL_INIT define

01a,02jun98,ms written

*/

/*

DESCRIPTION

Initialize user application code.

*/

#include <vxWorks.h>

#if defined(PRJ_BUILD)

#include "prjParams.h"

#endif /* defined PRJ_BUILD */

extern STATUS wrTimerAppInit (void);

/****************************************************************

*

* usrAppInit - initialize the users application

*/

void usrAppInit (void)

{

#ifdef USER_APPL_INIT

欧比特严禁复制

Page 83: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

USER_APPL_INIT; /* for backwards compatibility */

#endif

/* add application specific code here */

wrTimerAppInit();

}

将上一小节的 VIP 工程编译生成 VxWorks 镜像文件后,通过 cygwin 下载到 S698PM 开发

板中运行。运行过程如下图所示:

图 4-15 VxWorks Timer 运行截图

在控制台中输入命令【d 0x80000300】便可以显示内存 0x80000300 上的内容。这里

0x80000300 为 S698PM 的定时器基地址。对照表 4-1 S698PM 通用定时器寄存器信息便可以知

珠海欧比特控制工程股份有限公司 80

欧比特严禁复制

Page 84: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

道此时,定时器 1 已经使能,定时器 2 已关闭。

表4-1 通用定时器寄存器

地址 预置数

0x80000300 预置数

0x80000304 预置数重载值

0x80000308 配置寄存器

0x8000030C 未使用

0x80000310 定时器1 计数寄存器

0x80000314 定时器1 重载值寄存器

0x80000318 定时器1 控制寄存器

0x8000031C 未使用

0x80000320 定时器2 计数寄存器

0x80000324 定时器2 重载值寄存器

0x80000328 定时器 2 控制寄存器

图 4-16 显示内存值

珠海欧比特控制工程股份有限公司 81

欧比特严禁复制

Page 85: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

4.4 CAN应用开发

4.4.1 工程配置

测试 CAN 首先需要将 CAN 组件添加到 VxWorks 配置中,在 S698PM BSP 中,CAN 的

组件名为“GRLIB OCCAN”,即不带 DMA 的 CAN,如下图所示:

图 4-17 添加 GRLIB OCCAN driver 组件

4.4.2 例程解析

VxWorks 下 can 驱动函数接口是标准的接口,包括 open,read,write,ioctl,close 等

函数接口。

can 驱动应用编程流程如下:

珠海欧比特控制工程股份有限公司 82

欧比特严禁复制

Page 86: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-18 can 应用编程流程图

Can 应用编程实例如下:

程序示例:

在 usrAppInit.c 输入以下程序,并 build 这个 VIP 工程。

代码清单 4-7 应用程序

#include <vxWorks.h>

#if defined(PRJ_BUILD)

#include "prjParams.h"

#include <ioLib.h>

#include <stdio.h>

#endif /* defined PRJ_BUILD */

#include <hwif/io/grlibOcCan.h>

#include <grdrv/occan.h>

int fd;

#define can_speed 200000

/*****************************************************************************

*

write() 发送数据

read() 接收数据

close() 关闭设备

ioctl(fd, OCCAN_IOC_START, (int)0) 设置开始生效,can开始工作

ioctl(fd, mode, (int)value) 设置其他

ioctl(fd, OCCAN_IOC_SET_FILTER, (int)&filter) 设置校验方式

l ioctl(fd, OCCAN_IOC_SET_BTRS, (int)time_value) 设置通讯速率

open() 打开设备

珠海欧比特控制工程股份有限公司 83

欧比特严禁复制

Page 87: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 84

*

* usrAppInit - initialize the users application

*/

void usrAppInit (void)

{

#ifdef USER_APPL_INIT

USER_APPL_INIT; /* for backwards compatibility */

#endif

int len =0;

int cont =0;

/* add application specific code here */

struct pelican_btr p4btr;

struct occan_afilter p4filter;

CANMsg msg1;

fd = open("/occan/0",O_RDWR,0);

if(fd<0)

{

printf("open occan failed!!!\n");

}

p4btr.btr0 = 0x44;

p4btr.btr1 = 0x25;

p4filter.code[0]=0;

p4filter.code[1]=0;

p4filter.code[2]=0;

p4filter.code[3]=0;

p4filter.mask[0]=0xff;

p4filter.mask[1]=0xff;

p4filter.mask[2]=0xff;

p4filter.mask[3]=0xff;

p4filter.single_mode = 1;

if(ioctl(fd, OCCAN_IOC_SET_BTRS, (int)0x4425)!=0)

{

printf("ioctl SET_BTRS failed!!!\n");

}

printf("ioctl SET_BTRS ok!!!\n");

欧比特严禁复制

Page 88: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 85

if(ioctl(fd, OCCAN_IOC_SET_FILTER, (int)&p4filter)!=0)

{

printf("ioctl SET_FILTER failed!!!\n");

}

printf("ioctl SET_FILTER ok!!!\n");

if(ioctl(fd, OCCAN_IOC_START, (int)0)!=0)

{

printf("ioctl OCCAN_IOC_START failed!!!\n");

}

printf("ioctl OCCAN_IOC_START ok!!!\n");

msg1.extended =1;

msg1.rtr = 0;

msg1.sshot = 1;

msg1.len = 8;

msg1.data[0] = 0;

msg1.data[1] = 1;

msg1.data[2] = 2;

msg1.data[3] = 3;

msg1.data[4] = 4;

msg1.data[5] = 5;

msg1.data[6] = 6;

msg1.data[7] = 7;

msg1.id = 1;

len = write(fd, (char *)&msg1, sizeof(CANMsg));

if(len<0)

{

printf("send error:%x \n",len);

}

printf("send len:%d \n",len);

len = 0;

while(1)

{

欧比特严禁复制

Page 89: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 86

len = read(fd, (char *)&msg1, sizeof(CANMsg));

//printf("rlen:%d \n",len);

if(len>0)

{

printf("len:%d \n",msg1.len);

printf("id :%d \n",msg1.id);

printf("d0 :%x \n",msg1.data[0]);

printf("d1 :%x \n",msg1.data[1]);

printf("d7 :%x \n",msg1.data[7]);

//while(1);

//cont = 0xffffff;

}

len =0;

}

printf("rlen:%d \n",len);

}

4.4.3 接口说明

1、open():打开一个文件

函数原型为:

int open

(

Const char * name, /* 要打开的文件名 */

int flag, /* O_RDONLY,O_WRONLY,O_RDWR, or O_CREAT */

int mode, /* 文件模式 */

)

参数说明:

name:在 VxWorks 里面,OCCAN 的驱动文件名为:“/occan/0” 。

flag:O_RDONLY 只读;O_WRONLY 只写;O_RDWR 读写:O_CREAT 创建。

mode:0。

返回值:

文件描述符。

欧比特严禁复制

Page 90: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 87

2、ioctl():执行 I/O 控制函数

函数原型为:

int ioctl

(

int fd; /* 文件描述符*/

int function, /* 函数代码 */

int arg, /* 传入的参数 */

)

参数说明:

fd: 文件描述符,该值为 open 函数返回值。

function: 控制功能。

arg: 参数。

返回值:

ERROR-错误,OK-成功。

function arg 说明

OCCAN_IOC_SET_SPEED Arg = 200000; 设置通讯波特率为 200k

OCCAN_IOC_SET_BTRS Arg = 0x4425; 设置定时器 0 为 0x44;

定时器 1 为 0x25

OCCAN_IOC_SET_BUFLEN Arg = 0x5555aaaa; 接收缓存大小为 0xaaaa;

发送缓存大小为 0x5555

OCCAN_IOC_SET_FILTER struct occan_afilter aaa;

Arg = (int)&aaa;

设置校验方式和校验码

OCCAN_IOC_START Arg =0; 设置生效,启动 can

OCCAN_IOC_STOP Arg =0; 停止 can

3、write():向一个文件写数据

函数原型为:

int write

(

int fd, /* 要写的文件描述符 */

char *buffer, /* 要输出的数据缓冲指针 */

size_t nbytes, /* 要写的字节数 */

)

如果文件描述符不存在、没有写操作的驱动函数、设备写操作返回错误都会返回 ERROR,

否则返回所写的字节数。

Buffer 为数据收发数据结构 CANMsg 的指针,nbytes 为数据收发数据结构 CANMsg 的大

欧比特严禁复制

Page 91: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 88

小。

4、read():从文件或设备上读取数据

函数原型为:

int read

(

int fd, /* 要读的文件描述符 */

char *buffer, /* 接收数据的 buffer 指针 */

size_t maxbytes,/* 读到缓冲中的最大字节数 */

)

参数说明:

如果文件描述符不存在、没有读操作的驱动函数、设备读操作返回错误都会返回 ERROR,

否则返回读取到的字节数。

5、close():关闭一个文件

函数原型为:

STAUTS close()

(

int fd, /* 要关闭的文件描述符 */

)

如果 close(fd),成功操作后返回 OK。

6、相关数据结构

校验码设置数据结构:

struct occan_afilter {

unsigned char code[4]; //校验码 0-3

unsigned char mask[4]; //校验屏蔽码 0-3

int single_mode; //校验方式,1-单校验,0-双校验

};

在 ioctl 函数中,如果设置 can 检验方式,校验码设置数据结构的指针作为输入参数。

收发数据帧数据结构:

typedef struct {

char extended; /*!< 1= 扩展帧 (29-bit id), 0= 标准帧 (11-bit id) */

char rtr; /*!< 1=远程帧,0-数据帧 */

char sshot; /*! 1=单次发送,0=正常发送 */

unsigned char len; /*!< 数据长度:0-8 */

unsigned char data[8]; /*!<帧数据*/

欧比特严禁复制

Page 92: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

unsigned int id; /*!< 帧 id */

} CANMsg;

在 read, write 函数中,收发数据帧数据结构的指针作为第二个参数,即收发数据的 buffer

指针。

4.4.4 运行结果

连接 zlg-can 与 S698PM,zlg-can 波特率设置为 200k,0x81fa。如下图:

图 4-19 zlg-can 配置图

运行结果如下:

珠海欧比特控制工程股份有限公司 89

欧比特严禁复制

Page 93: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-20 运行 VxWorks

在控制台中可以看到以下信息:

图 4-21 VxWorks 发送数据

在 zlg-can 中可以看到接收到一帧数据:

珠海欧比特控制工程股份有限公司 90

欧比特严禁复制

Page 94: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-22 zlg-can 接收数据

VxWorks 往 zlg-can 发送数据成功,跟着 zlg-can 往 VxWorks 发送数据,如下图:

图 4-23 zlg-can 发送数据

在控制台可以看到以下信息:

珠海欧比特控制工程股份有限公司 91

欧比特严禁复制

Page 95: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-24 VxWorks 接收数据

从以上运行结果看到,VxWorks 的 can 驱动运行正常。

4.5 1553B应用开发

4.5.1 工程配置

在 S698PM BSP 包中,组件“obtWRMem for VxBus”的是用作读写内存,用户可以根据

此组件的功能,在 VxWorks 中任意读写内存。本小节以 1553B 为例,进行相应实验说明。组

件如下图所示。

珠海欧比特控制工程股份有限公司 92

欧比特严禁复制

Page 96: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-25 obtWRMem 组件

1553B 不同于一般设备,其工作方式主要通过对寄存器的配置来实现,因此其操作方式和

普通的设备也不一样,Vxworks 操作系统的底层驱动针对 1553B 给出了 Embc_SetMode()、

Embc_BcAndMtStart()、Embc_BCReadMsg()、Embc_RTReadMsg()、Embc_MTReadMsg()、

Embc_BCMinorFrm()、Embc_BCWriteMsg()、Embc_BCInit()、Embc_RTInit()、Embc_MTInit()

等函数供上层用户调用,在本文的应用程序代码中会介绍如何使用这些函数。

4.5.2 例程解析

S698PM 具有两个 1553B 端口 0 和 1,每个端口又对应两个通道 A 和 B,本文利用 1 端口

的 A 通道,通过设置芯片的三种控制器方式 BC、RT 以及 BM 和 PCI 进行通信。

具体的流程如下图 4-26。

珠海欧比特控制工程股份有限公司 93

欧比特严禁复制

Page 97: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-26 1553B 应用编程流程图

1553B 应用编程实例如下:

程序示例:

(1) BC 控制器方式

代码清单 4-8 测试 BC 控制器应用程序

{

……………

Embc_SetMode(BCMODE);

bcconf = (BcInitHand)malloc(sizeof(BcInitType));

bcconf->isretry = true;

bcconf->num = doubled;

bcconf->resptime =RESPONSE_19;

bcconf->ttr = TIMETAG_64;

bcconf->autorepeat = 0;

Embc_BCInit(bcconf);

memset(msg,0,sizeof(MsgBlock));

msg->ControlWord = CW_CHANNELA;

for(i=0;i<32;i++)

msg->Data[i]=senddata[i];

msg->CmdWord1.word = 0x30;

Embc_SetValue(BCErrType,BCErrSta,pre);

Embc_BCWriteMsg(0, msg);

Embc_BCMinorFrm(1);

珠海欧比特控制工程股份有限公司 94

欧比特严禁复制

Page 98: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 95

Embc_BcAndMtStart();

Embc_BCReadMsg(0,msg);

}

BC 总线控制器是 1553B 总线的控制和管理,也是所有信息传输动作的发起者,任何时刻

总线上只有一个总线控制器,其负责发送命令、参与数据传输、接收状态响应和检测总线系

统。

从代码清单 4-8 可以看出 BC 控制器方式的工作流程,首先利用函数 Embc_SetMode( )设

置 1553B 的控制器方式为 BC 模式,再利用函数 Embc_BCInit( )对其初始化,初始化之前必须

对初始化的内容进行配置,如代码所示。在完成初始化之后就可以进行命令字和状态字的配

置,利用函数 Embc_BCMinorFrm( )设置消息块,在上述代码中 BC 模式每次只发一条消息。

完成上述的配置之后就可以利用函数 Embc_BcAndMtStart( )启动 BC 了。

(2)RT 控制器方式

代码清单 4-9 测试 RT 控制器应用程序

{

……………

Embc_SetMode(RTMODE);

rtconf = (RtInitHand)malloc(sizeof(RtInitType));

rtconf->rtaddr = 5;

rtconf->ttr = 10;

rtconf->busy = false;

rtconf->cleartt = true;

rtconf->dynbus = false;

rtconf->loadtt = true;

rtconf->rxmode16 = true;

rtconf->service = false;

rtconf->subsys = false;

rtconf->terflag = false;

rtconf->resptime = RESPONSE_19;

if(Embc_RTInit(rtconf)==0)

printf("RT Init Success!\n");

else

printf("RT Init Fault!\n");

msgcount = 0;

while(1)

{

Embc_RTGetMsgNum(&msgcount);

if(msgcount > 0)

{

欧比特严禁复制

Page 99: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 96

break;

}

}

Embc_RTReadMsg(0,msg);

printf("blk%x,cmm%x,%d\n",msg->BlockStatus.word,msg->CmdWord1.word,msg->DataLength);

for(i = 0;i<msg->DataLength;i++)

{

printf("data %d is %x\n",i,msg->Data[i]);

}

}

RT 作为远程终端,它主要是对接收到的有效命令做出相应,会送状态字,完成相应的动

作。RT 的配置方式相对 BC 来讲稍微简单一点,从代码清单 4-9 可以看出,它只需利用函数

Embc_SetMode( )设置模式和 Embc_RTInit( )初始化相应的模式内容就可以读取数据了,读取的

数据包括块状态字、时间标志字、数据块起始地址指针和接收到的 16 位命令字。

(3)BM 控制器方式

代码清单 4-10 测试 BM 控制器应用程序

{

……………

Embc_SetMode(MTMODE);

MtInitHand mtconf;

mtconf = (MtInitHand)malloc(sizeof(MtInitType));

mtconf->resptime = RESPONSE_19;

for(i=0;i<32;i++)

mtconf->tx[i] = true;

for(i=0;i<32;i++)

mtconf->rx[i] = true;

if(Embc_MTInit(mtconf)==0)

printf("MT Init Success!");

else

printf("MT Init Fault!");

free(mtconf);

Embc_BcAndMtStart();

while(1)

{

Embc_MTGetMsgNum(&msgcount);

if(msgcount > 0)

{

break;

}

}

欧比特严禁复制

Page 100: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 97

printf("read\nread\nread\n");

Embc_MTReadMsg(0,msg);

printf("blk%x,cmm%x,len%d\n",msg->BlockStatus.word,msg->CmdWord1.word,msg->Da

taLength);

for(i = 0;i<msg->DataLength;i++)

{

printf("data %d is %x\n",i,msg->Data[i]);

}

}

MT 模式主要实现对总线上的数据流进行监听,可以有选择地进行数据监听,其工作模式

流程如代码清单 4-10 所示。首先利用函数 Embc_SetMode( )和 Embc_MTInit( )完成 MT 控制

器模式的配置和初始化工作,再利用函数 Embc_BcAndMtStart( )进行 MT 模式的启动。启动完

成之后就与 RT 模式一样了,利用函数 Embc_MTReadMsg( )监听消息。

4.5.3 接口说明

以下是对上述几个代码清单中用到的函数,具体函数说明如下:

(1)Embc_SetMode( ):设置控制器模式

函数原型为:

U32 Embc_SetMode(U32 mode)

{

U32 i,temp;

Pci1553_reset();

Set_pci1553_mode(mode);

Inter_auto_clearn(1);

Select_inter_request(1);

Embc_ClearArea();

if(mode == BCMODE)

{

for(i=0;i<256;i++)

{

WDC_WriteAddr32(hDev, td, CTRL_RAM_BASE + i *4, (data_add[i]<< 16));

}

}

else

{

if(mode == RTMODE)

{

for(i=0;i<97;i++)

欧比特严禁复制

Page 101: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 98

{

WDC_WriteAddr32(hDev, td, CTRL_RAM_BASE + rt_add_data[i] *4,

(rt_dat_data[i]<< 16));

}

WDC_WriteAddr32(hDev, td, CTRL_REG_BASE + CFG_REG4 * 4,

0x1880000);

}

else

{

for(i=0;i<0x80;i++)

{

WDC_WriteAddr32(hDev, td, CTRL_RAM_BASE + ( BM_ADDRESS_ENBLE

+ i) *4, 0xffff0000);

}

}

}

Set_pci1553_area(AREA_A);

WDC_WriteAddr32(hDev, td, CTRL_REG_BASE +INT_MASK *4, (0x0001<< 16));

return 0;

}

函数说明:

该函数主要实现对控制器模式的配置,包括模式的选择、中断请求、命令字的堆栈地址

和区域等参数的配置。

Pci1553_reset()实现 1553B 软复位。所有的寄存器和内部状态都被复位到上电时的初始状

态;

Set_pci1553_mode(mode)实现模式的设置。当 mode 为 BCMODE 时,配置寄存器 1

(BC-CFG1)的最高两位会被配置为 00,即 BC 模式;当 mode 为 RTMODE 时,相应的寄存

器会被配置为 10,即 RT 模式;当 mode 为 MTMODE 时,相应的寄存器会被配置为 01,即

MT 模式;

Inter_auto_clearn()实现中断状态自动清除。当为 1 时,CPU 读出中断状态寄存器的值后,

中断状态寄存器自动请 0;

Select_inter_request()实现产生中断的方式。当为 0 时产生脉冲中断,当为 1 时产生电平中

断,在 S698PM 中建议采用电平中断。

Set_pci1553_area(AREA_A)则实现区域的选择,如果 AREA_A 为 0,则选择 A 区域,为 1

则选择 B 区域。

欧比特严禁复制

Page 102: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 99

(2)Embc_BcAndMtStart( ):BC 和 MT 启动

函数原型为:

U32 Embc_BcAndMtStart()

{

U32 temp;

WDC_ReadAddr32(hDev,td,CTRL_REG_BASE+START_RESET_REG*4,&temp);

WDC_WriteAddr32(hDev,td,CTRL_REG_BASE+START_RESET_REG*4,temp|

0x00020000);

return 0;

}

函数说明:

通过函数 WDC_WriteAddr32( )对启动/复位寄存器(SRR) bit1 的配置来实现 BC 模式和 MT

模式的启动,当 bit1 置为 1 时,在 BC 模式下启动帧传输, 在 MT 模式下则启动 MT 监视。

(3)Embc_BCInit( ):BC 模式初始化

函数原型为:

U32 Embc_BCInit(BcInitHand bcinit)

{

SetRespTimeout(bcinit->resptime);

Set_timetag(bcinit->ttr);

if(!bcinit->isretry)

{

Bc_retry_enable(0);

}

else

{

Bc_retry_enable(1);

Set_bc_retrynum(bcinit->num);

if(bcinit->first_alt)

{

Firstretry_chancel(1);

}

else

{

Firstretry_chancel(0);

}

if(bcinit->senc_alt)

{

Secretry_chancel(1);

欧比特严禁复制

Page 103: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 100

}

else

{

Secretry_chancel(0);

}

}

if(bcinit->autorepeat)

Bc_frame_repeat(1);

else

Bc_frame_repeat(0);

return 0;

}

函数说明:

BC 模式初始化主要是初始化针对结构体 bcinit 所作的一系列处理,包括超时响应时间、

重试使能、通道的选择、自动重发、设置时间标志等。

SetRespTimeout(bcinit->resptime)实现超时响应时间的配置;

Set_timetag(bcinit->ttr)实现对时间标签的最小精度配置;

Bc_retry_enable()实现重发使能的配置,当配置为 0 时,BC 对所有的消息都不重发,当为

1 时,只有在返回状态字出错和响应时间超时的情况下才重发消息;

Set_bc_retrynum(bcinit->num)实现重发次数配置,当配置为 1 时,该消息在返回状态字出

错、响应时间超时时重发消息两次,如果为 0,则重发一次;

Bc_frame_repeat()实现帧自动重复发送使能,当配置为 1 时,帧重复发送知道启动/复位寄

存器(SSR)中的复位、停止帧发送、停止消息中的任一位为 1 是才会停止,为 0 时则 BC 发

送完一帧数据就会停止。

(4)Embc_BCMinorFrm( ):BC 模式消息块设置

函数原型为:

U32 Embc_BCMinorFrm(U32 MsgNum)

{

U32 i = 0,value = 0;

value = (0xFFFF - MsgNum)<<16;

for(i=0;i<256;i++)

{

WDC_WriteAddr32(hDev, td, CTRL_RAM_BASE + BU_BCFRMBUFA + i *4,

(data_add[i]<< 16));

}

欧比特严禁复制

Page 104: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 101

WDC_WriteAddr32(hDev, 2, CTRL_RAM_BASE + (0x101 + 0) *4, value);

return 0;

}

函数说明:

该函数是对消息块的配置,主要包括消息堆栈区的配置和消息个数的设置。

WDC_WriteAddr32(hDev,td,CTRL_RAM_BASE+BU_BCFRMBUFA+i *4, (data_add[i]<<

16))实现消息堆栈区的设置;函数 WDC_WriteAddr32(hDev, 2, CTRL_RAM_BASE + (0x101 + 0)

*4, value)实现消息个数的设置。

(5)typedef struct BcInitStruct 结构体

结构体原型为:

typedef struct BcInitStruct

{

bool isretry;

U32 num;

U32 resptime;

U32 ttr;

U32 first_alt;

U32 senc_alt;

bool autorepeat;

} BcInitType, *BcInitHand;

参数说明:

Isretry:重发使能;

num:重发次数;

resptime:超时响应时间;

ttr:时间标签最小精度;

first_alt:第一次重试使用另一通道;

senc_alt:第二次重试使用另一通道;

autorepeat:祯自动重复使能。

(6)typedef struct RtInitStruct 结构体

结构体原型为:

typedef struct RtInitStruct

{

欧比特严禁复制

Page 105: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 102

U32 ttr;

U32 rtaddr;

U32 resptime;

bool subsys;

bool dynbus;

bool terflag;

bool service;

bool busy;

bool cleartt;

bool loadtt;

bool rxmode16;

}RtInitType,*RtInitHand;

参数说明:

ttr:时间标签最小精度;

rtaddr:rt 地址;

resptime:超时响应时间;

subsys:子系统标志;

dynbus:动态总线控制接收标志;

terflag:终端标志;

service:服务请求标志;

busy:忙标志;

cleartt:同步清除时标;

loadtt:同步重载时标;

rxmode16:接收模式命令。

4.5.4 运行结果

利用耦合连接器将 S698PM 和 PCI 进行连接,连接方式为端口 1 的 A 通道。

(1)BC 测试结果

当 S698PM 作为 BC 控制器模式时,S698PM 发送数据,PCI 作为 RT 端接收数据,从

图 4-27 可以看出,PCI 接收到的数据正常,说明 S698PM BC 控制器模式工作正常。

欧比特严禁复制

Page 106: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-27 VxWorks 1553B BC 控制器模式测试

(2)RT 测试结果

当 S698PM 配置为 RT 控制器模式时,PCI 应该为 BC 模式,此时,PCI 发送数据,S698PM

接收数据,测试结果如下图所示。

图 4-28 VxWorks 1553B RT 控制器模式测试

从图 4-28 可以看出,S698PM 接收到的数据正常,说明 S698PM 作为 RT 控制器模式时

珠海欧比特控制工程股份有限公司 103

欧比特严禁复制

Page 107: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

工作正常。

(3)MT 测试结果

当 S698PM 设置为 MT 工作模式时,其目的是监听总线上的数据流,此时我们把 PCI

设置为 BC 模式,S698PM 设置为 MT 模式,PCI 发送数据,S698PM 监听发送的数据并接

收,测试结果如下图所示。

图 4-29 VxWorks 1553B MT 控制器模式测试

从图 4-29 可以看出,当 S698PM 作为 MT 模式时,能够正常监听总线上的数据流,从

而说明 S698PM 作为 MT 控制器模式时工作正常。

4.6 Ethernet应用开发

4.6.1 工程配置

完成上述基本的配置之后,需要对网络进行配置。首先需添加网络组件“GRETH

Ethernet 10/100/1000 MAC”组件,如图 4-30 所示。

珠海欧比特控制工程股份有限公司 104

欧比特严禁复制

Page 108: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-30 添加网络组件

添加完网络组件后,我们需要添加“PING 组件”,方便测试网络是否连接成功,如图

4-31 所示。

图 4-31 添加 PING 组件

添加 IFCONFIG 组件,用于查看网络设置,如图 4-32 所示。

珠海欧比特控制工程股份有限公司 105

欧比特严禁复制

Page 109: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-32 添加 IFCONFIG 组件

完成上述操作后,依据 S698PM 开发板上的硬件信息修改以下参数:在“Component

Configuration”窗口中选择“hardware (default)”->“memory (default)”->“BSP Memory

Configuration”。修改其中的“RAM high Address”为 0x62403000;“RAM low Address”为

0x60003000;“local memory address”修改为 0x60000000。将“LOCAL_MEM_SIZE”改为

0x01ffe000。再到“Project Explorer”窗口中选择 S698PM_END 工程下的“S698PM”,双击

打开目录下的config.h文件,修改“RAM_HIGH_ADRS”为0x62003000;“RAM_LOW_ADRS”

为 0x60003000;修改“LOCAL_MEM_LOCAL_ADRS”为 0x60000000,

修改“LOCAL_MEM_SIZE”为 0x01ffe000。如图 4-33 所示。

珠海欧比特控制工程股份有限公司 106

欧比特严禁复制

Page 110: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-33 修改 BSP Memory Configuration

根据 S698PM 开发板的硬件,还需要对其串口进行设置,搜素组件*SIO,设置其 baudrate

位 38400,console serial port 为 0,这里说明串口 0 作为控制台,再将 number of serial ports

为 2,因为 S698PM 就只有两个串口,如图 4-34 所示。

图 4-34 修改 Serial port

编译整个工程,通过 GRMOM 下载到目标板上运行。

珠海欧比特控制工程股份有限公司 107

欧比特严禁复制

Page 111: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

打开 cygwin 终端,进入工程目录,连接 GRMON 并将生成的 Image 文件下载进目标板。

步骤如下:

$ grmon -i –eth –ip 192.168.0.80 –regmem -nb -freq 70

$ lo vxWorks

$ run

运行 vxWorks,如图 4-35 所示。

图 4-35 运行 vxWorks

此时可以输入 ifconfig 和 ping 命令来检查网络情况,如图 4-36 和 4-37 所示。

珠海欧比特控制工程股份有限公司 108

欧比特严禁复制

Page 112: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-36 输入 ifconfig 查看网络相关信息

图 4-37 ping 命令检查

珠海欧比特控制工程股份有限公司 109

欧比特严禁复制

Page 113: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

如果想更改网络相关参数,在终端下输入:

# ifconfig greth0 inet 192.168.0.249 netmask 255.255.255.1 lladdr 01:02:03:04:05:06

其中 "192.168.0.249”是修改后的 IP 地址, “255.255.255.1”是修改后的子网掩码,

“01:02:03:04:05:06“是修改后的 MAC 地址。

图 4-38 是更改 IP 地址和 MAC 地址以及 MASK 的截图。

图 4-38 更改 IP 地址和 MAC 地址以及 MASK

Vxworks END 属于网络设备,其头文件包涵在“src/hwif/h/end”中,应用层不能调用。

它与普通的 I/O 设备不同,没有对应的设备文件。

4.6.2 例程解析

应用程序和网络接口之间的数据通信不是基于标准的 I/O 系统接口,而是基于 socket(),

bind(),listen(),accept(),send(),recv()等系统调用。

因此本文利用标准的 Socket 套接字通过 TCP/IP 协议通信,以此来验证 Vxworks 的网络驱

珠海欧比特控制工程股份有限公司 110

欧比特严禁复制

Page 114: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

动是否可用。

编程思想:利用标准 Socket 套接字通过 TCP/IP 协议通信,服务器端等待服务,一旦有客

户端的通信请求,如果通信协议符合,则建立连接,进行通信。

通信架构:

珠海欧比特控制工程股份有限公司 111

图 4-39 END 应用编程流程图

程序示例:

在 usrAppInit.c 输入以下程序,并 build 这个 VIP 工程。

代码清单 4-11 应用程序

#include <vxWorks.h>

#if defined(PRJ_BUILD)

#include "prjParams.h"

#endif /* defined PRJ_BUILD */

#include "inetLib.h"

#include "taskLib.h"

#include "stdio.h"

#include "ioLib.h"

#include "fioLib.h"

#include "strings.h"

#include "wrn/coreip/sockLib.h"

Socket()建立流式套接字

Bind(),套接字绑定本地地址

Listen(),准备好接收连接

Accept(),接收连接,等待客户端连接

连接成功,创建ServerWrite()和ServerRead()任务

跳转到task执行

Close(),关闭套接字

欧比特严禁复制

Page 115: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 112

void Send();

void Recv();

int newFd;

/****************************************************************

*

* usrAppInit - initialize the users application

*/

void usrAppInit (void)

{

#ifdef USER_APPL_INIT

USER_APPL_INIT; /* for backwards compatibility */

#endif

/* add application specific code here */

struct sockaddr_in serverAddr;

struct sockaddr_in clientAddr;

int sockAddrSize;

int sFd;

sockAddrSize = sizeof (struct sockaddr_in);

bzero ((char *) &serverAddr, sockAddrSize);

serverAddr.sin_family = AF_INET;

serverAddr.sin_port = htons (5001);

serverAddr.sin_addr.s_addr = htonl (INADDR_ANY);

if ((sFd = socket (AF_INET, SOCK_STREAM, 0)) == ERROR)

{

perror ("socket");

return (ERROR);

}

printf("built socket success\n");

if (bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize) ==

ERROR)

{

perror ("bind");

close (sFd);

return (ERROR);

}

printf("bind success\n");

if (listen (sFd, 1) == ERROR)

{

perror ("listen");

close (sFd);

return (ERROR);

欧比特严禁复制

Page 116: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 113

}

printf("listen success\n");

while(1)

{

if ((newFd = accept(sFd, (struct sockaddr *) &clientAddr,

&sockAddrSize)) == ERROR)

{

perror ("accept");

close (sFd);

return (ERROR);

}

else

{

printf("accept success\n");

if ((taskSpawn("tSend", 100, 0, 4096, (FUNCPTR)Send, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0)) == ERROR)

{

printf("taskSpwan tSend failed!\n");

}

if ((taskSpawn("tRecv", 100, 0, 4096, (FUNCPTR)Recv, 0, 0,

0, 0, 0, 0, 0, 0, 0, 0)) == ERROR)

{

printf("taskSpwan tRecv failed!\n");

}

}

}

}

void Send()

{

char str[100]="111";

while(1)

{

if (send(newFd,str,sizeof(str),1) == ERROR)

{

perror ("write");

close (newFd);

}

else

{

printf("toClient=%s\n",str);

}

taskDelay(60);

欧比特严禁复制

Page 117: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 114

}

}

void Recv()

{

char str[100]={0};

while(1)

{

if (recv(newFd, str, sizeof(str),1) < 0)

{

perror ("read");

close (newFd);

}

else

{

printf ("from Client:%s\n", str);

}

}

}

4.6.3 接口说明

1、socket():建立套接字

函数原型为:

int socket ( int domain, /* address family (AF_xxx) */ int type, /* socket type (SOCK_xxx) */ int protocol /* socket protocol (usually 0) */ );

参数说明:

int domain:internet 协议族。

int type:分为流式 Socket(Socket_STREAM),数据报 Socket(SOCK_DGREAM),原始

Socket,本应用程序中选择流式 Socket。

int protocol:Socket 协议参数,一般是 0。

建立成功返回的是套接字描述符,失败则返回 ERROR。

欧比特严禁复制

Page 118: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 115

2、bind():绑定服务器地址

函数原型为:

STATUS bind

(

int s, /* socket descriptor */

struct sockaddr *name, /* name to be bound */

int namelen /* length of name */

)

参数说明:

int s:套接字描述符。

struct sockaddr *name:绑定的服务器地址。

int namelen:服务器地址长度。

如果绑定失败则返回 ERROR。

3、 listen():建立监听

函数原型为:

STATUS listen

(

int s, /* socket descriptor */

int backlog /* number of connections to queue */

)

参数说明:

Int s:套接字描述符。

Int backlog:监听的通道数。

如果监听失败则返回 ERROR。

4、accept():建立连接通信

函数原型为:

int accept

(

int s, /* socket descriptor */

struct sockaddr *addr, /* peer address */

int *addrlen /* peer address length */

)

欧比特严禁复制

Page 119: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 116

参数说明:

Int s:套接字描述符。

struct sockaddr *addr:同网段的客户端地址。

int *addrlen:地址长度。

如果建立连接成功,则返回 OK,失败则返回 ERROR。

5、send():发送数据

函数原型为:

int send

(

FAST int s, /* socket to send to */

FAST const char * buf, /* pointer to buffer to transmit */

FAST int bufLen, /* length of buffer */

FAST int flags /* flags to underlying protocols */

)

参数说明:

FAST int s:服务器和客户端连接的描述符。

FAST const char * buf:发送 buf 的指针。

FAST int bufLen:发送 buf 的长度。

FAST int flags:协议标志,一般设为 1。

发送失败则返回-1。

6、recv():接收数据

函数原型为:

int recv

(

FAST int s, /* socket to receive data from */

FAST char *buf, /* buffer to write data to */

FAST int bufLen, /* length of buffer */

FAST int flags /* flags to underlying protocols */

)

参数说明:

FAST int s:服务器和客户端连接的描述符。

欧比特严禁复制

Page 120: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 117

FAST const char * buf:接收 buf 的指针。

FAST int bufLen:接收 buf 的长度。

FAST int flags:协议标志,一般设为 1。

接收失败返回-1。

7、close():关闭一个文件

函数原型为:

STAUTS close()

(

int fd, /* 要关闭的文件描述符 */

)

如果 close(fd),成功操作后返回 OK。

8、相关数据结构

struct sockaddr_in

{

shot int sin_family; //internet 协议族

unsigned short int sin_port; //端口号,必须是网络字节顺序

struct in_addr sin_addr; //internet 地址,必须是网络字节顺序

unsigned char sin_zero; //添 0(和 struct sockaddr 一样大小)

};

在应用程序中,internet 协议族选择了 AF_INET,在镜像文件运行起来之后,输入 ifconfig

命令,看到网络信息包涵“inet 192.168.0.184”,因此我们选择 internet 协议族为 AF_INET。端

口号设置为 5001,“struct in_addr sin_addr”表示的是 IP 地址,在应用程序中后面都跟 htonl()

函数,表示将主机字节顺序转换成网络字节顺序,函数成功时,返回转换结果,失败时返回-1。

4.6.4 运行结果

下载 vxworks 镜像文件到 S698PM 中,操作系统运行起来之后,打开网络调试助手,选择

协议类型位 TCP 客户端,服务器 IP 地址为 192.168.0.184,服务器端口号为 5001,并点击连接,

就能接收到服务器发送过来的数据,如图 4-40 所示。

欧比特严禁复制

Page 121: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

图 4-40 vxworks end 发送数据

在网络调试助手发送数据栏中输入“aaa”,点击发送按钮,在终端下显示接收到的数据,

如图 4-41 所示。

图 4-41 vxworks end 接收数据

珠海欧比特控制工程股份有限公司 118

欧比特严禁复制

Page 122: OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册 · VxWorks支持在Windows和Linux等主机下进行安装开发。本章节主要介绍在Windows下 安装VxWorks的开发环境。Workbench版本是3.1,

OBT-BSP-VxWorks6.7 S698PM 平台应用开发手册

珠海欧比特控制工程股份有限公司 119

从图 4-40 和 4-41 中可以看出,VXWORKS END 和外界的网络数据传输良好,从而也印

证了网络驱动可以正常使用。

欧比特严禁复制