Arduino中的堆内存释放策略

时间:2013-07-15 10:29:57

标签: arduino

#include <Arduino.h>
#include "include/MainComponent.h"

/*
  Turns on an LED on for one second, then off for one second, repeatedly.
*/


MainComponent* mainComponent;

void setup()
{

    mainComponent = new MainComponent();
    mainComponent->beginComponent();

}

void loop()
{

    mainComponent->runComponent();
}

在Arduino中是否有释放内存的回调?(例如调用delete mainComponent)

或者这会在循环结束时自动发生?

确保释放在该代码段中分配的内存的策略是什么?

SCENARIO:“我想在两种方法中访问该对象,因此该对象在全局范围内声明,然后在安装时进行实例化。”

loop()终止后会发生什么? mainComponent还会留在内存中吗?

如果是OS NO,则进程将终止,然后资源将被释放。

所以在Arduino中如何通过确保在关闭控制器时释放内存来实现上面的SCENARIO?

1 个答案:

答案 0 :(得分:4)

令人困惑的是,main()函数被基本的Arduino IDE隐藏了。您的程序具有main()函数,就像在任何其他平台上一样,并且具有与在具有OS的计算机上运行时相同的生命周期。如果你看一下arduino ___ \ hardware \ cores \ aduino,你会发现一个文件main.cpp,它包含在你的二进制文件中:

int main(void)
{
   init();

   //...       
   setup();

   for (;;) {
      loop();
      if (serialEventRun) serialEventRun();
   }

   return 0;
}

考虑到这个文件你现在会看到,当你退出循环()时,它会被连续调用。您的计划从不退出。一般来说,你最好的模式是新对象一次,永远不会删除,就像你在这里做的那样。如果你是在微控制器上反复删除和删除对象,你就不会明智地考虑生命周期和资源。

所以 “是从loop()返回时删除的新对象?”不,程序仍在运行,并且它仍然在堆上。

“断电会发生什么?有办法清理吗?”电源电压下降过低时,微控制器将停止执行指令。电源管理器电路可以防止控制器做任何不稳定的事情,因为电压下降(应该防止)当电压完全耗尽时,所有RAM都会丢失。如果不添加电路,则无法在断电时执行任何清理。

“我需要清理吗?”不,在加电时,一切都会重置为已知状态。操作不受RAM中遗留的任何操作的影响(假设您初始化所有变量)。