1

我有一个相当大的 Arduino 草图,它正在推动处理器上可用内存的极限。正如我正在释放内存并尽可能减少对全局变量的使用一样。我正在使用MemoryFree.h(可以在此处找到详细信息)来检查可用内存。我有一个工作草图(在这里发布太长),但是当我添加另一个带有一些变量的函数(在我认为可用内存范围内)时,我的系统由于没有内存而崩溃或停止。

我添加了以下功能:

boolean moved(){

int yreadings[4];
int zreadings[4];


free(&yreadings);
free(&zreadings);
}

然后我将以下代码添加到我的主循环中:

 Serial.print("Mem is ");
 Serial.println(freeMemory());
 moved();

如果moved()在循环中并且下面的整个函数被注释掉,我会得到一个输出

Mem is 499

在每次迭代中,表明每次迭代都不会丢失内存。

然而,如果我取消注释函数并调用它,我会得到以下输出:

Mem is 499
Mem is -16094

在崩溃之前的第一行和第二行...

即使内存是持久的,这不应该只使用比每次迭代的全部 499 字节少得多吗?不过,我怎么会失去任何记忆?

更新:更奇怪的是:如果我删除了moved()函数并全局声明整数数组,我仍然会得到499的内存读取。这是怎么回事?不应该减少24个整数消耗的内存量吗?

4

1 回答 1

3

如果您只需要在函数执行的一部分中存在自动存储,您可以将它们放在范围块中:

void foo(void) {

   // some code where neither reading variable is occupying memory

   {
      int yreadings[4];
      int zreadings[4];

      // here these variable are taking up memory

   }

   // other code where neither reading variable is occupying memory
}

但当然,您只能在该块中使用它们。


为了扩展我的评论,有三类内存使用具有不同的持续时间

  • 在函数或方法或类上下文中声明的全局变量和变量static存在于程序的整个生命周期
  • 自动变量(在函数或方法中声明的变量)在其范围的生命周期内存在,包括从该范围调用的任何其他子程序的生命周期
  • 动态分配是从new1alloc函数族获得的内存块(由于簿记原因,它总是比您请求的大小稍大),从您分配它们的时间一直持续到您调用deletefree(分别)。

1如果您覆盖new它,它可能仍然适用,也可能不适用,但如果您这样做,则需要注意了解您对自己做了什么。

于 2012-12-01T21:13:08.383 回答