obt-bsp-vxworks6.7 s698p4 欧比特复制 平台应用开发手册obt-bsp-vxworks6.7...

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

Upload: others

Post on 03-Nov-2020

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

V2.0

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

www.myorbita.net

欧比特严禁复制

Page 2: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

目 录

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. 编译kernel和库.................................................................................................................6

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

2.7. Workbench使用说明 ......................................................................................................10

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

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

3.2. RTP和ROMFS................................................................................................................22

3.3. WDB调试 .......................................................................................................................33

3.4. 烧写FLASH....................................................................................................................40

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

4.1. UART应用开发 ..............................................................................................................44

4.1.1. 工程配置.............................................................................................................44

4.1.2. 例程解析.............................................................................................................45

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

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

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

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

4.2.2. 例程解析.............................................................................................................52

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

4.2.4. 运行结果.............................................................................................................60

4.3. Timer应用开发 ...............................................................................................................64

4.3.1. 工程配置.............................................................................................................64

4.3.2. 例程解析.............................................................................................................65

4.3.3. 接口说明.............................................................................................................68

4.3.4. 运行结果.............................................................................................................76

4.4. CAN应用开发 ................................................................................................................80

4.4.1. 工程配置.............................................................................................................80

4.4.2. 例程解析.............................................................................................................80

4.4.3. 接口说明.............................................................................................................84

4.4.4. 运行结果.............................................................................................................87

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

4.5.1. 工程配置.............................................................................................................90

4.5.2. 例程解析.............................................................................................................91

4.5.3. 接口说明.............................................................................................................94

欧比特严禁复制

Page 3: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

4.5.4. 运行结果.............................................................................................................99

4.6. Ethernet应用开发 .........................................................................................................102

4.6.1. 工程配置...........................................................................................................102

4.6.2. 例程解析...........................................................................................................108

4.6.3. 接口说明...........................................................................................................111

4.6.4. 运行结果...........................................................................................................114

欧比特严禁复制

Page 4: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

VxWorks6.7 FOR S698P4 应用开发手册

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

1. 概述

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

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

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

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

出了应用实例和运行结果。

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针对不同的处理器有不同的版本。

欧比特严禁复制

Page 5: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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

适用于 non-MMU 系统;

支持中断控制;

支持 APBUART UART 控制台及驱动;

支持 Timer 定时器单元;

支持以太网驱动(GRETH);

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

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

欧比特严禁复制

Page 6: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

珠海欧比特控制工程股份有限公司 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 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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,运

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

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

欧比特严禁复制

Page 8: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

可改。安装界面如下图。

图 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 目

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

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

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

欧比特严禁复制

Page 9: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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. 编译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

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

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

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

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

欧比特严禁复制

Page 10: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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 终端

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

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

欧比特严禁复制

Page 12: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 2-12 Workbench 主界面图

以下是主界面的图解:

1.菜单栏

2.工具栏

3.工程管理视图

4.远程连接视图

5.编辑视图

6.捷径工具列

7.大纲视图

8.控制台视图

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

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

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

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

表 2-2 Workbench 按钮

按钮 描述 按钮 描述

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

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

欧比特严禁复制

Page 15: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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

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

运行程序 外部工具

下载程序 内存模拟器

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

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

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

绑定 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 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

3. 基本操作说明

3.1. 创建VIP工程

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

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

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

图 3-1 新建 VIP 工程

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

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

欧比特严禁复制

Page 18: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-2 新建 VIP 工程

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

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

图 3-3 VIP 工程设置 1

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

>”,进入下一步。

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

欧比特严禁复制

Page 19: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-5 VIP 模板

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

图 3-6 VIP 工程

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

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

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

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

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

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

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

欧比特严禁复制

Page 21: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

加 RTP 任务。如下图所示。

图 3-7 Project Explorer

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

图 3-8 Kernel 配置窗口

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

4M 字节,FLASH 16M 字节,起始地址在 0X40000000 上。故将“RAM high Address”设置为

0x40403000,“RAM low Address”设置为 0x40003000,“ROM size”设置为 0x01000000,“local

memory address”设置为 0x40000000,“local memory size”设置为 0x00400000。如下图所

示。

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

欧比特严禁复制

Page 22: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-9 kernel memory 设置

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

出口。如下图所示。

图 3-10 S698P4 串口设置

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

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

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

如下图所示。

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

欧比特严禁复制

Page 23: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-11 Workbench 的搜索界面

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

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

图 3-12 去除 DIAB 组件

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

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

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

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

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

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

欧比特严禁复制

Page 24: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

板。步骤如下:

$ v8mon.exe -i –u -eth -freq 33

$ lo vxWorks

$ run

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

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

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

欧比特严禁复制

Page 25: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-14 运行 VxWorks

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 上的实时应用程序。

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

Project”,如下图所示。

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

欧比特严禁复制

Page 26: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-15 新建 RTP 工程

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

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

图 3-16 新建 RTP 窗口

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

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

欧比特严禁复制

Page 27: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-17 新建 RTP 工程

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

图 3-18 新建 RTP 工程

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

图 3-19 新建 RTP 工程

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

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

欧比特严禁复制

Page 28: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

图 3-20 新建 RTP 工程

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

图 3-21 新建 RTP 工程

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

图 3-22 新建 RTP 工程

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

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

欧比特严禁复制

Page 29: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图所示。

图 3-23 Project Explorer 窗口

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

“File”。如下图所示。

图 3-24 新建文件

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

图 3-25 新建源文件

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

欧比特严禁复制

Page 30: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

在新建的 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 应用程序时,是需要在文件系统中以文件形式调用的,故我们需

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

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

图 3-27 创建 ROMFS 工程

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

【Next >】。如下图所示。

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

欧比特严禁复制

Page 31: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-28 ROMFS 工程名称

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

作将之前的

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

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

图 3-29 ROMFS 工程

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

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

“Project Explorer”

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

欧比特严禁复制

Page 32: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-30 ROMFS 目录结构

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

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

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

图 3-31 ROMFS 中添加 RTP 应用

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

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

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

和图 3-33 所示。

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

欧比特严禁复制

Page 33: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-32 test1 工程属性

图 3-33 test1 工程属性框

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

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

欧比特严禁复制

Page 34: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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;

/* set the application's arguments */

argv[0] = vxeName;

argv[1] = "first";

argv[2] = "second";

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

欧比特严禁复制

Page 35: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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 添加组件

欧比特严禁复制

Page 36: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-36 运行结果

3.3. WDB调试

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

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

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

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

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

1)串口连接 WDB

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

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

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

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

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

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

欧比特严禁复制

Page 37: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-37 WDB 串口连接

图 3-38 Image 中 WDB 设置参数

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

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

图 3-39 创建 WDB 连接

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

下一步。如下图所示。

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

欧比特严禁复制

Page 38: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 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

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

欧比特严禁复制

Page 39: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-42 主机连接设置

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

图 3-43 主机连接设置

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

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

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

欧比特严禁复制

Page 40: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-44 Remote Systems 窗口

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

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

图 3-45 打开调试任务

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

任务了。如下图所示。

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

欧比特严禁复制

Page 41: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 3-46 Debug 窗口

2)网口连接 WDB

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

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

串口 2(COM2)与 S698P4 的串口 1 相连接。S698P4 的串口 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】命令测试网

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

欧比特严禁复制

Page 42: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

图 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 设置

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

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

欧比特严禁复制

Page 43: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

图 3-50 Remote Systems 窗口

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

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

图 3-51 Debug 窗口

3.4. 烧写FLASH

Workbench 支持 4 种镜像文件的生成,如下表:

表 3-1 编译选项

编译选项 编译规则和镜像文件类型

default vxWorks[.bin | .hex]

default_rom vxWorks_rom[.bin | .hex]

default_romCompress vxWorks_romCompress[.bin | .hex]

default_romResident vxWorks_romResident[.bin | .hex]

vxWorks 文件类型的镜像文件适用于开发阶段和经常需要下载到目标板上运行的应用。也

可以应用在 boot loader 和系统镜像同在存储介质中的系统,由 boot loader 引导加载启动。

在开发阶段,经常将此类镜像存在主机系统(或网络服务器),通过 boot loader 下载到目标

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

欧比特严禁复制

Page 44: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

板系统中,并加载进 RAM 中运行。VxWorks 的符号表存储在主机中的 vxWorks.sym 文件中,可

以用 Workbench 工具去查看。如果需要将符号表加载进 VxWorks 镜像文件中,就要将组件

“INCLUDE_STANDALONE_SYM_TBL”配置到 VxWorks 镜像中。

vxWorks_rom 文件类型的镜像文件适用于存储在一些不易丢失的设备的目标板上,如

Flash。它会自行复制到 RAM 中,并使处理器选择在 RAM 中运行。

vxWorks_romCompress 镜像文件存储在不易丢失的存储设备目标板上。这种镜像大部分进

行了压缩,还有小部分不压缩的用于处理器上电或重启时立即执行。不压缩部分用于将压缩

的部分镜像进行解压,并将其从 ROM 拷贝到 RAM 中运行。但这个解压操作将增加系统启动时

间。

vxWorks_romResident 镜像文件是存储在目标板的 ROM 中。在系统启动时,它仅拷贝 data

部分到 RAM 上,text 部分驻留在 ROM 里,因此这是一种被看作在 ROM 中运行的镜像类型。相

比其他类型的镜像,此类型系统启动较快,但运行较慢。

大多数系统在开发完成后要将相应的程序烧写到 Flash 芯片内,以方便系统的运用。以

S698P4 为例,在烧写 Flash 前,我们应将 test1 工程生成对应的二进制文件,即更改编译选

项,重新编译生成 ROM 的镜像文件。如下图所示。

图 3-52 工程编译选项

根据 S698P4 上的 Flash 芯片的大小下载镜像文件。这里我们依旧是用 v8mon 连接目标板,

烧写前将目标板上的 Flash 擦空。具体步骤如下:

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

欧比特严禁复制

Page 45: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

$ v8mon.exe -i -freq 33 –u #连接目标板

SPARC V8 debug monitor, version v1.7.0, build 12/01/2010

Copyright (C) 2009,2012 Obita Inc - all rights reserved.

Comments or bug-reports to [email protected]

port /dev/ttyS0 @ 115200 baud

initialising ..........

processor frequency : 33.0 MHz

register windows : 8

hardware mul/div : yes

floating-point unit : Meiko FPU

instruction cache : 2 * 4 kbytes, 4*8 bytes/line

data cache : 2 * 4 kbytes, 4*8 bytes/line

hardware breakpoints : 2

sram width : 32 bits

sram banks : 2

sram bank size : 2048 kbytes

sdram width : 32 bits

sdram banks : 2

sdram bank size : 65536 kbytes

sdram : col 9 , cas 2, ref 7.75 us

stack pointer : 0x403ffff0

ǒ leon3 link success!

v8mon>flash –intel #S698P4 上用的是 intel 的 flash 芯片

[Nr] Name Type Addr Off Size

[1] .text PROGBITS 40000000 00010000 0000f540

[2] .data PROGBITS 4000f540 0001f540 00000b2c

total size:65644 bytes

entry point: 0x40000000

Intel-style

prom : 32 bit

flash : 2 * 16-bit

flash size : 2 * 16384 Kbyte

blocks : 128

block size : 2 * 128 Kbyte

Program exited normally.

v8mon>flash erase 16 #擦空 flash 的 16 块,即 4M 空间

block 0 : 0x00000000 - 0x00040000 erasing .. success

block 1 : 0x00040000 - 0x00080000 erasing .. success

block 2 : 0x00080000 - 0x000c0000 erasing .. success

block 3 : 0x000c0000 - 0x00100000 erasing .. success

block 4 : 0x00100000 - 0x00140000 erasing .. success

block 5 : 0x00140000 - 0x00180000 erasing .. success

block 6 : 0x00180000 - 0x001c0000 erasing .. success

block 7 : 0x001c0000 - 0x00200000 erasing .. success

欧比特严禁复制

Page 46: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

block 8 : 0x00200000 - 0x00240000 erasing .. success

block 9 : 0x00240000 - 0x00280000 erasing .. success

block 10 : 0x00280000 - 0x002c0000 erasing .. success

block 11 : 0x002c0000 - 0x00300000 erasing .. success

block 12 : 0x00300000 - 0x00340000 erasing .. success

block 13 : 0x00340000 - 0x00380000 erasing .. success

block 14 : 0x00380000 - 0x003c0000 erasing .. success

block 15 : 0x003c0000 - 0x00400000 erasing .. success

Program exited normally.

v8mon>flash load ../default_rom/vxWorks_rom #下载镜像文件

downloading...... last(bytes) : 0

writing ... <total: 2839868 Bytes>

dowmloaded Bytes 2839868

download finished

Program exited normally.

v8mon>

烧写完成后,PC 连接目标板的 UART0,重启目标板,便可以在串口中查看 VxWorks 系统

的启动信息。

图 3-53 flash 运行结果图 欧比特严禁复制

Page 47: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

4. 驱动程序应用说明

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

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

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

4.1. UART应用开发

4.1.1. 工程配置

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

driver”,如下图所示:

图 4-1 APBUART 设置组件

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

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

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

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

欧比特严禁复制

Page 48: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-2 SIO 组件

4.1.2. 例程解析

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

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

图 4-3 UART 应用流程图

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

以下程序。

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

欧比特严禁复制

Page 49: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

代码清单 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 S698P4 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[] = "S698P4 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)) //从串口读字符

{

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

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

欧比特严禁复制

Page 50: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

write(sd,receive_buf,1);

}

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

}

close(sd);

return ERROR;

}

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

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

下载到 S698P4 中运行。

代码清单 4-2 应用程序

/*

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);

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

*

* 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():打开一个文件

欧比特严禁复制

Page 51: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

函数原型为:

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

(

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():向一个文件写数据

欧比特严禁复制

Page 52: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

函数原型为:

int write

(

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

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

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

)

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

否则返回所写的字节数。

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

函数原型为:

int read

(

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

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

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

)

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

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

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

函数原型为:

STAUTS close()

(

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

)

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

4.1.4. 运行结果

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

测试输入输出。

欧比特严禁复制

Page 53: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-4 VxWorks 控制台截图

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

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

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

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

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

欧比特严禁复制

Page 54: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-6 运行 VxWorks

4.2. GPIO应用开发

4.2.1. 工程配置

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

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

图 4-7 添加 GRGPIO 组件

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

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

欧比特严禁复制

Page 55: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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);

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);

欧比特严禁复制

Page 56: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

return OK;

}

/*

* Test GPIO Output

*/

int gpioTestOutput(void)

{

int i=0,j;

void *port[8];

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

/* Configure interrupt disabled */

port_config.mask = 0;

port_config.irq_level = GPIOLIB_IRQ_LEVEL;

port_config.irq_polarity = GPIOLIB_IRQ_POL_LOW;

for(i=0; i<8; 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<8; 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<8; i++){

欧比特严禁复制

Page 57: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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

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

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

}

vxbMsDelay(800);

}

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

/*** CLOSE PORTS ***/

gpioLibClose(port[i]);

}

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

return OK;

}

/*

* Test GPIO Input

*/

int gpioTestInput(void)

{

void *port;

int val,j;

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

/*** OPEN PORTS ***/

port = gpioLibOpenByName("/grgpio/0/1");

if ( port == NULL ) {

printf("OPEN GPIO0 1 fail...\n");

return -1;

}

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

if ( gpioLibSet(port, 0, 0) ){

printf("Set up GPIO0 1 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(port, &port_config) ){

printf("Configure GPIO0 1 fail...\n");

return -1;

}

欧比特严禁复制

Page 58: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

/*** Set Input***/

if ( gpioLibSet(port, 0, 0) )

return -1;

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

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

val = 0x99887766;

if ( gpioLibGet(port, &val) )

return -1;

vxbMsDelay(800);

if(val != 0x99887766){

if ( val == 1 )

printf("GPIO0 1 Input High.\n");

else

printf("GPIO0 1 Input Low.\n");

}

else

return ERROR;

}

gpioLibClose(port);

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

return OK;

}

/*

* Test GPIO Interrupt(4\5\6\7)

*/

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;

}

欧比特严禁复制

Page 59: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

/* 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 */

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);

欧比特严禁复制

Page 60: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

void usrAppInit (void)

{

#ifdef USER_APPL_INIT

USER_APPL_INIT; /* for backwards compatibility */

#endif

/* add application specific code here */

gpio_demo();

}

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

欧比特严禁复制

Page 61: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

)

参数说明:

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

0 至 63。

返回值:

返回打开 GPIO 端口的句柄。

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”,函数原型:

欧比特严禁复制

Page 62: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

int gpioLibSetConfig

(

void *handle,

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 端口的句柄;

func:IRQ 函数名;

arg:IRQ 的输入参数。

欧比特严禁复制

Page 63: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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

)

参数说明:

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

handle:为 GPIO 端口的句柄;

4.2.4. 运行结果

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

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

欧比特严禁复制

Page 64: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-8 GPIO 测试

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

序。如下图所示:

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

欧比特严禁复制

Page 65: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-9 vxBusShow

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

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

欧比特严禁复制

Page 66: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-10 gpioLibShow

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

图 4-11 gpioLibShowInfo 显示 1

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

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

欧比特严禁复制

Page 67: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-12 gpioLibShowInfo 显示 2

4.3. Timer应用开发

4.3.1. 工程配置

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

图 4-13 定时器组件

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

欧比特严禁复制

Page 68: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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

(sysClk),第二个定时器用于辅助时钟(auxClk)。而 VxWorks 中的时间戳(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;

STATUS wrTimerAppInit (void)

欧比特严禁复制

Page 69: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

{

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)

{

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

欧比特严禁复制

Page 70: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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 */

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

syb_POSIX = POSIXTESTing;

欧比特严禁复制

Page 71: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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 */

UINT32 flags, /* IN */

欧比特严禁复制

Page 72: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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 73: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

/* 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

{

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

struct timespec it_value; /* timer expiration */

};

欧比特严禁复制

Page 74: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

参数说明:

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);

参数说明:

输入参数:

无;

返回值:

timerHandle_t:返回时间戳的句柄,

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

函数原型:

STATUS sysAuxClkConnect

(

欧比特严禁复制

Page 75: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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,

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

int arg10);

输入参数:

name:创建新任务的名称

priority:新任务的优先级

options:任务的可以选项

stackSize:任务的堆栈大小

entryPt:新任务的函数入口

欧比特严禁复制

Page 76: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

以下为入口函数的 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)

参数说明:

输入参数:

返回值:

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

函数原型:

void sysAuxClkDisable (void)

参数说明:

输入参数:

返回值:

12、exit():删除任务。

欧比特严禁复制

Page 77: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

函数原型:

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:用户句柄;

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

返回值:

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

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

函数原型:

int timer_connect

(

timer_t timerid,

VOIDFUNCPTR routine,

int arg

);

参数说明:

输入参数:

欧比特严禁复制

Page 78: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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:设置定时器的值;

ovalue:NULL;

返回值:

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

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

函数原型:

int timer_cancel

(

timer_t timerid

);

参数说明:

输入参数:

timerid:定时器 ID;

返回值:

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

欧比特严禁复制

Page 79: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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)。

4.3.4. 运行结果

完成上述定时器的应用程序编写后,我们需要将此应用程序在 VxWorks 中连接,在 VIP

工程的 usrAppInit.c 中 usrAppInit 函数添加相应入口函数。

将上一小节的 VIP 工程编译生成 VxWorks 镜像文件后,通过 cygwin 下载到 S698P4 开发

板中运行。下载前,我们将 S698P4 的串口 1(UART0)与 PC 机的串口连接,并打开串口调

试助手,将串口调试助手的波特率设置为 38400。下载过程如下图所示: 欧比特严禁复制

Page 80: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-14 下载镜像文件

下载完成后,在串口调试助手中将会打印出 VxWorks 的相关信息,并作为 VxWorks 的控

制台,通过此控制台与 VxWorks 交互。如下图所示:

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

欧比特严禁复制

Page 81: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-15 VxWorks 控制台

在控制台中输入命令【d 0x80000300】便可以显示内存 0x80000300 上的内容。这里

0x80000300 为 S698P4 的定时器基地址。对照表 4-1 S698P4 通用定时器寄存器信息便可以知

道此时,定时器 1 已经使能,定时器 2 已关闭。

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

欧比特严禁复制

Page 82: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

表4-1 通用定时器寄存器

地址 寄存器

0x80000300 预置数

0x80000304 预置数重载值

0x80000308 配置寄存器

0x8000030C 未使用

0x80000310 定时器1 计数寄存器

0x80000314 定时器1 重载值寄存器

0x80000318 定时器1 控制寄存器

0x8000031C 未使用

0x80000320 定时器2 计数寄存器

0x80000324 定时器2 重载值寄存器

0x80000328 定时器 2 控制寄存器

图 4-16 VxWorks 控制台

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

欧比特严禁复制

Page 83: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

4.4. CAN应用开发

4.4.1. 工程配置

测试 CAN 首先需要将 CAN 组件添加到 VxWorks 配置中,在 S698P4 BSP 中,CAN 的组

件名为“GRLIB OCCAN”,即不带 DMA 的 CAN,如下图所示:

图 4-17 添加 GRLIB OCCAN driver 组件

4.4.2. 例程解析

VxWorks 下 can 驱动函数接口是标准的接口,包括 open,read,write,ioctl,close 等函数

接口。

can 驱动应用编程流程如下:

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

欧比特严禁复制

Page 84: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

open() 打开设备

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

图 4-18 can 应用编程流程图

Can 应用编程实例如下:

程序示例:

在 usrAppInit.c 输入以下程序,并 build 这个 VIP 工程。

代码清单 4-6 应用程序

#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

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

*

*

* usrAppInit - initialize the users application

ioctl(fd, OCCAN_IOC_SET_BTRS, (int)time_value) 设置通讯速率

ioctl(fd, OCCAN_IOC_SET_FILTER, (int)&filter) 设置校验方式

ioctl(fd, mode, (int)value) 设置其他

ioctl(fd, OCCAN_IOC_START, (int)0) 设置开始生效,can开始工作

ioctl

write() 发送数据

read() 接收数据

close() 关闭设备

欧比特严禁复制

Page 85: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

*/

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");

if(ioctl(fd, OCCAN_IOC_SET_FILTER, (int)&p4filter)!=0)

{

printf("ioctl SET_FILTER failed!!!\n");

欧比特严禁复制

Page 86: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

}

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)

{

len = read(fd, (char *)&msg1, sizeof(CANMsg));

欧比特严禁复制

Page 87: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

//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。

返回值:文件描述符。

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

函数原型为:

int ioctl

欧比特严禁复制

Page 88: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

(

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 的大

小。

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

函数原型为:

int read

欧比特严禁复制

Page 89: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

(

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]; /*!<帧数据*/

unsigned int id; /*!< 帧 id */

} CANMsg;

在 read, write 函数中,收发数据帧数据结构的指针作为第二个参数,即收发数据的 buffer

指针。

欧比特严禁复制

Page 90: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

4.4.4. 运行结果

连接 zlg-can 与 S698P4-Dkit,zlg-can 波特率设置为 200k,0x81fa。如下图:

图 4-19 zlg-can 配置图

运行结果如下:

图 4-20 运行 VxWorks

在控制台中可以看到以下信息:

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

欧比特严禁复制

Page 91: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-21 VxWorks 发送数据

在 zlg-can 中可以看到接收到一帧数据:

图 4-22 zlg-can 接收数据

VxWorks 往 zlg-can 发送数据成功,跟着 zlg-can 往 VxWorks 发送数据,如下图:

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

欧比特严禁复制

Page 92: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-23 zlg-can 发送数据

在控制台可以看到以下信息:

图 4-24 VxWorks 接收数据

从以上运行结果看到,VxWorks 的 can 驱动运行正常。

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

欧比特严禁复制

Page 93: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

4.5. 1553B应用开发

4.5.1. 工程配置

在 S698P4 BSP 包中,组件“obtWRMem for VxBus”的是用作读写内存,用户可以根据此

组件的功能,在 VxWorks 中任意读写内存。本小节以 1553B 为例,进行相应实验说明。组件

如下图所示。

图 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()

等函数供上层用户调用,在本文的应用程序代码中会介绍如何使用这些函数。

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

欧比特严禁复制

Page 94: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

4.5.2. 例程解析

S698P4 具有两个 1553B 端口(端口 0、端口 1),每个端口又对应两个通道 A 和 B,本示

例利用 1 端口的 A 通道,通过设置芯片的三种控制器方式 BC、RT 以及 BM 和 PCI 进行通信。

具体的流程如下图所示。

图 4-26 1553B 应用编程流程图

1553B 应用编程实例如下:

(1) BC 控制器方式

代码清单 4-7 测试 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;

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

欧比特严禁复制

Page 95: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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);

Embc_BcAndMtStart();

Embc_BCReadMsg(0,msg);

}

BC 总线控制器是 1553B 总线的控制和管理,也是所有信息传输动作的发起者,任何时刻

总线上只有一个总线控制器,其负责发送命令、参与数据传输、接收状态响应和检测总线系

统。

从代码清单 4-7 可以看出 BC 控制器方式的工作流程,首先利用函数 Embc_SetMode()设

置 1553B 的控制器方式为 BC 模式,再利用函数 Embc_BCInit( )对其初始化,初始化之前必须

对初始化的内容进行配置,如代码所示。在完成初始化之后就可以进行命令字和状态字的配

置,利用函数 Embc_BCMinorFrm( )设置消息块,在上述代码中 BC 模式每次只发一条消息。

完成上述的配置之后就可以利用函数 Embc_BcAndMtStart( )启动 BC 了。

(2)RT 控制器方式

代码清单 4-8 测试 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;

欧比特严禁复制

Page 96: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

while(1)

{

Embc_RTGetMsgNum(&msgcount);

if(msgcount > 0)

{

break;

}

}

Embc_RTReadMsg(0,msg);

printf("blk%x,cmm%x,%d\n",msg->BlockStatus.word,msg->CmdWord1.word,msg->Data

Length);

for(i = 0;i<msg->DataLength;i++)

{

printf("data %d is %x\n",i,msg->Data[i]);

}

}

RT 作为远程终端,它主要是对接收到的有效命令做出相应,会送状态字,完成相应的动

作。RT 的配置方式相对 BC 来讲稍微简单一点,从代码清单 4-8 可以看出,它只需利用函数

Embc_SetMode( )设置模式和 Embc_RTInit( )初始化相应的模式内容就可以读取数据了,读取的

数据包括块状态字、时间标志字、数据块起始地址指针和接收到的 16 位命令字。

(3)BM 控制器方式

代码清单 4-9 测试 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);

欧比特严禁复制

Page 97: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

if(msgcount > 0)

{

break;

}

}

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-9 所示。首先利用函数 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

欧比特严禁复制

Page 98: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

{

if(mode == RTMODE)

{

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

{

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 时产生电平

中断,在 S698P4 中建议采用电平中断。

欧比特严禁复制

Page 99: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

Set_pci1553_area(AREA_A)则实现区域的选择,如果 AREA_A 为 0,则选择 A 区域,为

1 则选择 B 区域。

(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)

{

欧比特严禁复制

Page 100: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

Secretry_chancel(1);

}

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));

}

WDC_WriteAddr32(hDev, 2, CTRL_RAM_BASE + (0x101 + 0) *4, value);

欧比特严禁复制

Page 101: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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

{

U32 ttr;

U32 rtaddr;

U32 resptime;

bool subsys;

欧比特严禁复制

Page 102: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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. 运行结果

利用耦合连接器将 S698P4 和 PCI 进行连接,连接方式为端口 1 的 A 通道。

(1)BC 测试结果

当 S698P4 作为 BC 控制器模式时,S698P4 发送数据,PCI 作为 RT 端接收数据,从下图可

以看出,PCI 接收到的数据正常,说明 S698P4 BC 控制器模式工作正常。

欧比特严禁复制

Page 103: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-27 VxWorks 1553B BC 控制器模式测试

(2)RT 测试结果

当 S698P4 配置为 RT 控制器模式时,PCI 应该为 BC 模式,此时,PCI 发送数据,S698P4

接收数据,测试结果如下图所示。

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

欧比特严禁复制

Page 104: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-28 VxWorks 1553B RT 控制器模式测试

从图 4-28 可以看出,S698P4 接收到的数据正常,说明 S698P4 作为 RT 控制器模式时工

作正常。

(3)MT 测试结果

当 S698P4 设置为 MT 工作模式时,其目的是监听总线上的数据流,此时我们把 PCI 设置

为 BC 模式,S698P4 设置为 MT 模式,PCI 发送数据,S698P4 监听发送的数据并接收,测试

结果如下图所示。

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

欧比特严禁复制

Page 105: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-29 VxWorks 1553B MT 控制器模式测试

从上图可以看出,当 S698P4 作为 MT 模式时,能够正常监听总线上的数据流,从而说

明 S698P4 作为 MT 控制器模式时工作正常。

4.6. Ethernet应用开发

4.6.1. 工程配置

在 S698P4 BSP 包中,网络组件名为“GRETH Ethernet 10/100/1000 MAC”,需要测试网

络驱动,首先需要对网络进行配置,添加网络组件“GRETH Ethernet 10/100/1000 MAC”组

件,如下图所示。

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

欧比特严禁复制

Page 106: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-30 添加网络组件

添加完网络组件后,我们需要添加“PING 组件”,方便测试网络是否连接成功,如下图所

示。

图 4-31 添加 PING 组件

添加 IFCONFIG 组件,用于查看网络设置,如下图所示。

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

欧比特严禁复制

Page 107: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-32 添加 IFCONFIG 组件

完成上述操作后,依据 S698P4 开发板上的硬件信息修改以下参数:在“Component

Configuration”窗口中选择“hardware (default)”->“memory (default)”->“BSP Memory

Configuration”。修改其中的“RAM high Address”为 0x40403000;“RAM low Address”为

0x40003000;“local memory address”修改为 0x40000000。将“LOCAL_MEM_SIZE”改为

0x003ff000 。 再 到 “ Project Explorer ” 窗 口 中 选 择 S698P4_END 工 程 下 的

“wrleon23_sparcleon”,双击打开目录下的 config.h 文件,修改“RAM_HIGH_ADRS”为

0x40403000;“RAM_LOW_ADRS”为 0x40003000;修改“LOCAL_MEM_LOCAL_ADRS”为 0x40000000,

修改“LOCAL_MEM_SIZE”为 0x003ff000。如下图所示。

图 4-33 修改 BSP Memory Configuration

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

欧比特严禁复制

Page 108: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

根据 S698P4 开发板的硬件,还需要对其串口进行设置,搜素组件*SIO,设置其 baudrate

位 38400,console serial port 为 0,这里说明串口 0 作为控制台,再将 number of serial

ports 为 2,因为 S698P4 就只有两个串口,如下图所示。

图 4-34 修改 Serial port

编译整个工程,通过 GRMOM 下载到目标板上运行。

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

骤如下:

$ grmon -i -freq 20

$ lo vxWorks

$ run

运行 vxWorks,如下图所示。

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

欧比特严禁复制

Page 109: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-35 运行 vxWorks

此时可以输入 ifconfig 和 ping 命令来检查网络情况,如下图所示。

图 4-36 输入 ifconfig 查看网络相关信息

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

欧比特严禁复制

Page 110: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

图 4-37 ping 命令检查

如果想更改网络相关参数,在终端下输入:

# 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 地址。

下图是更改 IP 地址和 MAC 地址以及 MASK 的截图。

图 4-38 更改 IP 地址和 MAC 地址以及 MASK

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

欧比特严禁复制

Page 111: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

Vxworks END 属于网络设备,其头文件包涵在“src/hwif/h/end”中,应用层不能调用。

它与普通的 I/O 设备不同,没有对应的设备文件。

4.6.2. 例程解析

应用程序和网络接口之间的数据通信不是基于标准的 I/O 系统接口,而是基于 socket(),

bind(),listen(),accept(),send(),recv()等系统调用。

因此本文利用标准的 Socket 套接字通过 TCP/IP 协议通信,以此来验证 Vxworks 的网络驱

动是否可用。

编程思想:利用标准 Socket 套接字通过 TCP/IP 协议通信,服务器端等待服务,一旦有客

户端的通信请求,如果通信协议符合,则建立连接,进行通信。

通信架构:

Socket()建立流式套接字

Bind(),套接字绑定本地地址

Listen(),准备好接收连接

Accept(),接收连接,等待客户端连接

连接成功,创建ServerWrite()和ServerRead()任务

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

图 4-39 END 应用编程流程图

程序示例:

在 usrAppInit.c 输入以下程序,并 build 这个 VIP 工程。

代码清单 4-10 应用程序

跳转到task执行

Close(),关闭套接字欧比特严禁复制

Page 112: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

#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"

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)

{

欧比特严禁复制

Page 113: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

perror ("bind");

close (sFd);

return (ERROR);

}

printf("bind success\n");

if (listen (sFd, 1) == ERROR)

{

perror ("listen");

close (sFd);

return (ERROR);

}

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)

欧比特严禁复制

Page 114: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

{

perror ("write");

close (newFd);

}

else

{

printf("toClient=%s\n",str);

}

taskDelay(60);

}

}

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) */

);

欧比特严禁复制

Page 115: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

参数说明:

int domain:internet 协议族。

int type:分为流式 Socket(Socket_STREAM),数据报 Socket(SOCK_DGREAM),原始

Socket,本应用程序中选择流式 Socket。

int protocol:Socket 协议参数,一般是 0。

建立成功返回的是套接字描述符,失败则返回 ERROR。

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():建立连接通信

欧比特严禁复制

Page 116: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

函数原型为:

int accept

(

int s, /* socket descriptor */

struct sockaddr *addr, /* peer address */

int *addrlen /* peer address length */

)

参数说明:

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 */

欧比特严禁复制

Page 117: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

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。

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 镜像文件到 S698P4 中,操作系统运行起来之后,打开网络调试助手,选择

协议类型位 TCP 客户端,服务器 IP 地址为 192.168.0.184,服务器端口号为 5001,并点击连接,

欧比特严禁复制

Page 118: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

就能接收到服务器发送过来的数据,如下图所示。

图 4-40 vxworks end 发送数据

在网络调试助手发送数据栏中输入“aaa”,点击发送按钮,在终端下显示接收到的数据,

如下图所示。

图 4-41 vxworks end 接收数据

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

欧比特严禁复制

Page 119: OBT-BSP-VxWorks6.7 S698P4 欧比特复制 平台应用开发手册OBT-BSP-VxWorks6.7 S698P4平台应用开发手册 图2-1 Workbench 3.1安装界面图 2.2. 安装orks 6.7 Service

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

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

从上图可以看出,VXWORKS END 和外界的网络数据传输良好,从而也印证了网络驱动

可以正常使用。

欧比特严禁复制