QNX操作系统的网络交换机驱动设计
2021-07-20傅迁
◆傅迁
(辽宁广播电视大学丹东分校 辽宁 118000)
随着持续的智能化电力系统不断发展,对自动化设备的通信技术提出了更高的要求。在要求稳定可靠的通信同时,它还需要尽可能多的网络接口以及冗余的通信接口。传统的通信中,模块通常使用特定于CPU 的MAC 控制器以及独立的PHY 来进行网络通信。受到资源的桎梏,CPU 通常仅设计有两个MAC 控制器,从而对扩展通信网络的端口产生了限制。通过网络交换芯片的88e6060 来设计具有五个或更多网络端口的通信模块比较容易,并且可以最大限度地满足。电源系统关于通信的要求。
1 QNX 系统概述
QNX 是一种类似于UNIX 的操作系统,也是实时的分布式操作系统。它通过特定微内核的结构,可以通过内核来、进程通信、底层的网络通信以及中断处理,所以具有较小的内核以及较快的运行速度。把内核中存储的地址空间和文件系统、网络协议、应用程序以及驱动程序中存储的地址空间分开。应用程序难以对内核的空间进行直接的访问。由于此类微内核的结构较为封闭,外部模块故障对内核不能造成影响,大幅度地提升了系统的稳定性。此外,QNX 支持扩展以及调整,并且可以根据用户需求对各种功能的模块进行定制,以开发灵活的嵌入式模块。
2 QNX操作系统的网络交换机驱动设计的原理
通信模块通过AM3352 作为主控制的CPU。这是在ARM Cortex-A8 内核的微处理器基础上,支持720MHz 的高主频率,具有1600 DMIPS 的高计算能力,并且外围的接口较为丰富。可以与DDR3结合使用以支持NAND 闪存以及eMM 的高容量。图1 显示了CPU和交换芯片之间连接情况。交换芯片是10/100 BaseT 的网络收发器。端口P5 可以设计为以MII-PHY 模式连接到CPU。P0 到P4 可以与录波器、DCS、信息子系统站以及其他网络进行通信。
图1 CPU 和交换芯片之间连接情况
3 QNX操作系统网络交换机驱动程序设计
3.1 QNX 基础上网络驱动程序的层次结构
QNX 网络模块的实际使用分层的机构。网络设备的驱动程序模块位于最低级别,受到io-pkt 的管理以及调度,需要将数据的发送、传递以及接收情况向io-pkt 报告。中间层作为顶层以及底层之间搭建的数据桥,并为协议模块提供较为一致的接口。顶层的资源管理器允许Socket API 调用的read、write 以及open 以及其他函数。利用读取应用程序层将数据发送给io-pkt,并利用read 的应用程序层将源于io-pkt 的数据进行接收,利用write 这一应用层将数据发送给io-pkt,而io-pkt 用于进行UDP、TCP、IP 这类的网络传输协议。
3.2 QNX 中网络交换机驱动的方法以及原理
3.2.1 初始化模块的设计
初始化模块映射寄存器的地址空间,对寄存器进行配置,并向系统提供寄存器的中断处理、数据包接收以及数据包发送等功能。这使系统能够识别网络设备,可以与网络通信。最后,使用io-pkt 对数据包发送、接收进行调用。程序先要清除TX_HDP 以及RX_HDP,把CPPI 空间的前4KB 分给接收队列的描述字Rx_Descriptors,并将最后4KB 空间用于发送队列的描述字Tx_Descriptors。 Rx_Descriptors是使用以下结构界定的数组。它的Next 指向接下来的Rx_Descriptor,其Buffer 指向存储数据主体储存的RAM 空间,off_len 将有效数据的长度存储在Buffer 中。flag_len 对数据包的有效长度以及缓冲区的状态信息进行存储。
为Rx_Descriptor 建立单一方向的链接列表,以便RX_HDP 能指向链接的列表开头。列表详见图2。
图2 接收队列链表图
建立队列的描述表之后,驱动程序必须调用设备的函数dev_attach,以将网络设备 dev 分配给每个端口。必须为结构iopkt_inter 对中断使能函数以及中断处理的函数进行定义,并最终在io-pkt 中注册名为ether_ifattach、if_attach 以及interrupt_entry_init 的函数。
将IP 地址对MAC 地址进行映射,实现网络中网络设备的MAC地址是唯一的。初始化的程序进行配置文件的读取,并得到每个网络设备具有的IP 地址。接下来,将MAC[3:0]调整成IP[3:0],以对网络设备的IP 地址以及MAC 地址进行同步。
在正常工作中,电网通信的特征大体是流量较小,但突发的流量大。通过网络发送具有各种特征的数据包会产生各种的流量特点。不正确的网络配置可能导致不正确的数据包传输、网络风暴以及网络通信系统运行异常。所以,通信设备需要一项功能,可以抵御网络的风暴。所以,能够将AM335X 的INT_CONTROL 以及RX_IMAX 寄存器配置为限制每毫秒可接收到的中断数。可以控制发生风暴时消耗的系统资源,并在风暴消失之后对通信的功能进行快速地恢复。
下一步要对DMA 引擎进行配置,打开DMA 的发送以及接收使能,并中断使能DMA 中。最后,利用SMI 配置交换机的芯片,并将PHY 配置为自动协商操作的全双工速率这一模式。为了实现网络通信具有多个的网络端口,应根据表1 对交换机路由表进行配置。
表1 VLANTable 的设置情况
配置成功之后,便呈现图3 中连接情况。P0 至P4 与P5 是双向的连接状态。P0-P4 的接口收到源于外部的请求之后,经由P5 接口将这些数据传输到CPU,CPU 完成处理后,P5 接口把数据传输到请求的端口。
图3 路由图的连接情况
3.2.2 中断处理的设计
在网络数据到达的时候,DMA 控制器将数据放置在外部的缓冲区中,并且CPU 对Rx_descriptor 中的flag_len、off_len 以及Buffer区域进行更新。此外,中断控制器生成一个中断的信号,然后io-pkt对该中断进行接管,并间接地调用驱动程序中的函数process_interrupt。使用函数process_interrupt 调对函数Receive=进行调用,并完成数据的接收。
3.2.3 接收数据的设计
接收函数利用接收队列的描述字,进而得到有效的数据长度,并使用该长度来对接收到的mbuf 数据链的mlen 以及m_pkthdr.len 域进行更新。利用RMMI 从P5 接口接收的数据是带有标记的帧,在尾部带有4 字节的定制标签,进而在将数据发送给io-pkt 之前必须删除其标签。在mlen 上执行减号4 的运算,同时通知源于哪个网络接口的io-pkt 数据。标记帧的定制标签的DPV[5:0]指示数据所源自的端口。可以使用DPV[5:0]对与网络设备dev 有关的common_ecom[]的数组成员进行确定。对网络接口ifnet 进行确定并将ifnet 参数在ip_input中传递,所以io-pkt 明白数据来自的网络接口以及响应数据将到达的网络接口。
3.2.4 发送数据的设计
启动iif_start 这一分组传输的函数需要经过io-pkt,并将响应数据发给有关相的网络接口。因为P5 接口设计为egress trailer 的模式,所以驱动程序必须在响应数据的末尾之处添加一个tailer 标签,具体为4 字节。所以,数据区域m3 通过m_get 函数对数据区m3 进行分配,用于tailer 标签的存储。可以经由if_start 函数中ifnet 这一参数,确定其网络的设备。网络设备当中,device_index 成对设备的ID 进行存储,设备 ID 是数据发送到的端口序号。将 1 向左移动device_index 位之后,然后将其写入m3 中的m_data 数据成员中。要告知88e6060 将数据发送到何处,把m3 与m2 的末尾进行链接,进而创建链接列表。由于添加了tailer 标签(大小为4 个字节),需要将成员m1 当中的m_pkthdr.len 一直增加到4。最后,对发送队列的描述字进行更新,将发送队列描述字的起始地址写入TX_HDP,并启动TXDMA 进行数据的发送。
4 结语
交换芯片88e6060 允许轻松、方便地对网络的接口进行扩展,以实现电力系统中自动化设备具有多个通信端口。88e6060 设计的通信模块已完成实际测试。它的网络通信稳定、可靠并且能对抗网络的风暴。将其用在电力系统领域,可以确保电力系统的性能稳定。