Arduino atmega2560代码大小

Arduino atmega2560 code size

我一直在尝试 运行 ATMEGA2560 上的一些代码,最后我将所有内容归结为:

有效

#include "Arduino.h"
#include "HardwareSerial.h"

const char bob[7000] = "Hello[=10=]";


void setup(void) {
  Serial.begin(9600);
  Serial.println("jshInit...");
  Serial.println(bob);
}

void loop(void) {
  Serial.println("foo...");
}

什么都不做

#include "Arduino.h"
#include "HardwareSerial.h"

const char bob[8000] = "Hello[=11=]";


void setup(void) {
  Serial.begin(9600);
  Serial.println("jshInit...");
  Serial.println(bob);
}

void loop(void) {
  Serial.println("foo...");
}

这里唯一的区别是 bob 的大小。 没有编译器警告或任何东西,即使 bob 是 20000,如果 bob 数组太大,Arduino 就会拒绝工作。

有谁知道这是怎么回事?我在这里使用 Arduino IDE 进行编译,但对于我的主要项目,我使用的是 avr-gcc (GCC) 4.5.3,我也尝试了 4.8.2 - 所有这些都存在同样的问题。

atmega2560 有 256kb 闪存和 8kB RAM。可能是我正在使用所有 RAM(但它应该告诉我是否是这样?),还有 bob 上的 const 关键字这应该意味着它进入闪存?

是的,您确实用完了 SRAM。

关于您的评论:您无法以某种方式使用 const 关键字来实现与使用 PROGMEM 属性相同的效果。

const is used to tell the compiler that the data is to be "read-only". const was intended for uses such as this, not as a means to identify where the data should be stored. If it were used as a means to define data storage, then it loses its correct meaning (changes its semantics) in other situations such as in the function parameter example.

但是,如果你有很多常量strings/data,你确实应该使用PROGMEM来指示编译器将数据移动到闪存中。

如果您的数据集需要 read/write 访问权限并且必须是非易失性的,您可以使用 EEPROM。

有像 avr-size.exe(GCC 工具链的一部分)这样的工具可以在编译时检查您的静态 SRAM 使用情况。 请记住,您还必须确保动态 SRAM 要求 (STACK) 在程序执行期间不超过剩余内存。

还可以通过查看堆栈指针来确定运行时 SRAM 的使用情况。如果只对最大 SRAM 使用感兴趣,也可以将虚拟模式写入 SRAM(例如全 0xAA),并检查模式已被覆盖的地址。