首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Esp32字符串长度限制

Esp32字符串长度限制
EN

Stack Overflow用户
提问于 2021-06-02 17:56:22
回答 2查看 1.4K关注 0票数 0

我发现在esp32上运行的应用程序中的行长度是有限的。下面是生成字符串的应用程序:

代码语言:javascript
复制
main :
  loop ::= 2459
  text  := ""
  stamp := "1234567890"
  loop.repeat :
    text += stamp
  print ("$text.size")  

如果循环::= 2458,那么一切都很好:

代码语言:javascript
复制
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,则会出现内存分配错误:

代码语言:javascript
复制
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文件的大小已经超过了允许的数量,所以在某一点上不会掉下来。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-03 08:57:14

在字符串、列表、映射等方面没有任何真正的大小限制。

系统只是尝试为这些对象分配空间,并在内存不足时报告一个错误。显然,这对所有对象都施加了根本的限制: ESP32最多有520 that,因此任何数据结构都不能超过这个大小。

然而,还有更多的限制发挥作用。例如,IRAM内存具有与DRAM不同的属性,并且不适合正常的数据。类似地,系统也使用了一些内存。

对于某些数据结构,如字符串,内存在连续区域也很重要。碎片会导致无法再分配更大的字符串的情况,因为所有空闲内存都位于字符串不适合的较小的洞中。

请注意,使用+构建字符串也意味着周围总是有前一个字符串的副本,这将使程序所需的空间加倍。

下面是一个示例,以说明字符串根本上不限于~25K:

代码语言:javascript
复制
main :
  loop ::= 4500
  stamp := "1234567890"
  text := stamp * loop
  print "$text.size"

字符串上的*运算符分配所需的大小,因此不需要任何其他副本(如循环中的副本)。

票数 1
EN

Stack Overflow用户

发布于 2021-11-16 16:32:12

使用Arduino ESP32 webserver服务器库时,我意识到当我试图打印生成网页的HTML时,我会得到以下错误,即使520 free是相当多的RAM,而且我有173 K的空闲堆:

代码语言:javascript
复制
    String WEBPAGE = "lots of chars"
    Serial.println(WEBPAGE);
    Serial.printf("Free heap: %u\n", ESP.getFreeHeap());

我在控制台上

代码语言:javascript
复制
    E (49837) uart: uart_write_bytes(1159): buffer null
    Free heap: 173831

我发现原因是字符串网页太大(大约50k字符),使用较小的字符串,错误不会发生。因此,下面的函数不工作,没有发送和空字符串,我在浏览器上看到了一个白色的空白页面。

代码语言:javascript
复制
server.send(200, "text/html", WEBPAGE);

我想这是在ESP32上使用字符串的一个很大的限制

更多细节这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67810233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档