传统观点认为,全局和静态数据与其他数据一起存储在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会失败。我很沮丧地发现malloc对于小数组和大数组都是成功的。而使用AtmelStudio则不会发生这种情况。
我怀疑不同的编译器/链接器选项可以解释这种差异(可能是AtmelStudio项目属性和Arduino IDE - platform.txt?)。
我还怀疑Arduino IDE在FlashMemory中动态分配全局变量。
我不是新手,但我也不是大师--有人评论吗?
谢谢Michèle
#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发布于 2019-11-01 20:58:00
我又运行了一些测试,以找出为什么AtmelStudio和Arduino IDE在声明数组后提供了截然不同的内存使用值。来自juraj的回应(谢谢)是编译器优化了未使用的代码。这个答案是正确的,但是我已经包含了一个数组初始化循环,以确保编译器将在代码中包含该数组。事实证明,AtmelStudio和Arduino IDE对于编码“正在使用的代码”的含义有不同的标准。结果是,在初始化行中,(int = 0;i< ARRAY_SIZE;i++) globalArrayi =1的globalArray被AtmelStudio认为正在使用,而Arduino IDE认为没有使用。Arduino IDE要求globalArray出现在赋值语句的左侧,以将其视为正在使用,因此需要"a+=globalArrayi;“行。下面的完全相同的代码报告:
a+=globalArrayi;未使用Atmel Studio:数据内存使用量为7211字节Arduino IDE:全局变量使用198字节
a+=globalArrayi;使用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"));
} // setuphttps://stackoverflow.com/questions/58646389
复制相似问题