多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
想要使用LwIP,那就必须先将协议栈初始化,我们我们就创建一个函数,在函数中初始化协议栈,注册网卡,设置主机的IP地址、子网掩码、网关地址等,比如作者个人电脑的IP地址是192.163.1.181,那么我们在开发板上设置的IP地址必须是与路由器处于同一子网的,我就设置为192.168.1.122,因为这个地址必须是路由器承认的合法地址,否则路由器不会对这个IP地址的数据包进行转发,网关就写对应的网关(路由器IP地址)192.168.1.1即可,255.255.255.0为整个局域网的子网掩码。 然后挂载我们的网卡,挂载网卡的函数我们也讲解过了,就是netif\_add()函数,如果我们了解了前面章节的内容,移植起来是一点都不费劲的。这里主要讲解一下ethernet\_input()函数,这个函数在ethernet.c文件中(在以前的版本如1.4.1,这个函数在etharp.c文件),主要是用于无操作系统时候LwIP去处理接收到的数据,接收网卡的数据然后往上层递交,对于不同的数据包进行不同的处理,如果是ARP包,则调用etharp\_input()函数交给ARP去处理,更新ARP缓存表;如果是IP包,则调用ip4\_input()函数递交给IP层去处理,在后续会详细讲解,此处了解一下即可,协议栈初始化的源码具体见代码清单 7‑7。 提示:该函数由用户编写,可以随意放在任何地方,作者个人就将它放在main.c文件中。 ``` 1 /*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */ 2 #define IP_ADDR0 192 3 #define IP_ADDR1 168 4 #define IP_ADDR2 1 5 #define IP_ADDR3 122 6 7 /*NETMASK*/ 8 #define NETMASK_ADDR0 255 9 #define NETMASK_ADDR1 255 10 #define NETMASK_ADDR2 255 11 #define NETMASK_ADDR3 0 12 13 /*Gateway Address*/ 14 #define GW_ADDR0 192 15 #define GW_ADDR1 168 16 #define GW_ADDR2 1 17 #define GW_ADDR3 1 18 /* USER CODE END 0 */ 19 20 void LwIP_Init(void) 21 { 22 23 IP4_ADDR(&ipaddr,IP_ADDR0,IP_ADDR1,IP_ADDR2,IP_ADDR3); 24 IP4_ADDR(&netmask,NETMASK_ADDR0,NETMASK_ADDR1, 25 NETMASK_ADDR2,NETMASK_ADDR3); 26 IP4_ADDR(&gw,GW_ADDR0,GW_ADDR1,GW_ADDR2,GW_ADDR3); 27 28 /* Initilialize the LwIP stack without RTOS */ 29 lwip_init(); 30 31 /* add the network interface (IPv4/IPv6) without RTOS */ 32 netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, 33 &ethernetif_init, &ethernet_input); 34 35 /* Registers the default network interface */ 36 netif_set_default(&gnetif); 37 38 if (netif_is_link_up(&gnetif)) 39 { 40 /*When the netif is fully configured this function must be called */ 41 netif_set_up(&gnetif); 42 } 43 else 44 { 45 /* When the netif link is down this function must be called */ 46 netif_set_down(&gnetif); 47 } 48 49 } ```