你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F7+FreeRTOS+LWIP UDP发送返回-4故障不定期?

[复制链接]
王王木木先森_ 提问时间:2021-4-12 10:14 / 未解决
您好,各位大佬朋友们!
目前小弟在用正点原子STM32F767 + FreeRTOS +LWIP 调试UDP以及TCP服务器端。。
1. 系统仅存在UART串口printf,以及ETH。其他外设均无
2. udpTask + tcpTask + DefaultTask(默认执行周期20ms,使用osDelay(20)延时)
3. udpTask任务内仅包含:udp_send函数
4. tcpTask任务无任何内容,只有osDelay(20);
5. default任务无任何内容,只有osDelay(10);

遇到的问题:
1. 移植STM32F7官方udp 例程,初始化等操作。可ping通,然后通过udp接收回调函数,反馈接受的内容实现,收发。
2. udp_send HAL接口,不定期不定时返回-4(概率比较大)偶尔-8,err。此时在windows相关小黄人助手里面看到接收的字节大概为20W左右(17字节一帧,20ms周期)。有些时候会达到300W字节。就开始返回-4.
3. FreeRTSO系统正常运行。ETH 的udp send发送失败。以太网RJ45灯灭。ping不通。

跪求各位大佬给一些建议或者入手查看思路。真的快被逼疯了。

以下附上部分源码:
1. 创建三个Task;
  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
    /* definition and creation of myTaskLED */
  osThreadDef(udpTaskA, udpTask, osPriorityIdle, 0, 1024);
  UDPTaskHandle = osThreadCreate(osThread(udpTaskA), NULL);

  /* definition and creation of myTaskTCP */
  osThreadDef(tcpTaskB, tcpTask, osPriorityIdle, 0, 512);
  TCPServerHandle = osThreadCreate(osThread(tcpTaskB), NULL);
  /* USER CODE END RTOS_THREADS */


2.  UDP发送任务
void udpTask(void const * argument)
{
        UINT8 tempA = 0xFF;
        UINT8 i = 0;
      
        udp_echoserver_init();
      
        printf("UDP Task ok \n");
      
        /* Infinite loop */
        for(;;)
        {
      
                //CheckNaviMessagePacket(&naviMessage,sizeof(naviMessage));
                UDPSendMessage(NULL,sizeof(NS_CtrlInfo_t));
      
                osDelay(20);
        }
        /* USER CODE END LEDTask */

}
3. 回调函数
void udp_echoserver_receive_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, UINT16 port)
{
  /* Connect to the remote client */
  udp_connect(upcb, addr, UDP_CLIENT_PORT);

  /*GetNaviMessage(&p->payload,p->len);*/
  memset(recdata,0,sizeof(recdata));
  memcpy((char *)recdata,p->payload,p->len);
  /* Tell the client that we have accepted it */
  udp_send(upcb, p);

  /* free the UDP connection, so we can accept new clients */
  udp_disconnect(upcb);

  /* Free the p buffer */
  pbuf_free(p);

}


4. 实际udpTask发送内容

void UDPSendMessage(UINT8 *ptrMsg, UINT8 Len)
{
        UINT8 srcIP[4] = {192,168,12,99};
        err_t ret;
        struct pbuf *ptr;
      
        ptr=pbuf_alloc(PBUF_TRANSPORT,strlen((char*)recdata),PBUF_POOL); //申请内存

        if(ptr)
        {
                udp_connect(udpTaskPCB, srcIP, UDP_CLIENT_PORT);
                ptr->payload=(void*)recdata;
                ptr->len = sizeof(recdata);
                ret = udp_send(udpTaskPCB,ptr);        //udp发送数据
                udp_disconnect(udpTaskPCB);
                pbuf_free(ptr);//释放内存

                printf("Ret %d \n",ret);
        }
}


5. udp初始化
void udp_echoserver_init(void)
{

        err_t err;

        /* Create a new UDP control block  */
        udpTaskPCB = udp_new();  //创建一个新的UDP控制块

        if (udpTaskPCB)
        {
                /* Bind the udpTaskPCB to the UDP_PORT port */
                /* Using IP_ADDR_ANY allow the udpTaskPCB to be used by any local interface */
                err = udp_bind(udpTaskPCB, IP_ADDR_ANY, UDP_SERVER_PORT);   //绑定本地IP地址及端口

                if(err == ERR_OK)
                {
                        /* Set a receive callback for the upcb */
                        udp_recv(udpTaskPCB, udp_echoserver_receive_callback, NULL);   //注册接收数据回调函数
                }
                else
                {
                        udp_remove(udpTaskPCB);
                        printf("can not bind pcb");
                }
        }
        else
        {
                printf("can not create pcb");
        }
}


跪求各位大佬给指点!!!!!!!!谢谢~!!!!!!
收藏 评论1 发布时间:2021-4-12 10:14

举报

1个回答
xmshao 回答时间:2021-7-15 17:29:15
给些参考建议:

既然不设计tcp协议,考虑把这个任务注释掉;


另外,建议将ptr=pbuf_alloc(PBUF_TRANSPORT,strlen((char*)recdata),PBUF_POOL);改为ptr=pbuf_alloc(PBUF_TRANSPORT,strlen((char*)recdata),PBUF_RAM);


还有,你不妨检查下lwipopts.h里的有关内存、udp的配置,先基于默认配置来做。

有关DMA传输的TX/RX descriptor也确认下。

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版