现在的位置: 首页 > 综合 > 正文

我做的简单以太网交换机实现

2013年12月02日 ⁄ 综合 ⁄ 共 3296字 ⁄ 字号 评论关闭

   由于目的是,用Fifo实现单向隔离,所以第一步是想实现以太网交换机的双向转发功能。 
用NIOS核,外接了两块网卡,连接后测试,发现不通。检查代码发现是一个if判断出了问题。又匆忙修改了设计,再试验,ping包能通了,但是效率很差。分析问题原因,才开始怀疑,由于收发函数用了全局变量,如果同时使用,可能会发生可重入性问题,在收发函数加入了信号量,并用  dev->rxBuf = OSMemGet(BufPtr, &err);//开辟内存,加入后发现效果不理想。
   NIOS6真是巨慢,下载执行估计得2分钟,能把人累4:(,仔细调试了N遍程序都不理想。后来干脆在学校实验室找了2台486计算机,用两根交叉网线连接,运行:发现ping每次都能通,最后得出的结论是:网卡中断频率太高,系统响应不过来。
  看看我的初始化代码:开两个接收任务,中断数据后投递到邮箱中再处理。
//初始化路由设备
err_t InitRoutingDevices(FILE *fp)
{
  err_t   ret_code = ERR_OK;
  INT8U  errCode = 0;
  INT8U err; //for mutex 用
 
  msgqueue = OSQCreate(&msgqueueTbl[0], MSG_QUEUE_SIZE);
  BufPtr = OSMemCreate(Buf, MAX_PACKET_SIZE, 4, &err);
  //1. netcard 1
  pNetif0->ID = 0;
  pNetif0->base_addr = FREEDEV_LAN91C111_0_BASE;
  pNetif0->irq = FREEDEV_LAN91C111_0_IRQ;
  pNetif0->rx_routine = Ncepu_lan91c111_0_rx;
  pNetif0->irq_routine = Ncepu_lan91c111_0_irq;
  //创建邮箱
  pNetif0->rx_mbox = OSMboxCreate((void *)NULL);
  if(pNetif0->rx_mbox)
  {
      //创建任务
      errCode = OSTaskCreateExt(Ncepu_dev_rx,
                  pNetif0->rx_mbox,
                  (void *)&task1_stk[TASK_STACKSIZE],
                  TASK1_PRIORITY,
                  TASK1_PRIORITY,
                  task1_stk,
                  TASK_STACKSIZE,
                  NULL,
                  0);                
      if(errCode==OS_NO_ERR)
      {
        fprintf(fp,"Creat receive thread ok:ID(%d)/r/n",pNetif0->ID);
      }
  }
  //创建信号量
  //pNetif0->semaphore = OSMutexCreate(TASK1_PRIORITY, &err);
  pNetif0->semaphore = OSSemCreate(1);
  //初始化网卡
  ret_code = InitNetCardIf(pNetif0);
  if(ret_code != ERR_OK)
  {
       ret_code = ERR_IF;
       fprintf(fp,"Init net card failed:ID(%d) BaseAddr(0x%X) IRQ(%d)/r/n",
             pNetif0->ID,pNetif0->base_addr,pNetif0->irq);
       pNetif0->curStatus = 0;
       goto exit;
  }
  else
  {
       pNetif0->curStatus = 1;
       fprintf(fp,"Init net card successed:ID(%d) BaseAddr(0x%X) IRQ(%d)/r/n",
             pNetif0->ID,pNetif0->base_addr,pNetif0->irq);
  }
 
  //2. net card 1 
  pNetif1->ID = 1;
  pNetif1->base_addr = FREEDEV_LAN91C111_1_BASE;
  pNetif1->irq = FREEDEV_LAN91C111_1_IRQ;
 
  pNetif1->rx_routine = Ncepu_lan91c111_1_rx;
  pNetif1->irq_routine = Ncepu_lan91c111_1_irq;
  pNetif1->rx_mbox = OSMboxCreate((void *)NULL);
  if(pNetif1->rx_mbox)
  {
      errCode = OSTaskCreateExt(Ncepu_dev_rx,
                  pNetif1->rx_mbox,
                  (void *)&task2_stk[TASK_STACKSIZE],
                  TASK2_PRIORITY,
                  TASK2_PRIORITY,
                  task2_stk,
                  TASK_STACKSIZE,
                  NULL,
                  0);                
      if(errCode==OS_NO_ERR)
      {
        fprintf(fp,"Creat receive thread ok:ID(%d)/r/n",pNetif1->ID);
      }
  }
  //创建信号量
  //pNetif1->semaphore = OSMutexCreate(TASK2_PRIORITY, &err);
  pNetif1->semaphore = OSSemCreate(1);
 
  ret_code = InitNetCardIf(pNetif1);
  if(ret_code != ERR_OK)
  {
       ret_code = ERR_IF;
       fprintf(fp,"Init net card failed:ID(%d) BaseAddr(0x%X) IRQ(%d)/r/n",
             pNetif1->ID,pNetif1->base_addr,pNetif1->irq);
       pNetif0->curStatus = 0;      
       goto exit;
  }
  else
  {
       pNetif1->curStatus = 1;      
       fprintf(fp,"Init net card successed:ID(%d) BaseAddr(0x%X) IRQ(%d)/r/n",
             pNetif1->ID,pNetif1->base_addr,pNetif1->irq);
  }
 
  //3. set pointers
  pNetif0->pPairCard = pNetif1;      
  pNetif1->pPairCard = pNetif0;   
 
  //Save Uart Pointer
  fpUart = fp;  
  //4.开启中断
  TurnonNetCardIf(pNetif0);
  TurnonNetCardIf(pNetif1);
 
 exit:
  return ret_code;
}
     在网上查找相关的代码,连硬件电路图都没有,别说代码了,这个惨阿!也不知道上面的代码是否科学,从串口打印的数据来看应该是没有问题的。效率低是否与中断频率有关还得进一步证实

抱歉!评论已关闭.