自定义单片机字库的过程中,为了快速检索目标字符串,把所有字符的unicode编码全部读到了一个String 类型的变量上,然后调用indexof来获取对应的位置,再然后按照位移找到目标字符的编码数据。
运行好好的程序切换到esp8266下居然不能用了,查找了大半天原因,最后发觉出现在数据类型string上。
对于string的操作会出现赋值不全的情况,举例来说,我的字符数据31K,在esp8266上只能读取到16k左右,而esp32却是正常的31k。
这个问题之前也类似出现过,一直不知道原因,还一直以为string是有操作长度,今天终于搞明白了:RAM不够。
ESP8266
HARDWARE: ESP8266 80MHz, 80KB RAM, 4MB Flash
ESP32
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
在esp和arduino环境下,对string进行累加过程中,它能累加的长度是受限于ram的可用空间,8266下的ram有限,它能对string的赋值就有限。
这个问题的关键是这种累加产生的缺失它不报错,所以压根都不知道字符串出现了缺失。
所以如果不是特别必要,不论那种类型存储的数据都不要特别的多。
相同的代码,在不同类型编译下:
esp32
RAM: [= ] 6.7% (used 21964 bytes from 327680 bytes)
Flash: [=== ] 28.9% (used 378921 bytes from 1310720 bytes)
esp8266
RAM: [==== ] 36.4% (used 29828 bytes from 81920 bytes)
Flash: [=== ] 31.8% (used 331811 bytes from 1044464 bytes)
某种角度如果不是简单的控制,需要的GPIO不多,esp8266已经是不应该选择了,我是由于当时烧的太多,一口气买了太多8266了。大哭。
补充说明一点:
过去对于esp32 系列的单片机,wroom和wrover系列到底有什么不同一直没有搞明白,其实就是这个,wrover提供了更多的rom,一般情况下玩玩wroom已经够了,需要更多的内存就需要考虑wrover了或者扩展psram空间。