ZYNQ以太网通信之UDP(一)

免责声明:

本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。

读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。

本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。

若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。


前言

本期,小编将带领大家了解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;
}


  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值