You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Arduino Uno上传代码时出现动态内存不足错误求助

解决Arduino Uno全局变量内存溢出问题

嘿,这个内存爆仓的问题在Arduino Uno上太常见了——毕竟它的SRAM(动态内存)只有可怜的2KB,你的全局变量直接占了277%,完全超出硬件上限,得从这几个核心方向优化:

1. 砍全局变量的“体量”

  • 把非必要的全局变量改成局部变量:局部变量只在函数执行时占用栈内存,执行完就释放,不会一直占着宝贵的SRAM。
  • 缩小数据类型:比如用uint8_t(1字节)代替int(2字节),只要你的数值范围在0-255之间;用int16_t代替long(4字节),如果数值不需要那么大。这能直接把变量的内存占用砍一半甚至更多。

2. 把静态数据移到Flash(程序存储空间)

Uno的Flash有32KB,比SRAM大得多,把不需要修改的字符串、数组存到这里:

  • 字符串常量:别直接写char myStr[] = "这是很长的字符串";,改成:
    const char myStr[] PROGMEM = "这是很长的字符串";
    
    读取的时候用Serial.print_P(myStr);或者strcpy_P(buffer, myStr);(需要包含<avr/pgmspace.h>头文件)。
  • 静态大数组:如果有固定的查找表或者不会修改的数组,同样加PROGMEM修饰,用pgm_read_word()等函数读取。

3. 排查内存大户

打开你的代码,找找有没有这些“内存怪兽”:

  • 超大数组:比如int bigData[1000];直接占2000字节,刚好把Uno的SRAM占满,这种要么拆分,要么移到PROGMEM。
  • 冗余的库:有些库默认带了很多你用不上的功能,比如某些LCD库会支持多种屏幕型号,如果你只用一种,能不能找轻量版的替代,或者手动裁剪库代码?

4. 避免动态内存泄漏

如果你的代码里用了malloc()或者new,一定要对应调用free()或者delete,不然内存会一点点被占光。不过Arduino上尽量少用动态内存分配,很容易出问题,能不用就不用。

最后再聊聊错误信息

程序存储空间只用了58%,这个完全没问题,问题出在SRAM:全局变量占了5679字节,而Uno的SRAM上限只有2048字节,所以剩余是负数——这就是为什么上传后板子大概率会崩溃、乱码或者不响应,内存彻底不够用了。

按照上面的方法一步步来,先从全局变量和大数组下手,这俩通常是内存溢出的元凶,很快就能把内存占用降下来。

内容的提问来源于stack exchange,提问作者JustAnotherBitcoin

火山引擎 最新活动