野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 22806|回复: 7

移植LWIP中断方式下PING丢包

[复制链接]
发表于 2016-10-12 20:52:03 | 显示全部楼层 |阅读模式
在UCOSIII下移植的LWIP例程,平台是F429,查询方式下PING没问题,但太占线程了,所以改成中断方式,总有10%的丢包率,怀疑是ethernetif_input驱动没有改好,麻烦火哥看一下是不是哪儿移植的有问题你?不盛感激。

//以太网DMA接收中断服务函数
void EthIRQHandler(void)
{
        OS_ERR      err;       
       
        if(ETH_GetRxPktSize(DMARxDescToGet)!=0)                                  //检测是否收到数据包
        {
                OSTaskSemPost(        &LwIP_task_TCB[3],                                /*        向读取以太网数据的任务发布信号量        */
                                                OS_OPT_POST_NO_SCHED,                /*        发布后不立即进行调度        */
                                                &err);       
        }
        ETH_DMAClearITPendingBit(ETH_DMA_IT_R);          //清除DMA中断标志位
        ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);        //清除DMA接收中断标志位       
}  



void ethernetif_input( void * pvParameters )
{
  struct pbuf *p;
  OS_ERR os_err;

  err_t err;
  CPU_TS                        ts;

  /* move received packet into a new pbuf */
  while (1)
  {
                OSTaskSemPend(0,                                                                                                               
                                           OS_OPT_PEND_BLOCKING,
                                           &ts,
                                           &os_err);                       
               
                while(ETH_GetRxPktSize(DMARxDescToGet)!=0)          //检测是否收到数据包
                {
                        SYS_ARCH_DECL_PROTECT(sr);
                       
                        SYS_ARCH_PROTECT(sr);
                        p = low_level_input(s_pxNetIf);
                        SYS_ARCH_UNPROTECT(sr);
                        if (p != NULL)
                        {
                                err = s_pxNetIf->input(p, s_pxNetIf);
                                if (err != ERR_OK)
                                {
                                        LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
                                        pbuf_free(p);
                                        p = NULL;
                                }                       
                        }                       
                }

  }
}


回复

使用道具 举报

 楼主| 发表于 2016-10-12 22:21:43 | 显示全部楼层
对比ST官网最新的HAL库中以太网驱动中的HAL_ETH_GetReceivedFrame函数和之前在407中的HAL_ETH_GetReceivedFrame函数有较大的区别,能不能判定407版本的在中断方式下有BUG?
回复 支持 反对

使用道具 举报

发表于 2016-10-13 08:51:55 | 显示全部楼层
其实你既然用系统,就没必要用中断了,在系统里直接做一个轮询,隔多少ms检测一次,这样对资源的占用其实并不多
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-13 09:40:11 | 显示全部楼层
flyleaf 发表于 2016-10-13 08:51
其实你既然用系统,就没必要用中断了,在系统里直接做一个轮询,隔多少ms检测一次,这样对资源的占用其实并 ...

以下是火哥的源码,这样轮询是没问题,但网络若没有数据的时候程序会一直轮询,根本没法调度其它任务,我把  
  if (p == NULL)       
      continue;
改成
    if (p == NULL)
{
  OSTimeDlyHMSM(0, 0, 0, 5, OS_OPT_TIME_DLY, (OS_ERR *)&os_err);
continue;
}       
后再PING就会丢包很严重,这是怎么回事儿呢?     
void ethernetif_input( void * pvParameters )
{
  struct pbuf *p;
  OS_ERR os_err;
  err_t err;
  
  /* move received packet into a new pbuf */
  while (1)
  {
                SYS_ARCH_DECL_PROTECT(sr);
               
                SYS_ARCH_PROTECT(sr);
                p = low_level_input(s_pxNetIf);
                SYS_ARCH_UNPROTECT(sr);
    if (p == NULL)       
      continue;
                err = s_pxNetIf->input(p, s_pxNetIf);
                if (err != ERR_OK){
                        LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
                        pbuf_free(p);
                        p = NULL;
                }
    /*sleep 5 ms*/
    OSTimeDlyHMSM(0, 0, 0, 5, OS_OPT_TIME_DLY, (OS_ERR *)&os_err);
  }
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-13 11:22:59 | 显示全部楼层
丢包问题解决,把优先级设低点儿就可以了,本来都是空闲程序占用最大的CPU,现在成ethernetif_input了,有点儿不习惯。
回复 支持 反对

使用道具 举报

发表于 2016-11-2 11:21:47 | 显示全部楼层
云琴箫龙 发表于 2016-10-13 11:22
丢包问题解决,把优先级设低点儿就可以了,本来都是空闲程序占用最大的CPU,现在成ethernetif_input了,有 ...

遇到同样问题,但是我感觉是因为没有进入中断,因为我在中断里面关闭LED,在ethernetif_input里面打开LED,然后观察到的现象是,即便丢包超时时,灯依然是亮的,也就是说根本没有进入中断,否则如果进入中断而ethernetif_input没有收到信号量,灯应该是熄灭的,楼主可不可以把你解决办法说详细点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-27 22:44:53 | 显示全部楼层
YUYUYU 发表于 2016-11-2 11:21
遇到同样问题,但是我感觉是因为没有进入中断,因为我在中断里面关闭LED,在ethernetif_input里面打开LED ...

改用中断方式总是丢包,延时轮训的方式也会丢包,目前还没有找到原因所在,怀疑是官网的驱动问题,暂时先用的一直轮训方式,任务优先级设为最低,以后有精力再研究中断的方式。
回复 支持 反对

使用道具 举报

发表于 2020-9-29 17:18:38 | 显示全部楼层
我也是基于UCOSIII移植的LWIP,采用中断发送信号量方式就是ping不通,采用中断直接接收数据可以ping通。能否提供下代码参考参考
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-7-3 01:26 , Processed in 0.029261 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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