我发现在esp32上运行的应用程序中的行长度是有限的。下面是生成字符串的应用程序:
main :
loop ::= 2459
text := ""
stamp := "1234567890"
loop.repeat :
text += stamp
print ("$text.size") 如果循环::= 2458,那么一切都很好:
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$ toit run test_str.toit
2021-06-02T17:03:43.237309Z: <process initiated>
24580
2021-06-02T17:03:44.575860Z: <process terminated - exit code: 0>如果循环::= 2459,则会出现内存分配错误:
micrcx@micrcx-desktop:~/toit_apps/Hsm3/tests$ toit run test_str.toit
2021-06-02T17:04:03.507773Z: <process initiated>
2021-06-02T17:04:04.907154Z: <stack trace>
EXCEPTION error.
ALLOCATION_FAILED
0: string.+ <sdk>/core/string.toit:274:5
1: main.<block> /home/micrcx/toit_apps/Hsm3/tests/test_str.toit:6:10
2: SmallInteger_.repeat <sdk>/core/numbers.toit:209:3
3: main /home/micrcx/toit_apps/Hsm3/tests/test_str.toit:5:8
4: __entry__.<lambda> <sdk>/core/entry.toit:46:20
2021-06-02T17:04:04.954257Z: <process terminated - exit code: 1>当然,所有这些错误都不是致命的,知道实数是件好事,例如字符串、列表、哈希映射等的最大长度,以便编写一个应用程序,因为json文件的大小已经超过了允许的数量,所以在某一点上不会掉下来。
发布于 2021-06-03 08:57:14
在字符串、列表、映射等方面没有任何真正的大小限制。
系统只是尝试为这些对象分配空间,并在内存不足时报告一个错误。显然,这对所有对象都施加了根本的限制: ESP32最多有520 that,因此任何数据结构都不能超过这个大小。
然而,还有更多的限制发挥作用。例如,IRAM内存具有与DRAM不同的属性,并且不适合正常的数据。类似地,系统也使用了一些内存。
对于某些数据结构,如字符串,内存在连续区域也很重要。碎片会导致无法再分配更大的字符串的情况,因为所有空闲内存都位于字符串不适合的较小的洞中。
请注意,使用+构建字符串也意味着周围总是有前一个字符串的副本,这将使程序所需的空间加倍。
下面是一个示例,以说明字符串根本上不限于~25K:
main :
loop ::= 4500
stamp := "1234567890"
text := stamp * loop
print "$text.size"字符串上的*运算符分配所需的大小,因此不需要任何其他副本(如循环中的副本)。
发布于 2021-11-16 16:32:12
使用Arduino ESP32 webserver服务器库时,我意识到当我试图打印生成网页的HTML时,我会得到以下错误,即使520 free是相当多的RAM,而且我有173 K的空闲堆:
String WEBPAGE = "lots of chars"
Serial.println(WEBPAGE);
Serial.printf("Free heap: %u\n", ESP.getFreeHeap());我在控制台上
E (49837) uart: uart_write_bytes(1159): buffer null
Free heap: 173831我发现原因是字符串网页太大(大约50k字符),使用较小的字符串,错误不会发生。因此,下面的函数不工作,没有发送和空字符串,我在浏览器上看到了一个白色的空白页面。
server.send(200, "text/html", WEBPAGE);我想这是在ESP32上使用字符串的一个很大的限制
更多细节这里。
https://stackoverflow.com/questions/67810233
复制相似问题