stm32开发之threadx+netxduo(udp 接收端使用记录)

前言

  1. 本篇涉及到的内容: threadx之动态内存的实现记录stm32开发之实现代码之间解耦(借助链接文件和关键字section)

代码

/*
 * Copyright (c) 2024-2024,shchl
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2024-4-9     shchl         udp接收数据处理
 */
#include "includes.h"


#define     UDP_STACK_SIZE          4096  /*任务栈大小*/
#define     UDP_PRIORITY            3    /*优先级*/
#define     PACKET_SIZE             1536 /*数据包大小*/
#define     POOL_SIZE              ((sizeof(NX_PACKET) + PACKET_SIZE) * 16) /*数据包池大小(16个缓冲区)*/
#define     LOCAL_IP               IP_ADDRESS(192, 168, 8, 9) /*本地ip*/
#define     LOCAL_PORT             8080

#define     LOCAL_SUB_MASK         IP_ADDRESS(255,255,255,0) /*本地ip*/

/*
*******************************************************************************************************
*                               外部引入变量
*******************************************************************************************************
*/

/*
*******************************************************************************************************
*                               变量
*******************************************************************************************************
*/

/*
*********************************************************************************************************
*                                       静态全局变量
*********************************************************************************************************
*/
static TX_THREAD udp_thread;
static NX_IP local_ip;                      /*本地ip*/
static NX_PACKET_POOL packet_pool;          /*数据包池*/
static NX_UDP_SOCKET udp_rec_socket;
static ULONG error_counter = 0;         /*错误计数器(可用来排查问题出现位置)*/
/*
*********************************************************************************************************
*                                      函数声明
*********************************************************************************************************
*/
static void udp_thread_entry(ULONG input);

static inline void status_check(UINT stat);

/*
*********************************************************************************************************
*                                      外部函数
*********************************************************************************************************
*/
int app_task_udp_thread_rec_create(void) {
    UINT status;
    /* Create the main thread.  */
    tx_thread_create(&udp_thread,
                     "udp rec thread",
                     udp_thread_entry,
                     0,
                     app_malloc(UDP_STACK_SIZE),
                     UDP_STACK_SIZE,
                     UDP_PRIORITY,
                     UDP_PRIORITY,
                     TX_NO_TIME_SLICE,
                     TX_AUTO_START);

    /* Create a packet pool.  */
    status = nx_packet_pool_create(&packet_pool,
                                   "NetX Main Packet Pool 2",
                                   PACKET_SIZE,
                                   app_malloc(POOL_SIZE),
                                   POOL_SIZE);

    /* Check for pool creation error.  */
    status_check(status);
    /* Create an IP instance.  */
    status = nx_ip_create(&local_ip,
                          "NetX IP Instance 2",
                          LOCAL_IP,
                          LOCAL_SUB_MASK,
                          &packet_pool,
                          nx_stm32_eth_driver,
                          app_malloc(2048), 2048, 1);

    /* Check for IP create errors.  */
    status_check(status);
    /* Enable ARP and supply ARP cache memory for IP Instance 0.  */
    status = nx_arp_enable(&local_ip, app_malloc(1024), 1024);
    /* Check for ARP enable errors.  */
    status_check(status);
    /* Enable ICMP */
    status = nxd_icmp_enable(&local_ip);
    status_check(status);
    /* Enable UDP traffic.  */
    status = nx_udp_enable(&local_ip);
    /* Check for UDP enable errors.  */
    status_check(status);
    return NX_SUCCESS;
}

NET_X_APP_EXPORT(app_task_udp_thread_rec_create);

/*
*********************************************************************************************************
*                                      内部函数
*********************************************************************************************************
*/
static inline void status_check(UINT stat) {
    if (stat) {
        error_counter++;
        // todo
    }
}

static void udp_thread_entry(ULONG input) {

    UINT status;
    NX_PACKET *my_packet;
    ULONG actual_status;


    do {
        /* 等待 1 秒钟,让 内部 IP 线程完成其初始化。. */
        status = nx_ip_status_check(&local_ip,
                                    NX_IP_INITIALIZE_DONE,
                                    &actual_status,
                                    NX_IP_PERIODIC_RATE);
    } while (status != NX_SUCCESS);

    /* Create a UDP socket.  */
    status = nx_udp_socket_create(&local_ip, &udp_rec_socket,
                                  "udp_rec_socket",
                                  NX_IP_NORMAL,
                                  NX_FRAGMENT_OKAY,
                                  0x80,
                                  5);

    /* Check status.  */
    if (status) {
        error_counter++;
        return;
    }

    /* Bind the UDP socket to the IP port.  */
    status = nx_udp_socket_bind(&udp_rec_socket, LOCAL_PORT, TX_WAIT_FOREVER);

    /* Check status.  */
    if (status) {
        error_counter++;
        return;
    }

    while (1) {


        /* Receive a UDP packet.  */
        status = nx_udp_socket_receive(&udp_rec_socket, &my_packet, TX_WAIT_FOREVER);

        /* Check status.  */
        if (status != NX_SUCCESS) {
            break;
        }
        *my_packet->nx_packet_append_ptr = '\0'; /*在结尾处添加结束标志位,这里可以这样处理,前提是确保指向的位置可以被修改*/
        tx_log("%s rec data:%s\r\n",tx_thread_identify()->tx_thread_name,my_packet->nx_packet_prepend_ptr);
        /* Release the packet.  */
        status = nx_packet_release(my_packet);

        /* Check status.  */
        if (status != NX_SUCCESS) {
            break;
        }
    }
}

结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

詩不诉卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值