导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→求助!!lwip移植后PING不通,请高手帮忙看一下,问题可[jingzhu420]

 *第4798篇: 求助!!lwip移植后PING不通,请高手帮忙看一下,问题可能出在哪里?

  
楼 主:jingzhu420 2007年7月16日11:16
 求助!!lwip移植后PING不通,请高手帮忙看一下,问题可能出在哪里?
求助!!lwip移植后PING不通,请高手帮忙看一下,问题可能出在哪里?


#define TASK_STK_SIZE 4096  // Stack size, in size of SO_STK, or int 
// task prio 1 for lwip init( it also init hardware and timer task )
OS_STK lwip_init_stk[TASK_STK_SIZE]; // lwip stacks
// user task start from prio 3!!!!
OS_STK      usr_stk[TASK_STK_SIZE]; // user Task stack

// Prototypes
void    hardware_init(void);
void usr_task(void * pParam);
void  lwip_init_task(void *pParam);
void  tcpip_init_done(void *arg);
void Sleep(INT16U uSec);
void    tcpecho_init(void);
/*-----------------------------------------------------------------------------------*/
int main(void)
{
OSInit();
OSTaskCreate(lwip_init_task, NULL, &lwip_init_stk[TASK_STK_SIZE-1], 0); 
OSTaskCreate(usr_task, NULL,&usr_stk[TASK_STK_SIZE-1],1);
    OSStart();
    
    return 0;
}
/*-----------------------------------------------------------------------------------*/
// This function never returns.
void usr_task(void * pParam)
{
  while(1){
    Sleep(5);
  }
}
/*-----------------------------------------------------------------------------------*/
void lwip_init_task(void * pParam)
{
  struct ip_addr ipaddr, netmask, gw;
  sys_sem_t sem;
  
  static struct netif *mynetif; 
  
  hardware_init();
#ifdef STATS
  stats_init();
#endif /* STATS */
  sys_init();
  mem_init();
  memp_init();
  pbuf_init();
   
//mainthread
  netif_init();
  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, 192,168,0,1);
  IP4_ADDR(&ipaddr, 192,168,0,174);
  IP4_ADDR(&netmask, 255,255,255,0);
  
  mynetif = netif_add(mynetif, &ipaddr, &netmask, &gw, NULL, NicInit, tcpip_input);
  netif_set_default(mynetif);
  netif_set_up(mynetif);
  tcpecho_init();
  /* Block for ever. */
  sem = sys_sem_new(0);
  sys_sem_wait(sem);
}
/*-----------------------------------------------------------------------------------*/
void
tcpip_init_done(void *arg)
{
  sys_sem_t *sem;
  sem = arg;
  sys_sem_signal(*sem);
}
/*-----------------------------------------------------------------------------------*/
void Sleep(INT16U uSec)
{
OSTimeDly((INT16U) (uSec) * 10);
}
/*-----------------------------------------------------------------------------------*/
static void 
tcpecho_thread(void *arg)
{
  struct netconn *conn, *newconn;
  err_t err;
  /* Create a new connection identifier. */
  conn = netconn_new(NETCONN_TCP);
  /* Bind connection to well known port number 7. */
  netconn_bind(conn, NULL, 7);
  /* Tell connection to go into listening mode. */
  netconn_listen(conn);
  while(1) {
/* Grab new connection. */
newconn = netconn_accept(conn);
/*printf("accepted new connection %p\n", newconn);*/
/* Process the new connection. */
if(newconn != NULL) {
   struct netbuf *buf;    
   void *data;
   u16_t len;
   
   while((buf = netconn_recv(newconn)) != NULL) {
        do {
             netbuf_data(buf, &data, &len);
             err = netconn_write(newconn, data, len, NETCONN_COPY);
             if(err != ERR_OK) {
              }
         } while(netbuf_next(buf) >  = 0);
         netbuf_delete(buf); 
   }
   /* Close connection and discard connection identifier. */
   netconn_delete(newconn);
}
  }
}
/*-----------------------------------------------------------------------------------*/
void
tcpecho_init(void)
{
  sys_thread_new(tcpecho_thread, NULL);  
}
/*-----------------------------------------------------------------------------------*/
void hardware_init(void)
{
  TargetInit();   //目标板初始化
  Irq_Init();       //中断初始化
}
/*-----------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/
void Irq_Init(void)
{
     PINSEL0 = (PINSEL0 & 0xffff3fff) | (0x11  <  <14); //设置EINT2连接到P0.7管脚
     
     EXTMODE = 0x00;
     
     VICIntSelect = 0x00000000; //设置所有中断分配为IRQ中断
     VICVectAddr0 = (u32_t)ethernetif_isr;   //设置网卡中断服务程序地址
     VICVectCntl0 = 0x20 | 16;    //分配EINT2中断到向量中断0
     
     VICDefVectAddr = (u32_t)donothing_isr;    //如果不是网卡中断就跳到这个ISR,就是什么也不做(总觉得这个地方有问题)
     
     EXTINT = 0x04;    //清除EINT2中断标志
     VICIntEnable = 0x00010000; //使能EINT2中断 
}
/*-----------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/
void ethernetif_isr(void)
{
u8_t  isr,curr,bnry;
struct netif *netif;

//close nic
outb(CMD_PAGE0 | CMD_NODMA | CMD_STOP,NE_CR);

//in PAGE0
isr = inb(NE_ISR);
// ram overflow interrupt
if (isr & ISR_OVW) {
  outb(ISR_OVW,NE_ISR);  // clear interrupt
// ne2k_overflowProcess();              //yangye :no overflow now 
}

// error transfer interrupt ,NIC abort tx due to excessive collisions 
if (isr & ISR_TXE) {
  outb(ISR_TXE,NE_ISR);  // clear interrupt
   //temporarily do nothing
}
// Rx error , reset BNRY pointer to CURR (use SEND PACKET mode)
if (isr & ISR_RXE) {
  outb(ISR_RXE,NE_ISR);  // clear interrupt
  
  outb(CMD_PAGE1 | CMD_NODMA | CMD_STOP,NE_CR);
  curr = inb(NE_CURR);
  outb(CMD_PAGE0 | CMD_NODMA | CMD_STOP,NE_CR);
  outb(curr, NE_BNRY);
}

//got packet with no errors
if (isr & ISR_PRX) {
  outb(ISR_PRX, NE_ISR);  // clear interrupt
  outb(CMD_PAGE1 | CMD_NODMA | CMD_STOP, NE_CR);
  curr  =  inb(NE_CURR);
  outb(CMD_PAGE0 | CMD_NODMA | CMD_STOP, NE_CR);
  bnry = inb(NE_BNRY);
  //yangye 2003-1-21
  //get more than one packet until receive buffer is empty
  while(curr != bnry){
   ne2k_recv_packet(rtl8019if_netif);
   outb(CMD_PAGE1 | CMD_NODMA | CMD_STOP, NE_CR);
   curr =  inb(NE_CURR);
   outb(CMD_PAGE0 | CMD_NODMA | CMD_STOP, NE_CR);
   bnry =  inb(NE_BNRY);   
   }
}
  
//Transfer complelte, do nothing here
if( isr & ISR_PTX){
  PRINT("ne2k_isr: is ISR_PTX\n");
  outb(ISR_PTX, NE_ISR);          // clear interrupt
}
  
outb(CMD_PAGE0 | CMD_NODMA | CMD_STOP, NE_CR);
outb(0xff, NE_ISR);   // clear ISR 

//open nic for next packet
outb(CMD_PAGE0 | CMD_NODMA | CMD_RUN, NE_CR);

EXTINT = 0x04;      //清除EINT2中断标志
VICVectAddr = 0;    //向量中断结束
}
/*-----------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------*/
void __irq donothing_isr(void)
{

}
**********************************************************************************************
原来在执行到sys_init()时就会跳到IRQ中断处,我也不知道是什么引发了这个中断,所以就设定一跳到这个中断执行上面的
donothing_isr(),不知道这样是否可以??
sys_init()的函数如下:
void sys_init(void)
{
    u8_t i;
    //this func is called first in lwip task!
    s8_t   ucErr;
    //init mem used by sys_mbox_t
    //use ucosII functions
    pQueueMem = OSMemCreate( (void*)pcQueueMemoryPool, MAX_QUEUES, sizeof(TQ_DESCR), &ucErr );
    //init lwip task prio offset
    curr_prio_offset = 0;
    //init lwip_timeouts for every lwip task
    for(i=0;i  <LWIP_TASK_MAX;i++){
     lwip_timeouts.next = NULL;
    }
}

希望各位能指点一下,感激不尽!!


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:[推荐]一款针对TI混合信号处理器的仿真工具

[下一篇主题]:招聘——硬件工程师 薪水丰厚!