一种PCI板卡Xpc驱动程序的设计与实现
   来源:中国科技博览     2021年03月24日 22:21

李冠林

[摘 要]为满足某浮空器半实物物理仿真实验的需求,编写Xpc系统环境下的PCI板卡驱动,以便仿真系统可以通过PCI板卡顺利的收发数据。

[关键词]半实物物理仿真 xPC PCI驱动程序

中图分类号:TP393.08 文献标识码:A 文章编号:1009-914X(2016)01-0293-01

引言

xPC是基于RTW(Real-Time Workshop)的实时仿真和开发平台,可以将x86等计算机或PC兼容机转换为实时操作系统,其采用“双机”模式实现产品原型开发和系统的测试。宿主机运行simulink完成仿真系统模型开发,通过网线将模型加载到目标机上;目标机启动时加载实时内核,该实时内核保证仿真系统高效的运行[1],如图1所示。

一.xPC驱动模型

xPC目标机支持ISA总线和PCI总线的I/O设备,飞艇仿真模块采用PCI总线的ARINC429通讯卡。xPC 驱动程序文件即为由C语言编写函数组成的S-functions文件,主要由初始化模块、执行模块和结束模块组成,如图2所示。

初始化模块包括由mdlInitializeSizes函数,mdlInitializeSampleTimes函数和mdlStart函数组成,mdlInitializeSizes函数和mdlInitializeSampleTimes函数主要负责输入输出参数初始化、状态量初始化和系统采样时间的初始化,mdlStart函数负责I/O设备初始化;执行部分根据仿真模型,完成相应的任务,执行部分功能集中在mdlOutputs 函数,该函数在负责PCI设备的读写操作;结束模块功能函数为mdlTerminate,在运行结束后,负责释放相关资源,使I/O设备安全退出。

二.xPC驱动程序关键技术

1.PCI设备卡基地址

xPC Target启动时,PCI总线驱动被加载,BIOS扫描挂接在PCI总线上的I/O设备,并为PCI设备分配合理的I/O空间地址、物理地址和中断号等资源,无需用户在驱动程序中为PCI设备申请相关的资源,驱动程序通过厂商标识(Vendor_ID)和设备标识(Device_ID)来获取PCI设备的配置空间信息,代码如下:

rl32eGetPCIInfo(Vendor_ID,Device_ID,&pciinfo);

pciinfo 是一个结构体变量,结构如下:

{

unsigned long BaseAddress[6];

unsigned short AddressSpaceIndicator[6];

unsigned short InterruptLine;

}

BIOS为每个PCI设备提供了6个基址,其中有部分基址是无效的,通过rl32eShowPCIInfo函数确定有效基址。PCI设备映射分为I/O映射和内存映射,驱动程序可以通过pciinfo中的AddressSpaceIndicator属性值来确定PCI映射类型。若PCI设备为内存映射,AddressSpaceIndicator属性值0;若PCI设备为I/O映射AddressSpaceIndicator属性值1。ARINC 429通讯卡为内存映射,pciinfo结构中的基址BaseAddress必需通过函数rl32eGetDevicePtr 转化成虚拟地址,然后用C语言的指针访问相应的虚拟地址,代码如下:

bar2Base = (char *)rl32eGetDevicePtr((char*)(pciinfo.BaseAddress[2]),

4096,RT_PG_USERREADWRITE);

*(bar2Base)= 0x12;

2.编译器优化处理

编译器往往会优化内存,将内存变量缓存到寄存器。当驱动程序进行写操作,volatile关键词提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量有别的程序更新了的话,将出现不一致的现象,该驱动将寄存器地址值都用volatile关键词进行修饰,以此避免寄存器内值不能及时更新的问题。

typedef struct

{

volatile uint32_T * txFifo_0; //pci429 发送通道fifo

volatile uint16_T * bps_sel; //dei1016波特率控制

volatile uint8_T * recEn; //8路接收使能

}Regs_429;

3.驱动程序的初始化

设备驱动初始化主要包括发送端初始化和接收端初始化两部分,发送端初始化主要由发送FIFO端口初始化和命令状态寄存器初始化两部分组成,接收端初始化主要由接收FIFO端口初始化、命令状态寄存器初始化和中断方式寄存器初始化三部分组成,如图3所示。

总结

驱动程序通过接触编译器优化,保证驱动程序在读写数据的一致性,确保驱动程序在每次读取相关寄存器值的正确性,保证了浮空器半实物物理仿真平台的实时性通信,满足平台需求。

参考文献

[1] 宋炜,祖家奎.基于x P C 目标的实时I/O接口技术研究[J].计算机应用,2008,27(1):62—65.

文章 初始化 函数