【发布时间】: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++