首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arduino IDE -在RAM或闪存中存储全局变量

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

Stack Overflow用户
提问于 2019-10-31 23:11:57
回答 1查看 3.6K关注 0票数 0

传统观点认为,全局和静态数据与其他数据一起存储在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

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

发布于 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与“被使用”的含义并不完全相同。

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

米歇尔

代码语言:javascript
复制
#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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58646389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档