在VxWorks平台下PCI设备的驱动程序的开发

更新时间:2019-10-16 来源:工程论文 点击:

【www.rjdtv.com--工程论文】

摘要


    引 言

  时统卡作为时统终端之一,可以输出 UTC(Coordinated Universal Time)时间和精确的位置信息,在航海、航空、武器装备等领域中,作为授时定位功能模块,作用非常大,得到了广泛的应用。PCI 总线是一种为主 CPU 及外设提供高性能数据通信的局部总线,以高性能、高效率以及与现有标准的兼容性被计算机界认为是最具发展潜力的局部总线标准[1].采用标准 PCI 总线接口的时统卡,能为计算机提供高精确度的时间和位置信息,并有多路时间信号输出功能。

  VxWorks 是由美国 WRS(Wind River Systems)公司开发的一种微内核高性能可裁剪的嵌入式实时操作系统[2],它以其良好的可靠性和卓越的实时性被广泛地应用在航空、航天、武器装备等高精尖技术及实时性要求极高的领域中。在 VxWorks操作系统下进行软硬件开发需要解决的关键是如何为 PCI 设备编写高效可靠的驱动程序。所以本文结合作者关于 PCI9052 时统卡的开发实例探讨了在VxWorks平台下PCI设备的驱动程序的开发。

  1 时统卡硬件组成框图

  时统卡的硬件组成框图如图 1 所示,它主要由 B(DC)码译码电路、GPS 接收机、CPU 主控和PCI 接口电路组成。

  PCI 接口电路是计算机 PCI 总线和 CPU 主控通信的桥梁,由 PLX9052 接口芯片和 93LC46B 串行 E2PROM 组成。93LC46B 串行 E2PROM 保存PLX9052 的配置信息,当通电时,PLX9052 读取该配置信息对各寄存器进行配置。PLX9052 采用 8位局部数据总线,通过 FPGA 双口 RAM 与 CPU交换数据。

  B(DC)码转换电路是将输入的 RS-422 信号转换为 HCMOS 信号,再送到输入选择电路。GPS接收机接收并解调 GPS 信号,通过串口将信息(包括经度、纬度、高度、速度等)和时间数据传输给 CPU,经 CPU 处理后通过总线传输给 FPGA 进行锁存。输入选择电路受 CPU 控制,用户通过驱动程序函数来选择输入信号,CPU 通过解码程序解调出 B 码时间信息和秒信号。再将时间信息保存并发送 FPGA 锁存器中,解调秒送到分频链,使内部时钟信号与之同步。

  2 VxWorks下驱动程序架构

  VxWorks 驱动程序的编写与 BSP 有着密切的关系。板级支持包(board support package, BSP)是个软件抽象层, 位于硬件和上层软件之间, 为上层软件提供与特殊硬件无关的统一操作接口。

  VxWorks 提供的大部分功能模块是与硬件无关的,比如网络协议栈、Task 调度管理、I/O 系统和文件系统等, 图2 表示了VxWorks 和上层应用程序是如何与硬件保持无关性的。

  VxWorks 内核诸多功能模块通过标准接口控制并影响底层硬件动作。因此BSP 是VxWorks 中与硬件相关的一部分代码。BSP 作为与硬件相关的中间层次,使得独立于硬件的上层软件可以进行通用控制。对不同的目标系统及其环境中的设备,用户可以通过修改和重写BSP 完成设备驱动程序,实现对硬件的配置和访问。在实际应用中, 为了更好的稳定性和执行效率, 许多设备驱动程序会直接和应用程序捆绑在一起, 而不是由操作系统来管理。

  VxWorks 下提供了与 PCI 设备操作相关的一些 API 函数, 通过调用这些 API 函数就可以十分方便地完成对 PCI 总线设备的查找和配置。针对 PCI 设备驱动模块,驱动程序的主要开发步骤如图 3 所示。

  3 时统卡驱动开发详细设计

  3.1 初始化程序

  初始化程序是 PCI 设备驱动程序开发最重要的环节,初始化过程必须在系统为所有设备分配内存完成以前进行,否则将无法为 PCI 设备分配一块内存空间。初始化函数包括获取 PCI 设备信息、内存映射以及中断链接 3 部分。

  1)获取 PCI 设备信息

  VxWorks 系统上电后,BIOS 会自动配置 PCI设备,分配中断号。VxWorks 系统的 BIOS 在启动时会有一个界面列出找到的 PCI 设备及 vendorID、device ID、设备类型、分配的中断号等信息。

  初始化函数首先根据设备 vendor ID 和device ID 利用函数 pciFindDevice()找到对应的设备,根据 Vendor ID、Device ID 和相同设备顺序号(一个系统中可能有多张相同板卡)来扫描总线, 找出设备所在的 Bus No、Device No 和 FuncNo.然后根据总线号、设备号和功能号调用pciConfigInLong()及 pciConfigInByte()函数确定设备的寄存器基地址以及中断号。再把基地址与 I/O屏蔽位相与得到真正的板上内部寄存器基地址。

  2) 内存映射

  VxWorks 提供了标准的 MMU(内存管理单元),使得用户可以使用 MMU 来分配 PCI 设备的内存空间。在明确基地址和内存空间大小后,调用函数sys- MmuMapAdd()函数即可将内存空间配置到 MMU.

  3) 中断链接

  VxWorks 中使用 intConnect()链接中断服务程序(ISR),但对于 PCI 设备,一般采用 pciIntConnect()挂接中断, 它与 intConnect() 的主要不同在于 intConnect() 使用的中断向量是独占的,而 pciIntConnect()则可使多个外部中断共享一个中断向量。pciIntConnect()定义在 pciIntLib.c 中,使用时应包含头文件 pciIntLib.h.应注意 ventor是中断矢量,需通过 INUM_TO_IVEC 换算获得。

  它在内部使用一个链表管理多个 ISR,发生中断时,链接在一个链表上的各个 ISR 被依次调用,pciIntConnect()要求每个 ISR 被调用时,应该首先查询是否为自己的设备产生的中断,不是则应立即返回,以继续调用其他 ISR.

  3.2 中断服务程序

  中断处理是实时系统设计中的关键环节,系统通过中断与外界交互。为了获得尽可能快的响应时间,因此中断处理不应涉及任何任务的上下文切换,VxWorks的中断处理程序应运行在特定的上下文中,也就是在所有任务的上下文之外。

  数据处理任务可以同步一个数据接收中断数据处理任务运行后,执行semTake()操作,将信号量初始化为不可用状态的二进制信号量,等待数据到来;数据接收中断上报后,运行ISR(中断服务程序),执行semGive()操作,释放该二进制信号量,使得数据处理继续执行,处理收到的数据。

  在VxWorks系统下使用pciIntConnect()函数将中断和特定的C程序连接起来后,该函数将指定的C函数与指定的中断向量相联系,函数的地址将存储在这个中断向量里。当中断发生时,系统将调用这个特定的C 程序函数,即中断服务程序。

  中断服务程序负责协调系统的数据读写任务,在系统设计时采用信号量的方式实现任务间的同步,因此中断服务程序非常简单,只要给出和特定的中断事件的信号量即可。

  PCI设备中断响应中值得注意的一点是PCI接口芯片的寄存器序列中提供了中断控制/状态寄存器,偏移地址为0x4C,该寄存器可以使能和禁止PCI 总线的中断,因此,在进行中断服务程序的配置时,必须设定该寄存器的内容,否则系统不能正常的响应中断。

  3.3 功能函数

  时统卡设备功能函数有很多,目前实现了输入输出信号选择、读取工作状态、读取时间数据以及读取 GPS 的经纬度、高度、速度等信息的功能函数。这里以读取 PCM 数据函数为例,当二进制信号量 SEM_INT_pcm_ready 处于可用状态,利用函数 semTake()获取二进制信号量,获取被SEM_INT_pcm_ready 保护起来的临界资源。详细过程:

  1)等待二进制信号量为可用状态时,获取该二进制信号量,得到被它保护起来的临界资源;

    2)按照字长,帧长格式要求读取 PCM 数据;

    3)复位 PCM 中断状态寄存器中该中断对应的位,即清除中断,等待下一次中断;

    4)复位 PCM 中断屏蔽寄存器中该中断对应的位,即将其置 1,重新打开该中断屏蔽,准备响应下一次中断。

  4 测试结果

  4.1 GPS 信号输入

  为了验证所设计软件系统的正确性,首先将GPS 天线连接到时统卡的相应输入端,然后通过软件设置其输入信号为 GPS,输出信号为 1pps,并打开其 1pps 中断,即可通过软件读取状态、卫星数、GPS 时间数据、经度值、维度值和海拔值等。其中读取的 GPS 时间数据如表 所示,读取的时间数据与真实值相符,说明了设计的正确。

  4.2 B(DC)信号输入

  首先将时统终端的 B(DC)码信号连接到时统卡的相应输入端,然后通过软件设置其输入信号为 B(DC)码,即可通过软件实时读取时统卡的时间数据。在 1PPS 秒脉冲中断服务程序中,读取的时间数据如表 所示。测试结果表明:所设计的软件系统能正确读取时统卡的 B(DC)码时间数据,实现了预期的设计功能。

  综上所述,通过 GPS、B(DC)码为时统卡授时,所设计的软件系统均能正确读取时统卡的时间数据,实现了预期的设计要求。

  5 结论

  结 合 时 统 卡 驱 动 程 序 的 研 究 , 本 文 对VxWorks 操作系统下 PCI 设备驱动程序的核心问题进行了探讨,给出了一套行之有效的驱动程序编写方法,并针对 PCI 设备为外设与主存之间实现高速数据传输提供了一个高效的途径。本研究在 VxWorks5.5 环境下,设计的时统卡驱动程序已经在某控制系统中得以实现。

  参 考 文 献

  [1] 周启平, 张扬。 VxWorks下设备驱动程序与BSP开发指南[M]. 北京: 中国电力出版社, 2004.

  [2] 喻卫东, 陈春霞, 邵其森。 VxWorks 下 PCI 1553 板驱动程序的开发[J]. 计算机工程, 2002, 28(12): 242-243.

  [3] 黄 振中, 柴小丽, 黎想 , 等 . 基 于 VxWorks 的PCI-RapidIO 桥驱动设计[J]. 计算机工程, 2010, 36(4):239-240.

  [4] 宣丽萍, 王晓龙, 邱辉。 VxWorks 系统中 PCI总线仪器驱动程序开发方法[J]. 电子测量与仪器学报, 2010,24(9): 860-865.

  [5] SHIN M J, KIM S J, SON Y, et al. Development of aVxWorks-based distributed power quality monitoringsystem [J]. Power and Energy Systems. 2007:539.

  [6] AN J SH, LIU Y Q, SUN H X. Implementation of anembedded system based on VxWorks[J]. Computerengineering and Applications. 2007.

本文来源:http://www.rjdtv.com/gongchenglunwen/1643.html