由于目的是,用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;
}
在网上查找相关的代码,连硬件电路图都没有,别说代码了,这个惨阿!也不知道上面的代码是否科学,从串口打印的数据来看应该是没有问题的。效率低是否与中断频率有关还得进一步证实