微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

esp32 字符串长度限制

如何解决esp32 字符串长度限制

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

main :
  loop ::= 2459
  text  := ""
  stamp := "1234567890"
  loop.repeat :
    text += stamp
  print ("$text.size")  

如果 loop ::= 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>

如果loop ::= 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文件的大小超过了允许的数量

解决方法

对字符串、列表、映射等没有任何实际大小限制。

系统只是尝试为这些对象分配空间,当内存不足时报错。显然,这对所有对象施加了基本限制:ESP32 最多具有 520K RAM,因此没有任何数据结构可以超过该大小。

但是,还有更多限制在起作用。例如,IRAM 内存与 DRAM 具有不同的属性,并且不太适合普通数据。同样,系统也使用了一些内存。

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

请注意,使用 + 构建字符串也意味着始终存在前一个字符串的副本,这使程序所需的空间加倍。

这是一个例子,表明字符串从根本上不限于~25K:

main :
  loop ::= 4500
  stamp := "1234567890"
  text := stamp * loop
  print "$text.size"

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。