【问题标题】:Arduino IDE - global variables storage in RAM or flash memoryArduino IDE - RAM 或闪存中的全局变量存储
【发布时间】:2020-02-26 23:49:52
【问题描述】:

传统观点认为,全局和静态数据与其他内容一起存储在 RAM 的底部。在上面的某个地方是堆,然后是空闲内存,在 RAM 的顶部是堆栈。在继续阅读之前,请参阅下面的代码。

当我在 MEGA2560 上使用 Arduino IDE (1.8.10) 进行编译时,我得到以下统计数据:

Sketch 使用 2750 字节 (1%) 的程序存储空间。最大值为 253952 字节。 全局变量使用 198 字节 (2%) 的动态内存,为局部变量留下 7994 字节。最大为 8192 字节。

如果我将 ARRAY_SIZE 从 1 更改为 7001,我会得到完全相同的数字。我预计动态内存应该增加 7000。当我与 AtmelStudio V7 进行相同的比较时,动态内存确实增加了 7000。

关于这些方面的另一条信息。如果我执行一个非常接近空闲内存的 7000 的 malloc,人们会期望当 ARRAY_SIZE 等于 1 时 malloc 应该是成功的,而当 ARRAY_SIZE 等于 7001 时会失败。我很沮丧地发现 malloc 在两个小和大数组大小。 AtmelStudio 不会发生这种情况。

我怀疑某个地方的相应编译器/链接器选项可以解释差异(AtmelStudio - 项目属性和 Arduino IDE - platform.txt 也许?)。

我也怀疑 Arduino IDE 在 FlashMemory 中动态分配全局变量。

我不是新手,但我也不是大师 - 有人问我吗?

谢谢 米歇尔

#define ARRAY_SIZE 7001
uint8_t globalArray[ARRAY_SIZE]{1};
void setup() {
 Serial.begin(115200);
 for (int i = 0; i < ARRAY_SIZE; i++) globalArray[i] = 1;
  Serial.print(F("Just initialized globalArray, size = "));Serial.println(ARRAY_SIZE);
  uint8_t* testPointer = (uint8_t*) malloc(7000);
  Serial.print(F("Allocation of 7000 bytes "));
  if ( testPointer != (uint8_t*) 0) {
  Serial.print(F("SUCCESSFUL"));
   } else {
   Serial.print(F("NOT SUCCESSFUL"));
   }
} // setup
void loop() {} // loop

【问题讨论】:

  • 全局数组没有被使用所以被优化掉了

标签: arduino ram arduino-c++


【解决方案1】:

我进行了更多测试,以了解为什么 AtmelStudio 和 Arduino IDE 在声明数组后会提供截然不同的 RAM 使用值。 juraj(谢谢)的回应是编译器优化了未使用的代码。这个答案是正确的,但是我已经包含了一个数组初始化循环,以确保编译器将在代码中包含该数组。 事实证明,AtmelStudio 和 Arduino IDE 对编码“正在使用的代码”的含义有不同的标准。结果是 globalArray,在初始化行中, for (int i = 0; i

a+=globalArray[i];未使用 Atmel Studio:数据内存使用为 7211 字节 Arduino IDE:全局变量使用 198 字节

a+=globalArray[i];用过的 Atmel Studio:数据内存使用为 7211 字节 Arduino IDE:全局变量使用 7199 字节

Q.E.D.有趣的是,这两个 IDE 与“被使用”的含义并不完全相同。

谢谢 - 我第一次在这个论坛上很快就得到了回答。

米歇尔

#define ARRAY_SIZE 7001
uint8_t globalArray[ARRAY_SIZE];
void setup() {
  Serial.begin(115200);
  for (int i = 0; i < ARRAY_SIZE; i++) globalArray[i] = 1;
  Serial.print(F("Just initialized globalArray, size = "));
  Serial.println(ARRAY_SIZE);
  //   uint16_t a {0};
  //   for (int i = 0; i < ARRAY_SIZE; i++) a+=globalArray[i];
  //   Serial.print(F("Value of a = ")); Serial.println(a);
  uint8_t* testPointer = (uint8_t*) malloc(7000);
  Serial.print(F("Allocation of 7000 bytes "));
  if ( testPointer != (uint8_t*) 0) Serial.print(F("SUCCESSFUL"));
  else Serial.print(F("NOT SUCCESSFUL"));
} // setup

【讨论】:

  • 它不是 Arduino IDE。编译和链接代码的是 gcc。 Arduino 设置为 -Os(针对大小进行优化)
猜你喜欢
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多