野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12773|回复: 3

LWIP移植中Eth_if的调度问题

[复制链接]
发表于 2016-10-11 15:00:11 | 显示全部楼层 |阅读模式
你好,火哥,我在F429下移植了你的LWIP例程,例程中ethernetif_input如下:
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);
  }
}

网口没有有效数据的时候该系统使无法执行调度的,因此想改用网口接收中断的方式触发该任务,但中断中向该任务发布消息之后系统始终不调度ethernetif_input,怀疑是任务TCB没有配置对,你把LWIP所有任务的TCB用一个数组表示,我用串口打印出来Net_if的TCB下标号为3,所以网口中断中是这样写的。
void ETH_IRQHandler(void)
{
        OS_ERR      err;       
       
        OSIntEnter();       
        while(ETH_GetRxPktSize(DMARxDescToGet)!=0)                                 //检测是否收到数据包
        {
                DEBUG("\r\n 以太网中断 \r\n");       
                OSTaskSemPost(        &LwIP_task_TCB[3],                                       /*        向Net_if任务发布信号量        */
                                                OS_OPT_POST_NO_SCHED,                        /*        发布后不立即进行调度        */
                                                 &err);       
                ETH_DMAClearITPendingBit(ETH_DMA_IT_R);                                //清除DMA中断标志位
                ETH_DMAClearITPendingBit(ETH_DMA_IT_NIS);                      //清除DMA接收中断标志位                       
        }
        OSIntExit();
}  

实测串口可以打印出“以太网中断”,说明确实是进中断了,但为什么就是不调度ethernetif_input呢,&LwIP_task_TCB[3],这么写TCB有问题吗?
回复

使用道具 举报

发表于 2016-10-11 18:28:31 | 显示全部楼层
ethernetif_input是要被循环调用的吧,它貌似不是中断调用的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-12 10:15:44 | 显示全部楼层
随风 发表于 2016-10-11 18:28
ethernetif_input是要被循环调用的吧,它貌似不是中断调用的

问题解决了,把中断里面的while改成if就好了,不然他会一直在终端中不出来,但是ping的结果没有例程稳定,偶尔时间会达到40ms左右,也会超时,正在分析原因
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-12 10:19:45 | 显示全部楼层
火哥UCOIII例程里面ethernetif_input也是一个任务,在任务重一直轮询有没有收到数据,这样太占用CPU资源了,我的想法是用中断来触发这个任务执行,但是偶尔有丢包现象
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 07:31 , Processed in 0.040322 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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