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

OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

V2.0

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

www.myorbita.net

欧比特严禁复制

Page 2: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

珠海欧比特控制工程股份有限公司 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工具链....................................................................................................5

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调试 .......................................................................................................................34

3.4 烧写FLASH....................................................................................................................39

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

4.1 UART应用开发..............................................................................................................42

4.1.1 工程配置.............................................................................................................42

4.1.2 例程解析.............................................................................................................43

4.1.3 接口说明.............................................................................................................45

4.1.4 运行结果.............................................................................................................47

4.2 Timer应用开发 ..............................................................................................................49

4.2.1 工程配置.............................................................................................................49

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

4.2.3 接口说明.............................................................................................................55

4.2.4 运行结果.............................................................................................................63

4.3 CAN应用开发 ................................................................................................................66

4.3.1 工程配置.............................................................................................................66

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

4.3.3 接口说明.............................................................................................................71

4.3.4 运行结果.............................................................................................................74

4.4 429 应用开发 .................................................................................................................77

4.4.1 工程配置.............................................................................................................77

4.4.2 例程解析.............................................................................................................79

4.4.3 接口说明.............................................................................................................83

4.4.4 运行结果.............................................................................................................84

欧比特严禁复制

Page 3: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

1 概述

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

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

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

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

了应用实例和运行结果。

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

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

欧比特严禁复制

Page 4: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

适用于 non-MMU 系统;

支持中断控制;

支持 APBUART UART 控制台及驱动;

支持 Timer 定时器单元;

支持 CAN 总线驱动;

支持 ARINC 429 总线驱动;

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

欧比特严禁复制

Page 5: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

珠海欧比特控制工程股份有限公司 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 6: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 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 安装界面

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

欧比特严禁复制

Page 7: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

2.3 安装GNU GCC工具链

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

行其并安装,安装完后会出现在 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 8: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

录下。点击“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 编译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 9: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

方法 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 10: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

图 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 11: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

通过以上二种方法编译完成后,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 12: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 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 13: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 2-12 Workbench 主界面图

以下是主界面的图解:

1.菜单栏

2.工具栏

3.工程管理视图

4.远程连接视图

5.编辑视图

6.捷径工具列

7.大纲视图

8.控制台视图

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

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

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

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

表 2-2 Workbench 按钮

按钮 描述 按钮 描述

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

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

欧比特严禁复制

Page 14: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

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

运行程序 外部工具

下载程序 内存模拟器

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

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

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

绑定 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 15: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 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 16: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

3 基本工程实践

3.1 创建VIP工程

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

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

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

图 3-1 新建 VIP 工程

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

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

欧比特严禁复制

Page 17: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-2 新建 VIP 工程

S698-T 为 SPARC v8 架构,并带有硬 FPU 的 MCU,故选择“s698-t”BSP 包和“gnuv8”编

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

图 3-3 VIP 工程设置 1

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

>”,进入下一步。

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

欧比特严禁复制

Page 18: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-4 VIP 工程配置 2

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

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

PROFILE_ENHANCED_NET:增强网络型

PROFILE_BOOTAPP:应用型

PROFILE_CERT:精简型

PROFILE_COMPATIBLE:兼容型

PROFILE_DEVELOPMENT:开发型

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

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

欧比特严禁复制

Page 19: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-5 VIP 模板

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

图 3-6 VIP 工程

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

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

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

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

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

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

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

欧比特严禁复制

Page 20: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

加 RTP 任务。如下图所示。

图 3-7 Project Explorer

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

图 3-8 Kernel 配置窗口

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

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

欧比特严禁复制

Page 21: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

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

示。

图 3-9 kernel memory 设置

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

出口。如下图所示。

图 3-10 S698-T 串口设置

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

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

欧比特严禁复制

Page 22: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

如下图所示。

图 3-11 Workbench 的搜索界面

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

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

图 3-12 去除 DIAB 组件

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

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

欧比特严禁复制

Page 23: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

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

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

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

板。步骤如下:

$ grmon.exe -i –u –leon2

$ lo vxWorks

$ run

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

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

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

欧比特严禁复制

Page 24: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

Project”,如下图所示。

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

欧比特严禁复制

Page 25: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-15 新建 RTP 工程

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

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

图 3-16 新建 RTP 窗口

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

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

欧比特严禁复制

Page 26: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-17 新建 RTP 工程

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

图 3-18 新建 RTP 工程

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

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

欧比特严禁复制

Page 27: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-19 新建 RTP 工程

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

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

图 3-20 新建 RTP 工程

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

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

欧比特严禁复制

Page 28: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-21 新建 RTP 工程

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

图 3-22 新建 RTP 工程

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

图所示。

图 3-23 Project Explorer 窗口

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

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

欧比特严禁复制

Page 29: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

“File”。如下图所示。

图 3-24 新建文件

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

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

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

欧比特严禁复制

Page 30: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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 >】。如下图所示。

图 3-28 ROMFS 工程名称

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

欧比特严禁复制

Page 31: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

在“Referenced subprojects”选项框中选择前一小节创建的 RTP 工程 testRTP1,此操

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

图 3-29 ROMFS 工程

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

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

图 3-30 ROMFS 目录结构

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

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

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

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

欧比特严禁复制

Page 32: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-31 ROMFS 中添加 RTP 应用

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

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

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

和图 3-33 所示。

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

欧比特严禁复制

Page 33: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-32 test1 工程属性

图 3-33 test1 工程属性框

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

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

欧比特严禁复制

Page 34: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

欧比特严禁复制

Page 35: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

欧比特严禁复制

Page 36: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-36 运行结果

3.3 WDB调试

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

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

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

速运行等调试方式。WDB 与目标板的连接方式有二种,一种是串口连接方式,另一种是网口连

接方式。由于 S698-T 不带网口功能,所有接下来本小节只介绍第一种连接方式。连接前,请

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

1)串口连接 WDB

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

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

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

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

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

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

欧比特严禁复制

Page 37: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-37 WDB 串口连接

图 3-38 Image 中 WDB 设置参数

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

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

图 3-39 创建 WDB 连接

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

欧比特严禁复制

Page 38: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

下一步。如下图所示。

图 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

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

欧比特严禁复制

Page 39: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-42 主机连接设置

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

图 3-43 主机连接设置

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

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

欧比特严禁复制

Page 40: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

图 3-44 Remote Systems 窗口

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

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

图 3-45 打开调试任务

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

任务了。如下图所示。

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

欧比特严禁复制

Page 41: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-46 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 下载到目标

板系统中,并加载进 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 中运行的镜像类型。相

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

欧比特严禁复制

Page 42: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

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

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

图 3-47 工程编译选项

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

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

$ sparc-elf-objcopy.exe -O binary vxWorks_romCompress prom.bin

$ mkflash.exe -amd -width 16 -erasews 10 prom.bin

$ v8mon -i -u -leon2 -freq 30

$ wmem 0x80000004 0x126f

$ mcfg2 0x126f

$ lo flash.out

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

的启动信息。

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

欧比特严禁复制

Page 43: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-48 flash 运行结果图

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

欧比特严禁复制

Page 44: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

4 驱动程序应用说明

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

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

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

4.1 UART应用开发

4.1.1 工程配置

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

driver”,如下图所示:

图 4-1 APBUART 设置组件

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

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

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

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

欧比特严禁复制

Page 45: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-2 SIO 组件

4.1.2 例程解析

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

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

图 4-3 UART 应用流程图

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

以下程序。

代码清单 4-1 应用程序

#include "VxWorks.h"

#include "selectLib.h"

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

欧比特严禁复制

Page 46: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

#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 S698-T 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[] = "S698-T 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++);

write(sd,receive_buf,1);

}

欧比特严禁复制

Page 47: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

}

close(sd);

return ERROR;

}

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

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

下载到 S698-T 中运行。

代码清单 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 48: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

函数原型为:

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。

欧比特严禁复制

Page 49: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

函数原型为:

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

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

测试输入输出。

欧比特严禁复制

Page 50: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-4 VxWorks 控制台截图

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

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

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

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

欧比特严禁复制

Page 51: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

图 4-6 运行 VxWorks

4.2 Timer应用开发

4.2.1 工程配置

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

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

欧比特严禁复制

Page 52: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-7 Timer 组件

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

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

步骤如:

$ v8mon.exe -i –u

$ lo vxWorks

$ run

运行 vxWorks,如下图所示。

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

欧比特严禁复制

Page 53: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-8 运行 vxWorks

S698-T中含有2个32位的定时器。在VxWorks中,第一个定时器将用于系统时钟(sysClk),

辅助时钟(auxClk)和时间戳(stamp clock)共用第二个定时器。

4.2.2 例程解析

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

内容:

代码清单 4-3 应用程序

/* includes */

#include <vxWorks.h>

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

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

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

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

欧比特严禁复制

Page 54: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

{

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

欧比特严禁复制

Page 55: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

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

欧比特严禁复制

Page 56: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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;

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

欧比特严禁复制

Page 57: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

syb_POSIX = POSIXTESTOPEN;

}

}

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

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

);

欧比特严禁复制

Page 58: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

/*

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

);

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

);

欧比特严禁复制

Page 59: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

};

参数说明:

it_interval:定时器重载值;

it_value:定时器值。

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

函数原型:

extern timerHandle_t sysClkHandleGet (void);

参数说明:

输入参数:

无;

欧比特严禁复制

Page 60: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

返回值:

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

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

函数原型:

extern timerHandle_t sysAuxClkHandleGet (void);

参数说明:

输入参数:

无;

返回值:

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

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

函数原型:

extern timerHandle_t sysTimestampHandleGet (void);

参数说明:

输入参数:

无;

返回值:

timerHandle_t:返回时间戳的句柄,

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

函数原型:

STATUS sysAuxClkConnect

(

FUNCPTR routine,

int arg

)

参数说明:

输入参数:

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

欧比特严禁复制

Page 61: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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:新任务的函数入口

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

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

返回值:

欧比特严禁复制

Page 62: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

返回-1。

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

函数原型:

int sysAuxClkRateGet (void)

参数说明:

输入参数:

返回值:

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

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

函数原型:

void sysAuxClkEnable (void)

参数说明:

输入参数:

返回值:

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

函数原型:

void sysAuxClkDisable (void)

参数说明:

输入参数:

返回值:

欧比特严禁复制

Page 63: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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

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

返回值:

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

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

函数原型:

int timer_connect

(

timer_t timerid,

VOIDFUNCPTR routine,

int arg

欧比特严禁复制

Page 64: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

);

参数说明:

输入参数:

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

);

欧比特严禁复制

Page 65: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

参数说明:

输入参数:

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

4.2.4 运行结果

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

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

代码清单 4-4 应用程序

/*

DESCRIPTION

Initialize user application code.

*/

欧比特严禁复制

Page 66: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

#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

USER_APPL_INIT; /* for backwards compatibility */

#endif

/* add application specific code here */

wrTimerAppInit();

}

将以上 VIP 工程编译生成 VxWorks 镜像文件后,通过 cygwin 下载到 S698-T 开发板中运

行。下载过程如下图所示:

欧比特严禁复制

Page 67: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-9 VxWorks Timer 运行截图

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

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

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

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

地址 预置数

0x80000300 预置数

0x80000304 预置数重载值

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

欧比特严禁复制

Page 68: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

0x80000308 配置寄存器

0x8000030C 未使用

0x80000310 定时器1 计数寄存器

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

0x80000318 定时器1 控制寄存器

0x8000031C 未使用

0x80000320 定时器2 计数寄存器

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

0x80000328 定时器 2 控制寄存器

图 4-10 显示内存值

4.3 CAN应用开发

4.3.1 工程配置

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

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

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

欧比特严禁复制

Page 69: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-11 添加 GRLIB OCCAN driver 组件

4.3.2 例程解析

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

数接口。

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

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

欧比特严禁复制

Page 70: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 3-12 can 应用编程流程图

Can 应用编程实例如下:

程序示例:

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

代码清单 4-5 应用程序

#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

*/

write() 发送数据

read() 接收数据

close() 关闭设备

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

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

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

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

open() 打开设备

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

欧比特严禁复制

Page 71: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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 72: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

}

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

//printf("rlen:%d \n",len);

if(len>0)

欧比特严禁复制

Page 73: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

{

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.3.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 74: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

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 75: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

(

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 76: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

4.3.4 运行结果

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

图 4-13 zlg-can 配置图

运行结果如下:

图 4-14 运行 VxWorks

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

欧比特严禁复制

Page 77: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

图 4-15 VxWorks 发送数据

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

图 4-16 zlg-can 接收数据

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

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

欧比特严禁复制

Page 78: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-17 zlg-can 发送数据

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

图 4-18 VxWorks 接收数据

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

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

欧比特严禁复制

Page 79: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

4.4 429 应用开发

4.4.1 工程配置

为了让编译的镜像文件具有 ARINC429 功能,需添加 ARINC429 组件,利用上述方法,

找到组件“LEON2 obt429 VxBus driver”,并将其添加,如图 4-19 所示。

图 4-19 添加 ARINC429 组件

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

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

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

0x40003000;“local memory address”修改为 0x40000000,如图 4-20 所示。再到“Project Explorer”

窗口中选择 A429Test 工程下的“S698-T”,双击打开目录下的 config.h 文件,修改

“ RAM_HIGH_ADRS ” 为 0x42003000 ;“ RAM_LOW_ADRS ” 为 0x40003000 ; 修 改

“LOCAL_MEM_LOCAL_ADRS”为 0x40000000。

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

欧比特严禁复制

Page 80: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-20 S698-T 的内存配置

编译整个工程,再通过 dsumon 调试器下载 VxWorks 映像到目标板上运行。

确保 S698-T 开发板上的 DSU 口和 UART0 已连接到 PC 机;先打开超级终端,打开相应

的串口,用于 S698-T 程序运行时的显示输出;再打开 cygwin 终端,进入工程目录,连接 dsumon

并将生成的 Image 文件下载进目标板。步骤如下:

$ dsumon -i -u

$ lo VxWorks

$ run

在超级终端上可以观察到运行 VxWorks 的运行结果,如图 4-21 所示。

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

欧比特严禁复制

Page 81: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-21 运行 VxWorks

4.4.2 例程解析

ARINC429 是普通 I/O 设备,设备打开、关闭通过标准 open( )、 close( )函数完成,数据

的收、发通过标准 wrtie( )、read( )函数完成,而通道的配置、选择等需要通过 ioctl( )函数完成。

由于 S698-T 中的 429 模块总共有 6 个通道:4 个接收通道、2 个发送通道。为了进行区分,

软件在进行收、发操作之前要先进行通道选定,以下分别是调用 ARINC429 驱动完成

ARINC429 数据收、发操作的一般软件流程。

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

欧比特严禁复制

Page 82: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-22 ARINC429 数据发送编程流程图

图 4-23 ARINC429 数据接收编程流程图

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

欧比特严禁复制

Page 83: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

程序示例:

以下示例调用 ARINC429 的驱动,完成 ARINC429 数据的发送、接收操作。示例需要新

建一个 VIP 工程,并在在 usrAppInit.c 文件中输入以下程序代码。

代码清单 4-6 测试应用程序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

Int fd429;

STATUS OBT429AppInit (void)

{

unsigned int tempbuf[100]= {0x11111111,0x22222222,0x33333333,

0x55555555,0x44444444,0x66666666,0x77777777};

unsigned int readbuf[100]= {0};

char i=0;

int len=0;

struct SendChannelParameter Scp;

struct RecvChannelParameter Rcp;

printf("----429 test start 2----\n");

fd429 = open("/OBT429/0", O_RDWR, 0);

printf("fd429:%d\n",fd429);

//------初始化发送通道-------

Scp.par_en = TRUE;

Scp.par_sel = EVEN;

Scp.mode25_en = TRUE;

Scp.baudrate = 12500;

Scp.fifo_level = 16;

Scp.tGap = 5;

if(ioctl(fd429,OBT429_IOC_INIT_SEND_CH1,&Scp)!=0)

{

printf("OBT429_IOC_INIT_SEND_CH1 fault\n");

}

//------初始化接收通道-------

Rcp.sdi_en = FALSE;

Rcp.sdi = 0;

Rcp.label_en = FALSE;

Rcp.par_en = TRUE;

Rcp.par_sel = EVEN;

Rcp.mode25_en = TRUE;

欧比特严禁复制

Page 84: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

Rcp.baudrate = 12500;

Rcp.fifo_level = 16;

Rcp.errorarp_en = FALSE;

IOCTL(fd429,OBT429_IOC_INIT_RECV_CH1,&Rcp);

IOCTL(fd429,OBT429_IOC_RECV_ENABLE,CHANNEL_RECV_01);

//------发送数据-------

//选择发送通道

if(ioctl(fd429,OBT429_IOC_SELECT_SEND_CH,(int)CHANNEL_SEND_01)!=0)

{

printf("OBT429_IOC_SELECT_SEND_CH fault\n");

}

printf("write data......\n");

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

{

write(fd429,(char *)&tempbuf[i],4);

}

//------接收数据-------

//选择接收通道

IOCTL(fd429,OBT429_IOC_SELECT_RECV_CH,CHANNEL_RECV_01);

printf("read now\n");

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

{

len = read(fd429,(char *)&readbuf[0],4);

if(len>0)

{

printf("d:0x%x\n",readbuf[0]);

}

len=0;

}

printf("429 test end \n");

}

在上述代码中,数组 tempbuf 是待发送的数据,第 15 行打开 429 设备;第 18~42 行初始

化接收、发送通道(仅使用发送通道 1 和接收通道 1);第 48~58 行选定发送通道 1 发送 tempbuf

欧比特严禁复制

Page 85: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

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

数组中的 20 个数据(帧),write 为单帧发送,由于每帧需要 4 个字节,故 write 的数据长度为

4;第 62~74 行选定接收通道 1 接收数据,同样为单帧读取,read 数据长度为 4。由于开发板

上通过连接线将发送通道 1 与接收通道 1 自环相连,理论上接收通道 1 将完全接收到发送通

道 1 发出的数。

4.4.3 接口说明

以下是上述代码中用到的两个重要的数据结构,分别是接收通道初始化参数和发送通道

初始化参数,详细说明见下列注释:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

//接收通道初始化参数

struct RecvChannelParameter

{

BOOL sdi_en; //SDI decode 使能

char sdi; //设置SDI

BOOL label_en; //LABEL recognition 使能

BOOL par_en; //奇偶校验使能

char par_sel; //奇偶校验选择(1:odd;0:even)

BOOL mode25_en; //1:25 位字模式使能;0:32 位字模式使能

int baudrate; //波特率

char fifo_level; //接收FIFO 的trigger level 值

char rLabel[12]; //接收label值

BOOL errorarp_en; //使能错误接收

};

//发送通道初始化参数

struct SendChannelParameter

{

BOOL par_en; //奇偶校验使能

char par_sel; //奇偶校验选择(1:odd;0:even)

BOOL mode25_en; //1:25 位字模式使能;0:32 位字模式使能

int baudrate; //波特率

char fifo_level; //接收FIFO 的trigger level 值

char tGap; //发送间隔

};

欧比特严禁复制

Page 86: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

4.4.4 运行结果

将编译好的 VIP 工程下载到 S698-T 上运行,结果如下图所示。

图 4-24 VxWorks gpio 测试

从程序输出结果中可以看出,接收通道 1 完全接收了发送通道 1 发出的 20 个帧数据,前

7 帧为非 0 数据,后 13 帧全 0;由于选择的是 25 位字长模式,接收到的数据与发送数组中的

数据存有差异,为(tempbuf[n] & 0X1FFFFFF),实际值与预期值完全相同。

另外还可以在 VxWorks Shell 中输入 devs 和 vxBusShow 命令来观察 ARINC429 硬件驱动

的挂载情况。

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

欧比特严禁复制

Page 87: OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册€¦ · 欧比特复制 OBT-BSP-VxWorks6.7 S698-T 平台应用开发手册 V2.0 珠海欧比特控制工程股份有限公司

欧比特严禁复制

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

图 4-25 ARINC429 硬件驱动

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

欧比特严禁复制