打印

问个关于LWIP的问题

[复制链接]
4823|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bluesteed|  楼主 | 2007-7-9 12:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
tcpip.c里面
static void
tcpip_thread(void *arg)
{
  struct tcpip_msg *msg;

  (void)arg;

  ip_init();
#if LWIP_UDP  
  udp_init();
#endif
#if LWIP_TCP
  tcp_init();
#endif
#if IP_REASSEMBLY
  sys_timeout(1000, ip_timer, NULL);
#endif
  if (tcpip_init_done != NULL) {
    tcpip_init_done(tcpip_init_done_arg);
  }

  while (1) {                          /* MAIN Loop */    
    sys_mbox_fetch(mbox, (void *)&msg);
    switch (msg->type) {
    case TCPIP_MSG_API:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p ", (void *)msg));
      api_msg_input(msg->msg.apimsg);
      break;
    case TCPIP_MSG_INPUT:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: IP packet %p ", (void *)msg));
      ip_input(msg->msg.inp.p, msg->msg.inp.netif);
      break;
    case TCPIP_MSG_CALLBACK:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p ", (void *)msg));
      msg->msg.cb.f(msg->msg.cb.ctx);
      break;
    default:
      break;
    }
    memp_free(MEMP_TCPIP_MSG, msg);
  }
}
因为我一直在说我的LWIP初始化无法单独存在,必须依靠UCOS的保持进程的一些语句,现在通过打开调试信息发现一些问题,但不是很明白。当我把代码调整到可以LWIP正常初始化,ping 的通的话
调试信息显示这个函数是运行的这一行:
 case TCPIP_MSG_INPUT:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: IP packet %p ", (void *)msg));
      ip_input(msg->msg.inp.p, msg->msg.inp.netif);
      break;
当我把代码调整到LWIP初始化以后无法ping通的话,是运行的这一行:
 case TCPIP_MSG_API:
      LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p ", (void *)msg));
      api_msg_input(msg->msg.apimsg);
      break;
请问是不是这里的问题,导致我有些时候LWIP初始化以后无法ping通?

相关帖子

沙发
nanpia| | 2007-7-9 16:41 | 只看该作者

??

你是怎么初始化的阿?
ip_input(msg->msg.inp.p, msg->msg.inp.netif)
运行这个函数是因为底层的ethernetif_input()调用tcpip_input(),向tcpip_thread()发送消息后运行的。

api_msg_input(msg->msg.apimsg)
应该是上层api向tcpip_thread()发送消息,然后运行的。

使用特权

评论回复
板凳
bluesteed|  楼主 | 2007-7-9 16:45 | 只看该作者

初始化

初始化:
void LWIP_main(void *arg)
{
    u8_t    err;
      struct ip_addr ipaddr, netmask, gw;
      sys_sem_t sem;
    static struct netif netif_test;

      netifnum = 0; //for count netif->num
  
#ifdef STATS
      stats_init();
#endif /* STATS */
    

      sys_init();
      mem_init();
      memp_init();
      pbuf_init();
   
   
      netif_init();
    tcpip_init(NULL, NULL);
    udp_init();
    

//mainthread
      netif_init();                        //netif_list = netif_default = NULL;
      //sem = sys_sem_new(0);
      //tcpip_init(tcpip_init_done, &sem);
      //sys_sem_wait(sem);
      //sys_sem_free(sem);  
 



    //add ne2k interface
      IP4_ADDR(&gw, GATEWAY1,GATEWAY2,GATEWAY3,GATEWAY4);
      IP4_ADDR(&ipaddr, OURIP1,OURIP2,OURIP3,OURIP4);
      IP4_ADDR(&netmask, NETMASK1,NETMASK2,NETMASK3,NETMASK4);
  
      netif_add(&netif_test,&ipaddr, &netmask, &gw, NULL, ethernetif_init,tcpip_input);
        netif_set_default(&netif_test);
        netif_set_up(&netif_test);
      
 
    
}

使用特权

评论回复
地板
nanpia| | 2007-7-9 16:59 | 只看该作者

??

你把修改前和修改后的都贴出来呀,好看些

使用特权

评论回复
5
bluesteed|  楼主 | 2007-7-9 17:21 | 只看该作者

好的

改前:
    (void)p_arg;
    
    ConsoleSem  = OSSemCreate(1);
    lwip_input  = OSSemCreate(0);
    next        = OSSemCreate(1);
    lwip_output = OSSemCreate(1);
    Sem1 = OSSemCreate(0);    
    
    pri_info();
    
    //Entrance to the lwip stack.
    LWIP_main(p_arg);
    for(;;){
        
        AT91F_PIO_ClearOutput( AT91D_BASE_PIO_LED, led_mask[0]);
        OSTimeDlyHMSM(0, 0, 0, SPEED);
        AT91F_PIO_SetOutput( AT91D_BASE_PIO_LED, led_mask[0] ) ;
        OSTimeDlyHMSM(0, 0, 0, SPEED);
        
        }
    
改后:
    ST_NETCONN *__pstConn, *__pstNewConn;
    struct netbuf    *__pstNetbuf;
   
    int k,i;
    k = 1;
    
    (void)p_arg;
    
    ConsoleSem  = OSSemCreate(1);
    lwip_input  = OSSemCreate(0);
    next        = OSSemCreate(1);
    lwip_output = OSSemCreate(1);
    Sem1 = OSSemCreate(0);    
    
    pri_info();
    
    //Entrance to the lwip stack.
    LWIP_main(p_arg);
                            
    __pstConn = netconn_new(NETCONN_TCP);
    netconn_bind(__pstConn, NULL, 80);
    netconn_listen(__pstConn);
    
    
    
    while(TRUE)
    {
        __pstNewConn = netconn_accept(__pstConn);
        
        if(__pstNewConn != NULL)
        {            
            __pstNetbuf = netconn_recv(__pstNewConn);
            if(__pstNetbuf != NULL)
            {
                netconn_write(__pstNewConn, "HTTP/1.1 200 OK Content-type: text/html ", 44, NETCONN_COPY);
                netconn_write(__pstNewConn, "<body><h1>这是LWIP TCP测试!</h1></body>", 40, NETCONN_COPY);
                
                netbuf_delete(__pstNetbuf);    
            }
            
            netconn_close(__pstNewConn);
            while(netconn_delete(__pstNewConn) != ERR_OK)
                OSTimeDlyHMSM(0, 0, 1, 0);
    
            }
    }
}

使用特权

评论回复
6
nanpia| | 2007-7-9 17:29 | 只看该作者

不明白

呵呵,看不明白,不知道什么原因,

不过对你这句话不是很理解:
因为我一直在说我的LWIP初始化无法单独存在,必须依靠UCOS的保持进程的一些语句。。。

能否再解释下?

使用特权

评论回复
7
bluesteed|  楼主 | 2007-7-9 17:47 | 只看该作者

我自己也觉得很奇怪


我自己也觉得很奇怪,按道理LWIP只要能运行过了,不管后面怎么样,都应该ping的来,但现在就使这样步行。
我现在是LWIP在任务1里面,任务2是循环亮灯;任务1必须加FOR或者加OSTaskDel(OS_PRIO_SELF);这样的语句,才能使任务处于进程,这样才能ping 的来

使用特权

评论回复
8
nanpia| | 2007-7-9 22:31 | 只看该作者

是不是tcpip_thread()这个任务没有创建成功?

使用特权

评论回复
9
yulri| | 2011-7-20 17:13 | 只看该作者
先记下再说啊!

使用特权

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

本版积分规则

10

主题

30

帖子

0

粉丝