|
本帖最后由 netlhx 于 2015-8-30 11:44 编辑 ETH折腾得最久,足足两个星期,终于搞清楚了一点皮毛。 主要原因,一是LWIP结构有点复杂,看例程及源码足足一个星期,算是简单入门。毕竟这个牵涉到网络结构。二是顺带看了一下HTTP的通信过程,什么GET, POST等数据通信方法,现在还是迷迷糊糊的。不过程序总算跑起来了,再慢慢研究。 下面先说几点体会,供菜鸟们一起学习参考,老鸟们请路过并指导! 1 关于IEEE的七层网络模型,这个要了解一下,大致了解通信过程。重点是TCP/IP的四层模型。这些知识会具体体现在LWIP提供的各API中。 2 LWIP提供了几种类型的API,一种是所谓的RAW API,就是原生的TCP/IP通信,这种通信效率最高,写起来也最难,我是直接不管它。二是NETCONN模型,通过对RAW API进行封装,API更抽象,用起来相对简单;但是这个需要RTOS的支持,所以其副作用就是需要额外的了解RTOS,好在前面也花了一段时间研究FREERTOS。第三种就是BSD类型的API,这种类型的API使用SOCKET来进行网络通信,适合那些曾经接触过SOCKET编程的老鸟们,再慢慢研究吧。 3 底层驱动,也就是所谓的ETHERNETIF,这个就是以太网接口。它是上层的IP与底层的硬件之间的接口,也就是通常意义上的网卡驱动。这个过程包括GPIO初始化,ETH控制器及PHY的初始化。F7-DISCO使用的是内置的ETH控制器,外置的PHY接口。这个地方坑爹的地方在于,我们要设置PHY的地址,这个值为0,但我查看原理图的时候硬是没找着。一直按的是1来初始化,结果是导致了DHCP不能获取到正确的IP地址。这一个地方就折腾了3天! 4 如果要自动获取IP地址的话,还需要了解一下DHCP的原理及初始化过程,这里需要注意的地方就是通过全局的NETIF中的DHCP变量来查看初始化过程中的返回状态,直到得到DHCP_BOUND的返回值。才表明正确得到了DHCP IP地址。 5 关于调试,建议初学者不要打开LWIP自带的DEBUG输出功能,否则你会被那些输出信息淹死的。就算要开,也是一个一个的打开。充分利用串口输出来查看代码的执行情况,效果也许会更好。 上面都是自己的一点个人体会,也许老鸟们会有更好的做法,欢迎指出。 一、生成LWIP代码框架 由于LWIP结构有点复杂,建议新手们还是使用STM32CUBEMX来生成框架,需要注意的是,要想得到更好的性能,对于LWIP中的一些内存大小的分配要仔细考虑,只是刚开始的时候,这个度也不是很好把握,慢慢来吧。 我使用的是NETCONN API,所以还要启用FREERTOS的支持,如果使用其它的RTOS,需要调整一些相应的代码。 二、代码简单分析 正如TCP/IP分层模型一样,LWIP也将代码结构按层次组织,简单点来说,工程里面将代码按层次分为LWIP层及底层的ETHETNET层来处理。LWIP实现TCP/IP通信,ETHERNETIF实现物理层通信。这里特别要注意的是数据链路层实际被分开为数据链路层LL及MAC子层,但LL层被划分到了LWIP里,而MAC则是在ETHERNETIF层。 下面是初始化框架
1 Netif_add函数的倒数两个参数,这两个参数是两个函数,分别负责ETHERNET的初始化和输入数据的处理。 2 dhcp_start负责获取IP地址,需要一个DHCP服务器,使用一个与电脑相连的DHCP服务器即可。 如果配置正确的话,应该可以获取到正确的IP地址。
HTTP服务器配置 打开LWIP源代码的CONTRIB目录下的APPS,里面有一个示例代码,如果使用的是FREERTOS的话,基本不需要修改就可以照用了,如果使用其它的RTOS,需要修改LWIP里的sys_arch.c文件里的实现,这实际上就是在实现LWIP的移植!
实际上这里就是把HTTP服务器以一个任务的形式实现,代码如下
运行的效果
虽然代码跑起来了,还有很多事情要做,接下来准备做一个WEB控制界面,来实现通过WEB控制一些简单外设如LED灯的控制。 最后再说一句,新手学习LWIP的话,最好先拿一个例程开刀,把它吃透了,也就弄明白了。虽然这个过程不是一下就能搞清楚的,中间肯定要查找很多的资料,但物有所值啊!还有一点,网络模型这个东西不要太陷进去了,免得到时出不来,够用就行了! |
微信公众号
手机版
汗,这不是教程,写给自己看的笔记
汗,这不是教程,写给自己看的笔记
哈哈,差不多啦
一起研究,我了解一点皮毛而已