1. 双网口配置的必要性与应用场景
在实际的嵌入式网络设备开发中,单网口往往无法满足复杂的网络架构需求。比如工业控制系统中,可能需要一个网口连接内网用于设备管理,另一个网口连接外网进行数据通信;或者在某些高可用性场景中,双网口可以实现冗余备份,提高系统可靠性。Zynq 7000系列芯片本身集成了两个千兆以太网控制器(GEM0和GEM1),这为双网口配置提供了硬件基础。
我在多个项目中遇到过需要双网口的情况,比如最近的一个智能网关项目,要求同时接入办公网络和工业控制网络,且两个网络需要完全隔离。通过配置Zynq 7000的双网口,使用NetX协议栈创建两个独立的IP实例,完美实现了这个需求。这不仅节省了额外的硬件成本,还简化了系统架构。
2. 环境准备与基础工程搭建
在开始双网口配置之前,你需要确保已经有一个可以正常运行的ThreadX+NetX基础工程。如果你还没有完成NetX组件的移植,可以参考官方提供的Zynq 7000移植示例(通常在threadx-xxxx\ports\cortex_a9\gnu\example_build目录下)。
首先检查你的硬件设计是否正确配置了两个以太网接口。在Vivado中,需要确保:
- 两个GEM控制器都已使能
- PHY芯片的时钟和复位信号正确连接
- MDIO总线配置正确(两个PHY可以共享同一个MDIO)
我在第一次尝试时犯过一个错误,没有在硬件设计中使能GEM1,结果调试了半天才发现根本找不到第二个MAC控制器。所以特别提醒:硬件设计是基础,一定要先确认两个网口在硬件层面都是可用的。
工程目录结构应该包含以下关键文件:
project_root/
├── application/
│ ├── demo_netx_duo_ping.c
│ └── tx_application_define.c
├── drivers/
│ ├── nx_driver_zynq.c
│ ├── nx_driver_zynq.h
│ ├── nx_driver_zynq_mac1.c (将要添加)
│ └── nx_driver_zynq_mac1.h (将要添加)
└── threadx/
└── ports/
3. 顶层应用程序的修改
3.1 全局变量声明
要实现双IP实例,首先需要为第二个网口创建一套完整的NetX对象。在demo_netx_duo_ping.c文件的开头部分添加以下代码:
#ifdef USE_MAC1
/* 定义第二个网口的NetX对象 */
NX_PACKET_POOL pool_1;
NX_IP ip_1;
/* 定义第二个IP线程的栈空间 */
ULONG ip_thread_stack1[2 * 1024 / sizeof(ULONG)];
/* 定义第二个包池的内存区域 */
ULONG packet_pool_area1[(1536 + sizeof(NX_PACKET)) * 100 / sizeof(ULONG) + 8]
__attribute__ ((aligned (32)));
/* 定义第二个ARP缓存区域 */
ULONG arp_space_area1[1024 / sizeof(ULONG)];
/* 声明第二个网口的驱动函数 */
VOID nx_driver_zynq_mac1(NX_IP_DRIVER *dri

186

被折叠的 条评论
为什么被折叠?



