LWIP+freertos+DM9000

 
 来到合肥已经一个多星期了
本来想记录点什么,但是感觉在QQ 空间上会太过于矫情。于是乎选择了****   先说说故事的开头吧。故事的开头大4那时候就 已经开来到了动漫基地这边实习
第一次工作
然后毕业后去了南京
现在回来了  没想到找了一家公司居然也是在动漫基地这边。可能冥冥中自有安排吧。
哎呀。好像跑题了我要说以太网呢
不好意思不好意思。我先贴波代码。然后组织下语言。
u8 lwip_comm_mem_malloc(void)
{
u32 mempsize;
u32 ramheapsize; 
mempsize=memp_get_memorysize(); //µÃµ½memp_memoryÊý×é´óС
//memp_memory = (u8_t *)pvPortMalloc(3411);//13411
        memp_memory = (u8_t *)pvPortMalloc(mempsize);//13411
//Ϊmemp_memoryÉêÇëÄÚ´æ
printf("memp_memoryÄÚ´æ´óСΪ:%d\r\n",mempsize);
ramheapsize=LWIP_MEM_ALIGN_SIZE(MEM_SIZE)+2*LWIP_MEM_ALIGN_SIZE(4*3)+MEM_ALIGNMENT;//  µÃµ½ram heap´óС
//ram_heap= (u8_t *)pvPortMalloc(6172); //Ϊram_heapÉêÇëÄÚ´æ 
ram_heap= (u8_t *)pvPortMalloc(ramheapsize); //Ϊram_heapÉêÇëÄÚ´æ 
printf("ram_heapÄÚ´æ´óСΪ:%d\r\n",ramheapsize);
//TCPIP_THREAD_TASK_STK=mymalloc(SRAMIN,TCPIP_THREAD_STACKSIZE*4); //¸øÄÚºËÈÎÎñÉêÇë¶ÑÕ» 
//LWIP_DHCP_TASK_STK=mymalloc(SRAMIN,LWIP_DHCP_STK_SIZE*4); //¸ødhcpÈÎÎñÉêÇë¶ÑÕ» 
//LWIP_DM9000_INPUT_TASK_STK=pvPortMalloc(536887952); //¸ødm9000½ÓÊÕÈÎÎñÉêÇë¶ÑÕ» 
  LWIP_DM9000_INPUT_TASK_STK=pvPortMalloc(512);
// if(!memp_memory||!ram_heap||!TCPIP_THREAD_TASK_STK||!LWIP_DHCP_TASK_STK||!LWIP_DM9000_INPUT_TASK_STK)//ÓÐÉêÇëʧ°ÜµÄ
if(!memp_memory||!ram_heap)
{
//lwip_comm_mem_free();
printf("neicun shenqing failed\r\n");
return 1;
}
return 0;
}
//lwipÄں˲¿·Ö,ÄÚ´æÊÍ·Å
void lwip_comm_mem_free(void)
{
// myfree(SRAMIN,memp_memory);
// myfree(SRAMIN,ram_heap);
// myfree(SRAMIN,TCPIP_THREAD_TASK_STK);
// myfree(SRAMIN,LWIP_DHCP_TASK_STK);
// myfree(SRAMIN,LWIP_DM9000_INPUT_TASK_STK);
}




//lwip ĬÈÏIPÉèÖÃ
//lwipx:lwip¿ØÖƽṹÌåÖ¸Õë
void lwip_comm_default_ip_set(__lwip_dev *lwipx)
{
//ĬÈÏÔ¶¶ËIPΪ:192.168.1.100
lwipx->remoteip[0]=192;
lwipx->remoteip[1]=168;
lwipx->remoteip[2]=1;
lwipx->remoteip[3]=127;
//MACµØÖ·ÉèÖÃ(¸ßÈý×ֽڹ̶¨Îª:2.0.0,µÍÈý×Ö½ÚÓÃSTM32ΨһID)
lwipx->mac[0]=dm9000cfg.mac_addr[0];
lwipx->mac[1]=dm9000cfg.mac_addr[1];
lwipx->mac[2]=dm9000cfg.mac_addr[2];
lwipx->mac[3]=dm9000cfg.mac_addr[3];
lwipx->mac[4]=dm9000cfg.mac_addr[4];
lwipx->mac[5]=dm9000cfg.mac_addr[5]; 
//ĬÈϱ¾µØIPΪ:192.168.1.30
lwipx->ip[0]=192;
lwipx->ip[1]=168;
lwipx->ip[2]=1;
lwipx->ip[3]=30;
//ĬÈÏ×ÓÍøÑÚÂë:255.255.255.0
lwipx->netmask[0]=255;
lwipx->netmask[1]=255;
lwipx->netmask[2]=255;
lwipx->netmask[3]=0;
//ĬÈÏÍø¹Ø:192.168.1.1
lwipx->gateway[0]=192;
lwipx->gateway[1]=168;
lwipx->gateway[2]=1;
lwipx->gateway[3]=1;
lwipx->dhcpstatus=0;//ûÓÐDHCP



//LWIP³õʼ»¯(LWIPÆô¶¯µÄʱºòʹÓÃ)
//·µ»ØÖµ:0,³É¹¦
//      1,ÄÚ´æ´íÎó
//      2,DM9000³õʼ»¯Ê§°Ü
//      3,Íø¿¨Ìí¼Óʧ°Ü.
u8 lwip_comm_init(void)
{
u32 cpu_sr;
u8 err;
struct netif *Netif_Init_Flag; //µ÷ÓÃnetif_add()º¯ÊýʱµÄ·µ»ØÖµ,ÓÃÓÚÅжÏÍøÂç³õʼ»¯ÊÇ·ñ³É¹¦
struct ip_addr ipaddr;  //ipµØÖ·
struct ip_addr netmask; //×ÓÍøÑÚÂë
struct ip_addr gw;      //ĬÈÏÍø¹Ø 
if(lwip_comm_mem_malloc()) return 1;  //ÄÚ´æÉêÇëʧ°Ü
printf("neicun  shenqing Success!\r\n");


BinarySemaphore=xSemaphoreCreateBinary(); //´´½¨Êý¾Ý½ÓÊÕÐźÅÁ¿
MutexSemaphore=xSemaphoreCreateMutex();////LWIP----´´½¨»¥³âÐźÅÁ¿ 
if(DM9000_Init())return 2; //³õʼ»¯DM9000AEP
printf("DM900  init!\r\n");
tcpip_init(NULL,NULL); //³õʼ»¯tcp ipÄÚºË,¸Ãº¯ÊýÀïÃæ»á´´½¨tcpip_threadÄÚºËÈÎÎñ
printf("tcpip init!\r\n");
lwip_comm_default_ip_set(&lwipdev); //ÉèÖÃĬÈÏIPµÈÐÅÏ¢
  printf("set config ip!\r\n");


#if LWIP_DHCP //ʹÓö¯Ì¬IP
ipaddr.addr = 0;
netmask.addr = 0;
gw.addr = 0;
#else //ʹÓþ²Ì¬IP
IP4_ADDR(&ipaddr,lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
IP4_ADDR(&netmask,lwipdev.netmask[0],lwipdev.netmask[1] ,lwipdev.netmask[2],lwipdev.netmask[3]);
IP4_ADDR(&gw,lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
printf("Íø¿¨enµÄMACµØÖ·Îª:................%d.%d.%d.%d.%d.%d\r\n",lwipdev.mac[0],lwipdev.mac[1],lwipdev.mac[2],lwipdev.mac[3],lwipdev.mac[4],lwipdev.mac[5]);
printf("¾²Ì¬IPµØÖ·........................%d.%d.%d.%d\r\n",lwipdev.ip[0],lwipdev.ip[1],lwipdev.ip[2],lwipdev.ip[3]);
printf("×ÓÍøÑÚÂë..........................%d.%d.%d.%d\r\n",lwipdev.netmask[0],lwipdev.netmask[1],lwipdev.netmask[2],lwipdev.netmask[3]);
printf("ĬÈÏÍø¹Ø..........................%d.%d.%d.%d\r\n",lwipdev.gateway[0],lwipdev.gateway[1],lwipdev.gateway[2],lwipdev.gateway[3]);
#endif
Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,&ethernetif_init,&ethernet_input);//ÏòÍø¿¨ÁбíÖÐÌí¼ÓÒ»¸öÍø¿Ú
if(Netif_Init_Flag != NULL) //Íø¿ÚÌí¼Ó³É¹¦ºó,ÉèÖÃnetifΪĬÈÏÖµ,²¢ÇÒ´ò¿ªnetifÍø¿Ú
{   
netif_set_default(&lwip_netif); //ÉèÖÃnetifΪĬÈÏÍø¿Ú
printf("set netif!\r\n");
netif_set_up(&lwip_netif); //´ò¿ªnetifÍø¿Ú
printf("netif add success!\r\n");
}
taskENTER_CRITICAL();//rtos½øÈëÁÙ½çÇø
xTaskCreate((TaskFunction_t )lwip_dm9000_input_task,     
                (const char*    )"lwip_dm9000_input_task",   
                (uint16_t       )LWIP_DM9000_INPUT_TASK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )LWIP_DM9000_INPUT_TASK_PRIO,
                (TaskHandle_t*  )&LWIP_DM9000_INPUTTask_Handler); 
taskENTER_CRITICAL();//rtosÍ˳öÁÙ½çÇø
#if LWIP_DHCP

#endif
return 0;//²Ù×÷OK.
}
//Èç¹ûʹÄÜÁËDHCP




  //¢DM9000Êý¾Ý½ÓÊÕ´¦ÀíÈÎÎñ
void lwip_dm9000_input_task(void *pdata)
{
printf("recev  ping data!\r\n");
//´ÓÍøÂ绺³åÇøÖжÁÈ¡½ÓÊÕµ½µÄÊý¾Ý°ü²¢½«Æä·¢Ë͸øLWIP´¦Àí 
ethernetif_input(&lwip_netif);
}
故事分两头
话说这不刚来新公司吗。第一个任务就是去把裸机的lwip 协议栈移植到freertos 上。至于为什么会是freertos 因为这货免费啊。做成产品后不用交保护费啊。
于是乎我就开始苦逼的加班移植了。移植的这边时间。基本上都是干到晚上10点啊。各种百度谷歌
当然10点对于在学校那会是很正常不过了。但是我后来去了南京  整个人就堕落了。每天都是5点准时下班就跑。这个南京的经历后面再说。先说lwip 
一说到这lwip 我就想抽自己啊。有句话怎么说来着。所有的累都是以前不努力的结果。这句话说的太tm对了,我其实刚去南京实习的时候  我那经理让我做的就是裸机移植lwip   然后才有了后面的面试吹牛逼  然后才有了现在的加班到10点多
所以这件事告诉我们一个深刻的道理。面试的时候一定不到吹牛逼。要不然最后坑比的还是自己,哎。算是给**** 的小伙伴一个忠告吧。  希望看到的都是务实的好孩子。而且吹牛逼这有瘾。我这已经在这条路上越走越远估计是还不了的。
不过还好。怎么说当年在南京还是认真学习过lwip 的。终于在经历大概一个星期后
成功移植成功rtos +lwip +dm9000
下面上ping 成功截图。
LWIP+freertos+DM9000
简直是满满的成就感啊。

公司是做安防监控方面的。老大的意思是做rtos   Lwip snamp   mqtt ,这些当然目前已经全部做完了,本来打算 当时RTOS+LWIP做完就更****的,但是无奈事情太多,这事就搁置了,今天突然想起来了这事,就更一波LWIP+RTOS的,后面的以后有时间再更啊,欢迎Mark啊。