乐鑫的ESP8266 WIFI解决方案,不仅仅只是一个UART串口转WIFI的透传模块!

YimingLi
Posts: 51
Joined: Sun May 03, 2015 5:36 pm

乐鑫的ESP8266 WIFI解决方案,不仅仅只是一个UART串口转WIFI的透传模块!

Postby YimingLi » Wed Jul 19, 2017 10:40 am

近期在有关ESP8266的一些技术群里,常遇到的几个问题的,这里有一些解决思路,和大家分享一下,仅供参考,欢迎斧正。

【目的】(1)希望以后大家若遇到类似问题能有所参考。(2)也不要轻易就因为某些误解或谬论流传而误以为“乐鑫芯片弱”就放弃了;一些有影响力的模块供应商及其技术支持人员,可能因为自己的模块所支持的功能有局限,或者因为自己误解,也常见他们将责任归咎于“乐鑫芯片弱”或“SDK不支持”;所以,在这里顺便做一个澄清: 实际上,有可能是自己没有用好或做好乐鑫的芯片,或者没有把乐鑫的功能代码给集成进来。(3)希望大家一起来,多多挖掘和拓展乐鑫ESP8266芯片及其SDK库做提供的更多更好的功能,做到,不仅仅是便宜,而且可靠、强大。

【以下问题基本都是是一些技术交流群里的原话,回答部分是一个参考思路,仅供参考】

1、“我想在ESP8266上集成一个网页服务器,但发现网页不能太大,因为乐鑫留给用户的RAM很小,网页稍微大一点,就编译通不过。可见乐鑫芯片渣。"

答:不是乐鑫的问题, 也不是乐鑫芯片弱。开发人员可以利用“ICACHE_RODATA_ATTR STORE_ATTR”将网页数据放置在FLASH里,就不占用RAM空间了。当需要显示网页时,由系统将当前所需要的那一小部分网页数据载入缓存再发给浏览器。


2、“乐鑫ESP8266WIFI模块,只是一个慢速WIFI,透传速度只能有几十K,做不了太复杂的应用和太高速的透传。”

答:不是乐鑫的问题,也不是乐鑫芯片弱。这是因为大多数的esp8266模块是以串口作为主机接口的,在这里,串口的速度成为瓶颈而限制了系统的整体速度。

一个单片机透传通信系统,所表现出来的最终的整体速度,是由系统中的每一个环节,尤其是成为短板的那个环节,所决定:

单片机主机和ESP8266WIFI模块之间的主机接口数据交互 --> 模块处理转化,并通过WIFI收发 --> 网络环境以及对方节点处理的影响

如果您所使用的模块,通过串口或其他慢速接口来和单片机主机通信,而这些接口的速度只有几十K,那么,即使ESP8266模块和网络环境本身能支持几百K或到兆M字节每秒的速度,但整个系统的速度也会上不去。串口的写入速度,在这里可能成为了瓶颈。而您如果换成使用ESP8266芯片的SPI接口或者其他更高速度的主机接口,透传速度就可能显著提高。

3、“我参考乐鑫SDK里的SPI代码,编译了一个固件,实现了SPI-WIFI透传,但是发现速度也只有200-300K字节每秒,所以,乐鑫的透传速度还是很慢的。可能是因为便宜货,不可能做很高速。"

答:不是乐鑫的问题,也不是乐鑫芯片或者SDK慢。可能是因为您的单片机主机的SPI读写、在您的固件中对于缓冲区的处理、SPI-WIFI转化的处理不够优化;或者网路环境的限制。

参考上面的单片机通信系统示意简图。

举例说明,如果您的单片机 SPI时钟频率只有2MHz,实际SPI有效的写入速度假设只有150K字节每秒,那么,您的系统的整体透传速度,当然超不过150K字节每秒了。

因此,对于高速透传,不仅仅是一个WIFI模块的问题,也需要您想办法提高系统“可靠的SPI读写通信”时的SPI频率(不是单片机芯片理论上支持的最大SPI速度,而是您将单片机主机和ESP8266模块连接好,压力测试下SPI字节读写几乎不出错的最高频率,这个才是您的系统的SPI的实际可靠通信频率),同时,还需要要提高SPI有效读写的效率,总之,就是让单片机主机和模块SPI通信读写字节的“有效”速度,真正高效真正够高。

关于SPI频率和真正的读写效率,大家可能知道,在同样频率下,DMA SPI的实际有效速度就比简单的SPI读写快,这就是一个SPI频率相同但是读写效率与差别的例子。所以,虽然您的单片机SP频率可能很高,但是如果您的单片机代码里的SPI读写效率很低,实际得到的速度也不会高。

所以,如果您的SPI读写速度不够高,假设只有150K字节每秒或300K字节每秒,那么,即使ESP8266模块做得再好,所支持的透传速度再高,系统的整体速度也上不去。这类问题,不是因为乐鑫ESP8266芯片弱,也不是因为乐鑫的SDK支持不了快速的问题。

此外,无论是UDP还是TCP,无线通信都可能发生丢包(发送方发出了一个包,但是接收方却没有收到)。而TCP比UDP所谓"通信可靠”的原因,是因为发送后接收方是需要ACK确认的。如果发送方没有收到ACK,它会重发。所以,TCP虽然有所谓的“可靠传输”的优点,但同时也可能会导致速度降低,严重时可能会造成阻塞。任何系统下,TCP也并非完全不会丢包。

网络环境方面的影响,牵涉到路由器、带宽共享、接收方的处理与反馈、信号强弱、射频干扰、频率对准.....,都可能造成通信过程中的丢包(或者因为丢包而重发)。如果简单地通过接收方的接收速度来反推发送方的速度,都可能造成一种错觉,认为ESP8266 模块的速度不高,或者怀疑ESP8266芯片很弱或SDK速度不快。而如果您希望您的系统的最终速度足够高,充分发挥您的WIFI模块的高速透传性能,这里列举的要素,可能也是您在实际应用场合优化系统通信速度时,可以考虑的切入点。

为了给大家一个直观的理解,再举个例子来类比:在现实中,我们经常有类似的体验,电脑即使通过一个超高速无线网卡来传输文件,但是速度经常会一直只有几十K字节每秒,但换个环境或场合却可以达到几M字节每秒。所以,即使测试得到几十K的速度,显然也不代表该网卡只支持几十K字节每秒。

乐鑫的测试数据显示,网络透传速度是可以到20MBPS的。一些群友自己做的SPI高速透传模块,在普通环境下,也轻松到达大几百K字节每秒或者过M字节每秒。所以,单就ESP8266芯片本身、以及某些支持高速透传的ESP8266模块本身,都是支持高速到M字节每秒的SPI-WIFI高速透传的。但是,也需要处理好单片机网络系统中的其他环节,只有当他们不成为整个系统的短板,整个系统的透传速度,才可能达到较高,才可能充分发挥ESP8266芯片的正常性能。我们不能因为测试得到的系统速度上不去,就将责任简单地归咎于ESP8266芯片弱或乐鑫的SDK不支持。

网络通信系统是一个比较复杂的系统,牵涉到比较多的方面;而单片机WIFI通信开发,与在电脑或智能移动终端上做网络通信开发或者高层的Java网络编程比较起来,所涉及到的方面可能会更多更复杂,接触的网络通信的底层也更多;和基本的单片机编程比较起来,涉及面可能也更广更复杂,需要一些网络通信的基础知识或常见问题的处理经验,不仅仅只是一个中间的ESP8266WIFI模块做到高速就可以了。遇到问题时,可以多多上百度查找答案,这里有很多问题、测试策略、或优化策略,不是只有在使用ESP8266 WIFI模块通信时才会遇到的,而是许多网络设备在进行网络通信都会遇到的基本问题或常见经验,不限于ESP8266WIFI模块。所以,百度一下是可以找到很多相似问题的答案以及参考。

另外,高速系统和低速系统比较,意味着各个方面的要求更高,留给系统其他环节的裕量也会大大减少,如果某个环节没有考虑周到随便浪费一点,就可能造成系统的整体性能下降。举例说明:如果你只是传几个字节的简单的控制,实时性要求不高,单片机啥时候抽空去传一下,就可以的了,占用单片机或模块的时间资源也不会很多。但是,如果您换成去传一个100K字节的数据量,你可以设想一下,您的单片机搬运数据读写数据、以及模块处理和发送,需要的缓存以及时间,需要更多,所以牵涉到处理,也会更复杂,考虑也需要更周到。一个简单计算,16字节数通过1K字节每秒的网速传可能需要15ms,占用资源不多,您的单片机可能随便处理一下,可能就可以实现您的需求了;但是如果您需要传输100K字节,即使您是通过500K的网速传,也需要200ms,比起15ms多很多了;如果您使用的普通SPI读写, SPI的有效速度只有200K字节每秒,那意味着什么? 单说您的单片机这边的SPI写,就需要2-3秒,如果您没有处理好整个系统,那可能意味着单片机做点其他的事情,就可能导致SPI读写效率大大降低而导致透传速度降低。所以,做高速透传,不是简单地可以按照慢速方式处理一下就来做出判断的,很多单片机底层的处理,都是需要兼顾考虑的,这样,才可能发挥ESP8266 WIFI模块的正常性能。当然,这也不是ESP8266WIFI芯片或模块的问题,如果你换其他的高速WIFI模块,同样的单片机处理机制,也会遇到类似的问题,所以,这不是一个ESP8266WIFI芯片或SDK的问题,而是你的系统的对高速处理的问题。

4、“乐鑫ESP8266芯片的处理速度不快,例如,如果功能做多了,响应就变慢了。”

答:乐鑫ESP8266芯片的主频为80MHz,和许多单片机比较起来,主频相当不差了。另外,其主频速度可以超频到160MHz,经过批量产品化测试,运行在160MHz下也足够稳定(可以对比一下,大家常用的性能不错的STM32F4,其主频一般也只有168MHz左右)。

当然,主频只是代表单片机处理速度的一个方面,但是用来做为速度粗略评估也是可行的。

如果您在ESP8266上集成了跟多功能后,发现处理响应速度变慢了,建议您检查一下,是否因为缓存(避免溢出)处理、任务优先级或调度分配等方面,没有考虑好?

特别地,您最好确保,模块在运行过程中始终能预留出足够的空闲堆(free heap)。您可以调用system_get_free_heap_size()查看初始化完毕后、以及运行过程中的free heap的大小。当您在ESP8266上集成了较多功能后,请尽量将一些不常用的常量放到flash里,可以来确保有足够的free heap。

有的esp8266模块开发人员,在esp8266上集成了不少复杂功能的功能,包括内嵌网页、很多很复杂的AT指令扩展、过兆字节每秒的SPI高速透传、加密算法、集成了机智云及其应用等等......,但响应速度并未见发现有所降低,有一个很重要的原因,就是经过仔细处理确保模块上始终预留了足够大小的free heap。

那么,为何要确保系统时钟能预留足够的free heap呢,这可能牵涉到许多应用以及乐鑫底层SDK对heap的使用机制,不便展开说,如果你于兴趣,自己去做一些测试代码,可以进一步理解。一种直观但可能不严谨的理解,可以参考电脑或智能设备的内存使用情况,当他们的剩余内存变少低于某个数值后,系统就会变慢。

以上文字,一家之言,仅供参考,欢迎扶正!

【结论】

乐鑫的ESP8266芯片,真的足够好,功能足够强大,当遇到问题时,建议大家多多上乐鑫论坛寻找答案。也希望大家一起来,多多探索拓展乐鑫芯片的功能(其实也不需要探索。在乐鑫的这个论坛,都有现成的。所以,多多上乐鑫论坛搜索查找吧)。

乐鑫的ESP8266 WIFI解决方案,不仅仅是一个UART串口转WIFI的透传模块!
ESP8266 WIFI Solution,more than a UART-WIFI Converter!

Who is online

Users browsing this forum: No registered users and 12 guests