LwIP(Light Weight Internet Protocol),小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用。它只需十几KB的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。很多嵌入式系统用的MCU提供的RAM资源都很紧缺,目前我接触的最大的是300K,但是实时系统等等一跑起来,差不多就占据了100K,外加其他七七八八,最终能剩150K也算得上资源充足了。所以 LwIP往往是嵌入式系统中不可或缺的存在。由于这部分代码着实生猛,堪比裹脚布,无法把全部代码贴出来。如果有条件贴出代码,就算我对每一行都进行注释,那最终你还是无法快速地把整个工程串起来。一般接手一个工程项目,最开始做的是熟悉其代码框架,然后再斟酌项目需求等具体要实现的功能。尽管自学有足够的时间,但是拿到一个demo也必须要先串通整个代码框架,然后才能去仔细分析模块化的东西并着手调试。那怎么串通整个代码框架呢?就以LwIP实现机制为例,首先要知道函数调用关系,并大概了解各个函数作用即可,知道代码运行流程。通过这一步目标也就不远了,但是往往这一步就非常不容易。其次就是深入各个函数的内部看其功能实现了。 这部分代码以当前我正在负责开发的项目为例,首先先理清各 函 数 调用关系 ,看硬件上电系统初始化都做了哪些工作。
Wifi_Init() wifi_drv_init() hal_lmac_set_dl_callback(nrc_mac_rx);//注册网络数据接收回调函数 nrc_mac_rx() nrc_wpa_data_rx(&rx); nrc_wpa_data_rx() nrc_wpa_lwip() lwif_input_from_net80211(vif_id, rx->u.frame + rx->offset_8023,rx->len); netif->input(p, netif)//该函数为tcpip_input() tcpip_inpkt(p, inp, ethernet_input);//return tcpip_inpkt(p, inp, ip_input);//#define ip_input ip4_input ethernet_input() ip4_input() tcp_input() tcp_process() TCP_EVENT_CONNECTED(pc