【问题标题】:heap memory release policy in ArduinoArduino 中的堆内存释放策略
【发布时间】:2013-07-13 04:34:37
【问题描述】:
#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)

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

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

场景:“我想在这两种方法中访问该对象,因此该对象在全局范围内声明,然后在设置时实例化。”

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

如果它在 OS NO 中,进程将终止,然后资源将被释放。

那么在 Arduino 中,我如何通过确保在控制器关闭时释放内存来实现上述场景?

【问题讨论】:

  • 在 AVR 上,您没有操作系统,只有原始硬件。重新设置芯片(切断电源,按“RESET”等),所有内存将被“释放”。
  • 那么在 Arduino 中不需要像在基于操作系统的系统中那样仔细的内存管理?
  • 更需要更仔细的内存管理,但这基本上包括不分配太多的 2kB(左右)RAM。如果您需要一个对象在程序的整个生命周期内都保持活动状态,那么您不需要释放它。
  • @H2CO3 这很有意义。您是否有任何资源可以更好地了解微控制器中的内存处理?
  • 嗯...我不知道。诚实地。你必须要小心。应用一般的内存管理规则,记住你只有 2k 个。读取编译器生成的汇编器和/或 avr-libc 中malloc() 的源代码。

标签: arduino


【解决方案1】:

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

int main(void)
{
   init();

   //...       
   setup();

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

   return 0;
}

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

所以 “从循环()返回时是否删除了新的对象?”不,该程序仍在运行,它停留在堆上。

“断电时会发生什么?有没有办法清理?”一旦电源电压降得太低,微控制器就会停止执行指令。电源监控器电路可防止控制器在电压下降时做任何不稳定的事情(应该防止)当电压完全耗尽时,所有 RAM 都会丢失。如果不添加电路,您将无法在断电时执行任何清理操作。

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

【讨论】:

  • 非常感谢您的详细回复。真的很有帮助!所以你认为我使用的模式是正确的?
  • 正确,因为它会按您的预期工作,并且是可靠的。如果您查看大多数 Arduino 代码,您会发现对象不会被分配新的,而是具有静态初始化程序。一个关键的好处是您将在链接时知道使用了多少内存。使用程序使用的新/堆,直到运行时才知道是否有足够的内存。
  • 我一直在寻找某种方法来运行清理功能以在程序退出/关闭时释放分配的数据,但您所说的很有意义。谢谢!
猜你喜欢
  • 2016-05-07
  • 2017-07-16
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 2013-02-28
  • 2011-08-21
  • 1970-01-01
相关资源
最近更新 更多