[技术问答] hc32f4a0 以太网 lwip freertos问题

[复制链接]
7078|13
 楼主| huex 发表于 2024-6-11 12:04 | 显示全部楼层 |阅读模式
本帖最后由 huex 于 2024-6-11 12:04 编辑

目前已经移植好lan8720驱动,之前做过gd32f4 lan8720 ,结合参考rt-thread以太网驱动,目前lwip可以得到ip,也可以ping,但是发现要不了多久,ping就会断流,对hc32f4a0以太网mac不是很理解,但是感觉貌似是dma这块有问题。似乎是接收卡死了。将中断改成Poll,能坚持很久,但是仍然可以感受到过一阵子就断流了
这是使用poll方式。断流很明显

766496666c63d4da63.png


  1. void ethernetif_input(void *pvParameters)
  2. {
  3.     struct pbuf *p;
  4.     SYS_ARCH_DECL_PROTECT(sr);
  5.     for (;;) {
  6.         // if (pdTRUE == xSemaphoreTake(g_rx_semaphore, portMAX_DELAY)) {
  7.         // TRY_GET_NEXT_FRAME:
  8.             SYS_ARCH_PROTECT(sr);
  9.             p = low_level_input(low_netif);
  10.             SYS_ARCH_UNPROTECT(sr);
  11.             if (p != NULL) {
  12.                 // taskENTER_CRITICAL();
  13.                 if (ERR_OK != low_netif->input(p, low_netif)) {
  14.                     (void)pbuf_free(p);
  15.                     p = NULL;
  16.                 } else {
  17.                     // printf("low_netif input failed \n");
  18.                     // xSemaphoreTake(g_rx_semaphore, 0);
  19.                     // goto TRY_GET_NEXT_FRAME;
  20.                 }
  21.                 // taskEXIT_CRITICAL();
  22.             // }
  23.         }
  24.         vTaskDelay(1);
  25.     }
  26. }
,改成中断,则时间不定,就会进入卡死状态,拨插网线,lwip能看到在检测,但再也不会有接收数据。并且lwip debug下似乎dma方式经常得到超过1524的数据,。

附ehternet.c
ethernetif.zip (7.37 KB, 下载次数: 23)

是否有大佬知道是哪里需要注意的细节?



daichaodai 发表于 2024-6-12 07:57 来自手机 | 显示全部楼层
跑操作系统的话,任务的处理就很重要了。
 楼主| huex 发表于 2024-6-14 18:08 | 显示全部楼层
跟rtos没关系,裸机跑也是这个样子,感觉是emac dma结构有问题,很容易收到错误的超大数据包,导致lwip low_level_input 处理很长时间,进而dma中断出问题,准备放弃了,还是用成熟的东西吧,hc32f4a看着强大...
查询无结果 发表于 2024-6-15 00:11 | 显示全部楼层
huex 发表于 2024-6-14 18:08
跟rtos没关系,裸机跑也是这个样子,感觉是emac dma结构有问题,很容易收到错误的超大数据包,导致lwip low ...

我也没搞定F4A0以太网,没有官网支持很难搞
yangxiaor520 发表于 2024-6-19 08:07 来自手机 | 显示全部楼层
还是处理逻辑没有做好,导致收发丢包。
亚瑟 发表于 2024-6-28 19:02 | 显示全部楼层
没有例程能参考吗
 楼主| huex 发表于 2024-6-30 13:29 | 显示全部楼层
亚瑟 发表于 2024-6-28 19:02
没有例程能参考吗

因为例程不涉及到局域网,更像是板到pc,但实际局域网是存在于大量的各种类型广播数据的.,所以例程不能说明什么。
liupengfeihit 发表于 2025-1-4 00:57 来自手机 | 显示全部楼层
我最近也搞了这块芯片的网口,也发现同样的问题,用的是rtl8201,ping刚开始正常,慢慢就到几百毫秒,在过一段时间就不接收数据了,感觉是eth_dma的问题,官方也不提高参考例程,不知道是驱动程序问题还是硬件设计问题,准备放弃了
hh电子爱好者 发表于 2025-1-20 15:12 | 显示全部楼层
liupengfeihit 发表于 2025-1-4 00:57
我最近也搞了这块芯片的网口,也发现同样的问题,用的是rtl8201,ping刚开始正常,慢慢就到几百毫秒,在过一 ...

是啊,我现在也在freertos上移植lwip,但是现在程序会在lwip中卡死,感觉是延时函数的问题,改了也不行,能交流一下嘛?
地瓜patch 发表于 2025-1-21 21:07 | 显示全部楼层
从官网找例程,从开发板找例程
申小林一号 发表于 2025-1-22 09:09 | 显示全部楼层
学习一下
钛酸锂 发表于 2025-3-6 14:02 | 显示全部楼层
参考这位博主的文章,文章的结论是:HCLK必须大于100MHz,PLCK1必须大于50MHz。
希望对你有帮助
https://blog.csdn.net/cp1300/article/details/125945732
 楼主| huex 发表于 2025-3-8 18:09 | 显示全部楼层
各种频率 HCLK PLCK 均试过。问题如旧,不值当在这个 MCU 上浪费精力,
官方也出了新的 HC32F4A2,
kensilong 发表于 2025-9-23 11:42 | 显示全部楼层
ping延时这么大,可能是你处理接收事件时没有及时读取数据。是不是任务延时太长,或者是其他的任务优先级高,导致接收的任务没有办法拿到CPU的资源。我这边测试都是<1ms的。
中断里置起信号量
void ETH_RxCpltCallback(void)
{
    /* Frame received */
    if (RESET != ETH_DMA_GetStatus(ETH_DMA_FLAG_RIS)) {
        osSemaphoreRelease(EthRxSem);
        /* Clear the Eth DMA Rx IT pending bits */
        ETH_DMA_ClearStatus(ETH_DMA_FLAG_RIS);
    }
    ETH_DMA_ClearStatus(ETH_DMA_FLAG_NIS);
}
接收任务里,信号量一来立即处理
void ethernetif_input(void const *argument)
{
    struct pbuf *p;
    struct netif *netif = (struct netif *)argument;

    for (;;) {
        if (osSemaphoreWait(EthRxSem, osWaitForever) == osOK) {
            do {
                p = low_level_input(netif);
                if (p != NULL) {
                    if (netif->input(p, netif) != ERR_OK) {
                        LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
                        pbuf_free(p);
                    }
                }
            } while (p != NULL);
        }
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部