桥梁建设工程网站,静态网页模版,网站建设三个阶段,网站的主要栏目及功能继上一篇笔记#xff0c;成功开启了littlefs文件系统#xff0c;能读写FLASH上的文件了。 今天继续研究网络功能#xff0c;让控制台的ping命令能工作。 轻量级系统使用的是liteos_m内核lwip协议栈实现网络功能#xff0c;需要进行配置开启lwip支持。 lwip的移植分为两部分…继上一篇笔记成功开启了littlefs文件系统能读写FLASH上的文件了。 今天继续研究网络功能让控制台的ping命令能工作。 轻量级系统使用的是liteos_m内核lwip协议栈实现网络功能需要进行配置开启lwip支持。 lwip的移植分为两部分一部分是sys_arch用于适配rtos这部分liteos_m已经实现了 相关代码在/kernel/liteos_m/components/net/lwip-2.1/porting/src
另一部分则是网卡驱动的适配这部分代码适配起来和其它平台基本一样。 自己写一个ethernetif.c在里面实现ethernetif_init完成网卡初始化。 并定义一个struct netif实例指定一些参数如下具体代码可以抄官方demo。
netif-name[0] e;
netif-name[1] n;
netif-output etharp_output;
netif-linkoutput low_level_output;
网卡驱动的大概流程
ethernetif_init由lwip在添加网卡的时候调用初始化底层ETH模块 然后创建一个线程和信号量用于接收ETH的数据 在接收线程里等待信号量在ETH中断里发送信号量唤醒接收线程 接收线程调用low_level_input读取ETH数据放入pbuf中并返回这个pbuf; 最后将pbuf丢给netif-input处理这个函数在/third_party/lwip/src/netif/ethernet.c里面。 当协议栈要发送数据时它会调用low_level_output数据放在pbuf参数里面。 struct pbuf *p;struct netif *netif (struct netif *)stm32_netif;for (;;){if (osSemaphoreAcquire(ethSemaphore, osWaitForever) osOK){do {p low_level_input(netif);if (p ! NULL){if (netif-input(p, netif) ! ERR_OK){pbuf_free(p);}}} while (p ! NULL);}} 这里简单记录一下lwip的初始化过程
1. 在内核初始化完成之后调用tcpip_init(NULL, NULL);初始化lwip。
2. 然后调用netif_add向lwip添加网卡指定默认IP地址网关等信息。
netif_add(stm32_netif, ipaddr, netmask, gateway, NULL, ethernetif_init, ethernet_input);
netif_set_default(stm32_netif);
netif_set_up(stm32_netif);
3. 如果需要DHCP获取IP则启动dhcp client。
dhcp_start(stm32_netif);
dhcp_supplied_address(stm32_netif); //判断DHCP状态
lwip的初始化就完成了。 抄完代码就开始编译调试可以看到eth初始化的一些日志然后ifconfig命令也能用了。 但是却发现ping不通其它IP还要继续调试找找原因。 经过一番研究最后发现在/kernel/liteos_m/components/net/lwip-2.1/porting/include/lwip/lwipopts.h 这里面定义了ETH_PAD_SIZE2导致lwip数据解析错位要把它改为0。
#define ETH_PAD_SIZE 0 //从2改为0