硬汉嵌入式论坛

 找回密码
 立即注册
查看: 406|回复: 9
收起左侧

[LwIP] at32f407使用freertos移植lwip运行时间久了后,ping会变的很慢,直至死机

[复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2025-3-25 13:48:28 | 显示全部楼层 |阅读模式
也按照网上的一些代码更改过,感觉都没什么效果,软件测试结果如下,测试时应用程序屏蔽掉了,lwip移植的是2.2.1
求大佬帮忙分析一下原因和继续排查方法



代码如下,




回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-25 15:17:26 | 显示全部楼层
图片怎么被吃了,补充图片
微信图片_20250325151535.png
微信图片_20250325151640.png
微信图片_20250325151620.png
微信图片_20250325151555.png
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-25 15:24:31 | 显示全部楼层
error_status emac_rxpkt_chainmode(void)
{
    error_status status = ERROR;
    /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
    if ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_OWN) != (u32)RESET)
    {
        /* return error: own bit set */
        return status;
    }

    if (((dma_rx_desc_to_get->status & EMAC_DMARXDESC_FS) != (u32)RESET) &&
        ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_LS) != (u32)RESET))
    {
        /* 单包数据 */
        rx_frame.rx_fs_desc = dma_rx_desc_to_get;
        rx_frame.rx_ls_desc = dma_rx_desc_to_get;
        /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
        rx_frame.length = ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_FL) >> EMAC_DMARxDesc_FrameLengthShift) - 4;
        rx_frame.buffer = rx_frame.rx_fs_desc->buf1addr;
        status = SUCCESS;
    }
    else if ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_FS) != (u32)RESET)
    {
        /* 多包数据的第一包 */
        if (NULL != rx_frame.rx_fs_desc)
        {
            /* 已经记录了一次开始帧,丢掉上次的开始帧和后续的数据 */
            while (rx_frame.rx_fs_desc != dma_rx_desc_to_get)
            {
                rx_frame.rx_fs_desc->status = EMAC_DMARXDESC_OWN;
                rx_frame.rx_fs_desc = (emac_dma_desc_type*)rx_frame.rx_fs_desc->buf2nextdescaddr;
            }
        }
        rx_frame.rx_fs_desc = dma_rx_desc_to_get;
    }
    else if ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_LS) != (u32)RESET)
    {
        /* 多包数据的最后一包 */
        if (NULL == rx_frame.rx_fs_desc)
        {
            //没有对应的开始包丢掉此包数据,不做处理。
            dma_rx_desc_to_get->status = EMAC_DMARXDESC_OWN;
            goto Nothing;
        }
        else
        {
            rx_frame.rx_ls_desc = dma_rx_desc_to_get;
            /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
            rx_frame.length = ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_FL) >> EMAC_DMARxDesc_FrameLengthShift) - 4;
            rx_frame.buffer = rx_frame.rx_fs_desc->buf1addr;
            status = SUCCESS;
        }
    }
    else//多包数据的中间包
    {
        if (dma_rx_desc_to_get->buf2nextdescaddr == (uint32_t)rx_frame.rx_fs_desc)
        {
            /* 多包数据超出了缓存 */
            /* 丢掉上次的开始帧和后续的数据 */
            while (rx_frame.rx_fs_desc != dma_rx_desc_to_get)
            {
                rx_frame.rx_fs_desc->status = EMAC_DMARXDESC_OWN;
                rx_frame.rx_fs_desc = (emac_dma_desc_type*)rx_frame.rx_fs_desc->buf2nextdescaddr;
            }
            rx_frame.rx_fs_desc = NULL;
            goto Nothing;
        }

        if (NULL == rx_frame.rx_fs_desc)
        {
            //没有对应的开始包丢掉此包数据,不做处理。
            dma_rx_desc_to_get->status = EMAC_DMARXDESC_OWN;
            goto Nothing;
        }
    }
    /* Selects the next DMA Rx descriptor list for next buffer to read */
    dma_rx_desc_to_get = (emac_dma_desc_type*)(dma_rx_desc_to_get->buf2nextdescaddr);

    return status;
Nothing:
    return status;
}
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-26 14:58:36 | 显示全部楼层
半场开个香槟,自己顶自己
微信图片_20250326145819.png
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-27 08:39:18 | 显示全部楼层
测试一夜无问题。
说结论:修改时改动地方比较多
这里说我感觉最重要的两点
1.不要开溢出中断
2.eth中断优先级要能被freertos管理
微信图片_20250327083718.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2025-3-27 10:28:16 | 显示全部楼层
luanyuxinhen 发表于 2025-3-26 14:58
半场开个香槟,自己顶自己

测试百万数据包,正常后,基本就正常了。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2025-3-27 10:59:48 | 显示全部楼层
要谢谢你公开的这个工具,要不然我测试都要测试半天,这个工具挺好用的。
回复

使用道具 举报

4

主题

22

回帖

34

积分

新手上路

积分
34
发表于 2025-4-15 23:07:11 | 显示全部楼层
luanyuxinhen 发表于 2025-3-27 08:39
测试一夜无问题。
说结论:修改时改动地方比较多
这里说我感觉最重要的两点

我也是刚测试的帖子,建议一定要开溢出中断;你这里就建议不要开,真是服了
回复

使用道具 举报

12

主题

152

回帖

188

积分

初级会员

积分
188
发表于 2025-4-18 16:29:04 | 显示全部楼层
cdmar79 发表于 2025-4-15 23:07
我也是刚测试的帖子,建议一定要开溢出中断;你这里就建议不要开,真是服了

你们说的溢出中断是指哪个溢出中断?
回复

使用道具 举报

4

主题

22

回帖

34

积分

新手上路

积分
34
发表于 5 天前 | 显示全部楼层
gnail092 发表于 2025-4-18 16:29
你们说的溢出中断是指哪个溢出中断?

.regs_DMA_INTEN_init = &(const struct emac_regs_DMA_INTEN){.BITS = {
                                                                                                                                                   .NIE = 1,   // 正常中断
                                                                                                                                                   .RIE = 1,   // 接收中断
                                                                                                                                                   .FBEIE = 1, // 总线错误
                                                                                                                                                   .ROIE = 1,  // 上溢错误
                                                                                                                                                   .TUIE = 1,  // 下溢错误
                                                                                                                                                   .AIE = 1,
                                                                                                                                           }},
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-26 01:52 , Processed in 0.436551 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表