免责声明:
本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。
读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。
本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。
若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。
前言
本期,小编将带领大家了解vitis提供的Iwip udp perf client工程
一、ZYNQ配置
勾选一个GEM即可,若器件为ultrascale系列,则需要打开定时器(TTC)如下图:
二、配置 Support package
添加IWIP
三、创建Iwip udp perf client工程
四、参考程序
#include <stdio.h>
#include "xparameters.h"
#include "netif/xadapter.h"
#include "platform.h"
#include "platform_config.h"
#include "lwipopts.h"
#include "xil_printf.h"
#include "sleep.h"
#include "lwip/priv/tcp_priv.h"
#include "lwip/init.h"
#include "lwip/inet.h"
#include "xil_cache.h"
extern volatile int TcpFastTmrFlag; // 快速定时器标志位,用于触发 lwIP 内部定时器
extern volatile int TcpSlowTmrFlag; // 慢速定时器标志位
#define DEFAULT_IP_ADDRESS "192.168.1.10" // 默认 IP 地址
#define DEFAULT_IP_MASK "255.255.255.0" // 默认子网掩码
#define DEFAULT_GW_ADDRESS "192.168.1.1" // 默认网关地址
void platform_enable_interrupts(void); // 启用硬件中断
void start_application(void); // 启动 UDP 应用程序
void transfer_data(void); // 数据传输逻辑
void print_app_header(void); // 打印应用程序的头部信息
struct netif server_netif; // lwIP 网络接口结构体
static void print_ip(char *msg, ip_addr_t *ip)
{
print(msg);
xil_printf("%d.%d.%d.%d\r\n", ip4_addr1(ip), ip4_addr2(ip),
ip4_addr3(ip), ip4_addr4(ip)); // 按照点分十进制格式打印 IP 地址
}
static void print_ip_settings(ip_addr_t *ip, ip_addr_t *mask, ip_addr_t *gw)
{
print_ip("Board IP: ", ip); // 打印板载设备的 IP 地址
print_ip("Netmask : ", mask); // 打印子网掩码
print_ip("Gateway : ", gw); // 打印网关地址
}
static void assign_default_ip(ip_addr_t *ip, ip_addr_t *mask, ip_addr_t *gw)
{
int err;
xil_printf("Configuring default IP %s \r\n", DEFAULT_IP_ADDRESS);
err = inet_aton(DEFAULT_IP_ADDRESS, ip); // 将默认 IP 字符串转换为 IP 地址格式
if (!err)
xil_printf("Invalid default IP address: %d\r\n", err);
err = inet_aton(DEFAULT_IP_MASK, mask); // 设置默认子网掩码
if (!err)
xil_printf("Invalid default IP MASK: %d\r\n", err);
err = inet_aton(DEFAULT_GW_ADDRESS, gw); // 设置默认网关
if (!err)
xil_printf("Invalid default gateway address: %d\r\n", err);
}
int main(void)
{
struct netif *netif; // 网络接口指针
/* the mac address of the board. this should be unique per board */
// 设置设备的 MAC 地址,通常每个设备应有一个唯一的 MAC
unsigned char mac_ethernet_address[] = {
0x00, 0x0a, 0x35, 0x00, 0x01, 0x02 };
netif = &server_netif; // 将 `server_netif` 赋给 `netif` 指针
init_platform(); // 初始化硬件平台
xil_printf("\r\n\r\n");
xil_printf("-----lwIP RAW Mode UDP Client Application-----\r\n");
/* initialize lwIP */
lwip_init(); // 初始化 lwIP 协议栈
/* Add network interface to the netif_list, and set it as default */
// 添加网络接口到 lwIP 中并设为默认接口
if (!xemac_add(netif, NULL, NULL, NULL, mac_ethernet_address,
PLATFORM_EMAC_BASEADDR)) {
xil_printf("Error adding N/W interface\r\n");
return -1;
}
netif_set_default(netif); // 设置默认网络接口
/* now enable interrupts */
platform_enable_interrupts(); // 启用中断
/* specify that the network if is up */
netif_set_up(netif); // 将网络接口标记为启动状态
assign_default_ip(&(netif->ip_addr), &(netif->netmask), &(netif->gw)); // 设置默认 IP、子网掩码和网关
print_ip_settings(&(netif->ip_addr), &(netif->netmask), &(netif->gw));//打印IP、子网掩码和网关
xil_printf("\r\n");
/* print app header */
print_app_header(); // 打印应用程序头部信息
/* start the application*/
start_application(); // 启动 UDP 应用程序
xil_printf("\r\n");
// 主循环,持续处理网络事件
while (1) {
if (TcpFastTmrFlag) {
tcp_fasttmr(); // 处理 lwIP 快速定时器事件
TcpFastTmrFlag = 0;
}
if (TcpSlowTmrFlag) {
tcp_slowtmr(); // 处理 lwIP 慢速定时器事件
TcpSlowTmrFlag = 0;
}
xemacif_input(netif); // 检查网络接口是否有输入数据并处理
transfer_data(); // 执行数据传输逻辑
}
/* never reached */
cleanup_platform(); // 程序结束时清理硬件资源
return 0;
}