求助!!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;
}
}
希望各位能指点一下,感激不尽!!
发表时间:2007年7月16日11:16:24