Arduino IDE-RAM或闪存中的全局变量存储

Arduino IDE-RAM或闪存中的全局变量存储,arduino,ram,arduino-c++,Arduino,Ram,Arduino C++,传统观点认为,全局和静态数据与其他数据一起存储在RAM的底部。在上面的某个地方是堆,然后是空闲内存,在RAM的顶部是堆栈。请参阅下面的代码,然后再继续阅读 当我在MEGA2560上使用Arduino IDE(1.8.10)编译时,我得到了以下统计数据: 草图使用2750字节(1%)的程序存储空间。最大值为253952字节。 全局变量使用198字节(2%)的动态内存,局部变量使用7994字节。最大值为8192字节 如果将数组大小从1更改为7001,则得到的数字完全相同。我预计动态内存将增加7000

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

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

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

如果将数组大小从1更改为7001,则得到的数字完全相同。我预计动态内存将增加7000。当我与ATMELStudioV7做同样的比较时,动态内存确实增加了7000

沿着这条线还有一条信息。如果我使用7000的malloc,这非常接近于可用内存,那么当ARRAY_SIZE等于1时,malloc应该成功,而当ARRAY_SIZE等于7001时,malloc将失败。我沮丧地发现,malloc在小型和大型阵列中都取得了成功。在AtmelStudio中,这种情况不会发生

我怀疑某些地方各自的编译器/链接器选项可以解释这种差异(可能是AtmelStudio-project属性和Arduino IDE-platform.txt?)

我还怀疑ArduinoIDE在FlashMemory中动态分配全局变量

我不是新手,但我不是大师——有人评论吗

谢谢 米切尔

#定义数组大小7001
uint8_t globalArray[数组大小]{1};
无效设置(){
序列号开始(115200);
对于(int i=0;i
我运行了更多的测试,以了解为什么AtmelStudio和Arduino IDE在声明阵列后提供了截然不同的RAM使用值。juraj(谢谢)的回应是编译器优化了未使用的代码。这个答案是正确的,但是我包含了一个数组初始化循环,以确保编译器将数组包含在代码中。 事实证明,AtmelStudio和ArduinoIDE在编码“正在使用的代码”时有不同的标准。结果是globalArray在初始化行中, 对于(int i=0;i a+=全球阵列[i];不用 Atmel Studio:数据内存使用量为7211字节 Arduino IDE:全局变量使用198字节

a+=全球阵列[i];习惯于 Atmel Studio:数据内存使用量为7211字节 Arduino IDE:全局变量使用7199字节

有趣的是,这两个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
#定义数组大小7001
uint8_t全局数组[数组大小];
无效设置(){
序列号开始(115200);
对于(int i=0;i
全局数组未使用,因此已进行优化。它不是Arduino IDE。是gcc编译并链接代码。Arduino设置为-Os(优化大小)
#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