2016-07-21 420 views
1

目前,我正在与Arduino nano。当我在Arduino IDE中编译我的c代码时,出现错误。Arduino nano:内存稳定性问题

enter image description here

程序上传成功并工作正常,那么什么原因这个错误的背后?这是否真的影响到Arduino nano的性能?

+0

编译器在运行时无法知道堆栈中的空间局部变量,函数参数和返回地址。如果空间不足,这些将会毫不留情地干扰全局变量。产生完全不可预知的结果。 – datafiddler

+0

这是一个关于没有足够空间(通常没有足够的堆栈空间)以使程序正常运行的“概率”的警告,您可以通过创建非常广泛的软件体系结构而非常有助于程序正常运行,而不是很深。 – user3629249

回答

0

是否真的影响的Arduino纳米的性能?

我也得到了同样的错误,而编译其警告正如你所说的乌尔上传成功完成,如果完成上传成功则没有性能问题。如果你想清除这个错误,你需要减少你的代码的一些内存使用, 只是优化你的代码,尽可能地使用局部变量。如果有常量,则使用#define代替 组重复调用函数。

+0

通常,** F ** - 宏会消除大部分不必要的RAM损坏。 ** Serial.println(F(“任何常量文本可以保存在珍贵的RAM中)); ** – datafiddler

+1

不要忘记字符串对象,它需要更多的空间并使用动态内存,因此有两个不稳定的原因。 – datafiddler

+1

>如果您有常量,请使用#define instead_ ...或使用** const **关键字。类似的优化效果,但** const **保留数据类型信息。 – datafiddler

2

发生此警告是因为编译器不知道您的程序应该分配多少动态内存。请看动态分配,本地变量分配的程序...

是否真的影响arduino nano的性能?

就像它说的“可能会出现稳定性问题”。在过去我确实遇到过这个问题,而且项目在某个时候会滞后。

1
int freeRam() { 
    extern int __heap_start, *__brkval; 
    int v; 
    return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
} 

调用此函数例如

 Serial.println(freeRam());
在您的功能的最深层次或任何你想要的。

不要使用malloc()或C++新,避免“稳定性问题”,因为没有异常处理或其他错误在动态内存分配检查。