CPCI总线的分布式系统设计应用
据传输流程如图2所示:
图2 数据传输流程图
3. 关键技术
3.1 报文存储的“抽屉机制”
系统中各板卡共用一条CPCI总线,我们提出基于“抽屉机制”的报文存储策略,以保证板卡间数据无干扰传输。在板卡加入系统的初始化阶段,系统板为总线上每块板卡分配独立的PCI总线地址区间,其他板卡向其发送数据时将数据写往指定地址区域。一块板卡会接收来自不同板卡的数据,为避免各板卡往同一基址发送数据所引起的干扰,同一板卡地址区域内又为其他板卡分配大小相同的独立读写空间,我们将它命名为“抽屉”。这样来自某板卡的数据会被送到其对应“抽屉”,每次数据依序存放而非覆盖,以保证板卡数据处理时间。当数据长度超出抽屉剩余空间时,则似环状buffer从头开始存放。“抽屉机制”如图3所示,左边方块代表总线上不同板卡,右边则是PCI总线地址空间。板卡B对应地址范围从a点到e点,其中ab点之间空间仅用于板卡A向B进行数据传送,bc点之间空间仅用于板卡C向B进行数据传送,以此类推。
图3 板卡数据接收“抽屉”
基于这种报文存储机制,我们定义几种地址表来维护数据传输相关地址信息。系统板上维护有静态的基址表,记载为每个卡槽上板卡预先分配的基址。所有板卡上都维护有板卡地址映射表和传输地址偏移表。板卡地址映射表为一个结构数组,数组中各项分别代表一个卡槽,里面包含板卡名称、卡槽号、基址和地址范围等地址信息以供数据传输时配置所用,其数据结构如下:
typedef struct _BUS_ADDR_MAPPING_INFO{
char board_name[BOARD_NAME_LENGTH];
int slot_number;
unsigned long base_addr;
unsigned long range;
}BUS_AddrMapping_Info, *P_BUS_AddrMapping_Info;
传输地址偏移表为一无符号整型数组,用于记录板卡间数据传输时各板卡的地址偏移,初值均为零,每次传输完毕,接收板卡的地址偏移就增加当次数据传输长度,当地址空间不足以存放即将传输的数据时,则将偏移地址设为零,重新从区域起始处写入。其数据结构定义如下:
u32 current_offset_table[NUM_OF_SLOT] = {0,0,0,0,0,0,0,0};
3.2 数据传输实现
我们定义了一种数据结构IPH(Internal Packet Header),包含数据类型、长度、来源卡槽号等属性,在传输数据前作为包头对报文进行封装,以便接收方解析包头后能根据数据业务类型区分处理。主要IPH类型有板卡配置信息,端口注册信息,路由信息,未知数据类型等。定义数据结构iph_attr区别不同IPH_info类型,位于数据包首,其数据结构如下:
typedef struct _IPH_ATTR {
u32 board_id; /*from which board*/
int iph_type; /*datagram type*/
unsigned long length; /*datagram length(without IPH)*/
}IPH_ATTR, *P_IPH_ATTR;
针对各种类型IPH信息又分别定义不同数据结构,在数据包头中依次存放于iph_attr结构之后。
发送数据时,对数据进行IPH封装,根据前述的板卡地址映射表选择目的PCI地址,再调用总线接口函数完成数据传输。发送方通过写接收板卡桥芯片的mailbox寄存器,将传输地址及数据长度信息通知接收方,产生中断触发接收。PLX桥芯片支持local总线对PCI总线的直接访问,它有8个mailbox寄存器,前四个能产生中断,每个mailbox32位,传输地址和数据长度信息分别使用mailbox i 和mailbox i+4配合工作,这样接收方收到两个参数时会产生一次中断,进行数据接收[5]。这种机制使接收处理具有四个服务窗口,提高了系统吞吐量。
接收板卡PLX芯片的mailbox被写入参数即产生本地中断检查 “抽屉”,产生中断前,数据实际上已被发到目标板卡上了。中断服务程序为接收端维护一个数据队列,它读取mailbox中的信息,分析地址
- 基于FPGA的雷达回波实时模拟器的实现(07-10)
- LT3751如何使高压电容器充电变得简单(08-12)
- 三路输出LED驱动器可驱动共阳极LED串(08-17)
- 浪涌抑制器IC简化了危险环境中电子设备的本质安全势垒设计(08-19)
- 严酷的汽车环境要求高性能电源转换(08-17)
- 适用于工业能源采集的技术 (08-10)