打印

GD32470I_EVAL_Demo_Suites中FreeRTOS_tcpudp卡死问题

[复制链接]
95|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LiveD|  楼主 | 2025-3-12 11:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
配置了一个UDP单播,在任务中周期发送数据,连接网线时没问题;拔掉网线时程序运行40多秒后会卡死在下面while中
static err_t low_level_output(struct netif *netif, struct pbuf *p)
{
    static xSemaphoreHandle s_tx_semaphore = NULL;
    struct pbuf *q;
    uint8_t *buffer ;
    uint16_t framelength = 0;
    ErrStatus reval = ERROR;
  
    SYS_ARCH_DECL_PROTECT(sr);
   
    if (s_tx_semaphore == NULL){
        vSemaphoreCreateBinary (s_tx_semaphore);
    }

    if (xSemaphoreTake(s_tx_semaphore, LOWLEVEL_OUTPUT_WAITING_TIME)){   
        SYS_ARCH_PROTECT(sr);
      
[color=Red]       while((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)){[/color]
        }   
        buffer = (uint8_t *)(enet_desc_information_get(dma_current_txdesc, TXDESC_BUFFER_1_ADDR));

        for(q = p; q != NULL; q = q->next){
            memcpy((uint8_t *)&buffer[framelength], q->payload, q->len);
            framelength = framelength + q->len;
        }

       /* transmit descriptors to give to DMA */
#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE
        reval = ENET_NOCOPY_PTPFRAME_TRANSMIT_ENHANCED_MODE(framelength, NULL);
#else
        reval = ENET_NOCOPY_FRAME_TRANSMIT(framelength);
#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */

        SYS_ARCH_UNPROTECT(sr);
        
        /* give semaphore and exit */
        xSemaphoreGive(s_tx_semaphore);
    }
   
    if(SUCCESS == reval){
        return ERR_OK;
    }else{
        while(1){
        }
    }
   
}

使用特权

评论回复
沙发
LiveD|  楼主 | 2025-3-12 11:57 | 只看该作者
卡死在 while((uint32_t)RESET != (dma_current_txdesc->status & ENET_TDES0_DAV)中,插上网线后可恢复运行

使用特权

评论回复
板凳
LiveD|  楼主 | 2025-3-12 12:11 | 只看该作者

RE: GD32470I_EVAL_Demo_Suites中FreeRTOS_tcpudp卡死问题求助

求助各位大神!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝