1 BF537结构特点
BF537是Blackfin家族的升级产品,其在标准Blackfin内核的基础上拥有更加丰富的接口,并在内部集成了一个以太网MAC控制器。BF537的内部结构如图1所示。
Blackfin内核包含2个乘/累加器(MAC),2个40位的ALU,4个视频专用8位ALU和1个40位移位器。运算单元处理来自寄存器组的8位、16位或者32位数据。每个MAC每周期可完成一个16位乘16位的乘法运算,并把结果累加到40位的累加器中,提供8位的精度扩展。ALU单元执行标准的算术和逻辑运算,由于2个ALU具备对16位或32位数据操作的能力,因此运算单元具备的灵活性可以满足各种应用中信号处理的要求。每个32位的输入寄存器可以作为2个16位的寄存器,因此每个ALU可以完成非常灵活的单16位算术运算。通过把寄存器当作2个16位的操作数使用,双16位或单32位操作可以在1个周期中完成。更好地利用第二个ALU,四个16位操作可以简单地完成,加速了每个周期的吞吐量。强大的40位移位器功能丰富,可以对数据进行移位、循环移位、归一化、提取和存储等操作。运算单元所使用的数据来自具有16个16位操作数或8个32位操作数的寄存器组。
同时BF537把存储器视为一个统一的4 GB的地址空间,使用32位地址并采用分级的存储器结构。Level(L1)存储器一般以全速运行,没有或只有很少的延迟。Level 2(L2)/Level 3(L3)分布在片内或片外,对它的访问会耗费多个处理器周期。在L1级,指令存储器只存放指令,2个数据存储器存放数据,一个专用的临时数据存储器存放堆栈和局部变量信息。在L2/L3级可以存放指令和数据。
2 双冗余以太网构建方案
从硬件角度看,以太网接口电路主要由MAC控制器和物理层接口(PHY)两大部分构成,本文从是否具备独立的MAC控制器出发提出了两种不同的构建双冗余以太网的方案。
2.1 基于独立MAC控制器的设计方案
上文中提到,BF537在内部集成了一个支持IEEE802.3 MAC控制层协议的MAC控制器,只需要在外部外接一个以太网接口芯片,便可以形成一个完整的以太网通道。因此本文选择了SMSC公司的LAN8187,它提供了标准的MII总线接口,可以方便地与BF537相连接,连接方式如图2所示。其中在MII总线上进行数据的收发,MDC和MDIO则用来完成对接口芯片LAN8187寄存器的读写。本文在下面称由BF537的MAC控制器与物理层接口芯片LAN8187构成的以太网通道为主网络通道。
如果要求双冗余网络通道拥有独立的MAC控制器,则需在BF537外部扩展一个以太网控制器,见图2,选择同样来自于SMSC公司的LAN91C-111,通过BF537的外部总线与之相连。选择LAN91C111的16位总线工作方式,其A0~A15与BF537的地址总线相连,DO~D15与BF537的数据总线相连,并由BF537的AMS信号控制LAN91C111的片选,外部PF管脚来响应来自LAN91C111的中断请求。
具有独立MAC控制器的双冗余以太网的设计方案如图2所示。
2.2 基于共用MAC控制器的设计方案
从应用角度分析,即使系统拥有独立的MAC控制器,在实际应用中也需要要求两个MAC控制器拥有相同的物理地址,因为若MAC地址不同,冗余切换将引起协议层中ARP绑定表的变化,重新映射ARP表中物理地址和IP地址之间的关系将增加冗余切换的时间,影响到网络通信实时性。
因此本文提出了一套MAC控制器,两个以太网接口芯片的方案。该设计方案通过一片CPLD将BF537的MII总线分别转接到两片LAN8187上,并由BF537来控制转接的时机,如图3所示。这样形成了两个以太网通信通道,大大简化了设计,提高了冗余切换的实时性。
3 冗余切换软件设计
3.1 网络状态监测
冗余切换的实现首先在于对网络实时在线监测,本文中检测的方法基于LAN8187的寄存器。LAN8187寄存器定义如表1所示。其中,Basic Control Register为基本控制寄存器,通过配置其各位,可以完成芯片软复位、lO/100 MHz选择、全双工/半双工选择、LookBack模式选择、自协商等功能。Basic Status Register为基本状态寄存器,对其查询可以得到自协商结果、网络物理连接状态等网络基本状态。PHY Identifier 1/PHY Identitier 2两个寄存器标识了芯片的Chip ID。
因此,对网络状态的实时监测实际上就是实时读取Basic Status Register,并对结果做出判断。
3.2 程序设计
可以通过操作BF537的寄存器EMAC_STAADD完成其对LAN8187寄存器的读写。
对LAN8187寄存器读写的函数定义为:
u16 RdPHYReg(u16 PHYAddr,u16 RegAddr);
void WrPHYReg(u16 PHYAddr,u16 RegAddr,u32 Data);
其中PHYAddr为芯片的物理地址,RegAddr为寄存器地址。
对Basic Status Register的监测采用轮询的机制,即设定一个信号量Link_status,其周期为2ms,因此每隔2 ms,Ether_moniter线程被触发一次。在Ether_moniter中通过调用RdPHYReg()函数,读取Basic Status Register的值,并判断Link位。
对于设计方案1来讲,当检测到需要进行网络切换时,需要停用当前网卡初始化备用网络LAN91C111并设定相同的lP地址以及MAC地址。对于方案2,则只需要通知CPLD将通道切换至备用的LAN8187接口。
4 冗余切换测试
用Visual C++6.O开发简单的上位机测试程序,每隔1 ms发送一个UDP数据报,并给每个数据报编写不同的序号。在BF537中编写程序不断接收上位机发来的数据报。然后制造网络通信故障,本文构建的冗余网络将会自动切换到备用通道继续接收上位机的数据报。最后通过检测接收到数据报的序号来确定冗余切换所消耗的时间。分别对两种方案所构建的冗余网络的切换进行测试,结果如表2所示。
从实验结果可以看出方案2具有快速切换的优点,丢包率低;方案1平均丢包数远大于方案2,并且切换时间长。
5 结语
提出了两种基于BF537构建双冗余以太网的方案,分别论述了其原理、器件选择、连接方法,并做出软件设计。最后经过测试,方案2的切换效果和时间非常理想,最终在实际项目中得到了应用。