我一直在尝试在 ATMEGA2560 上运行一些代码,最后我将所有内容归结为:
作品
#include "Arduino.h"
#include "HardwareSerial.h"
const char bob[7000] = "Hello\0";
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\0";
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.
但是,如果您有大量常量字符串/数据,则确实应该使用 PROGMEM指示编译器将数据移入闪存。
如果您的数据集需要读/写访问并且必须是非 volatile 的,您将使用 EEPROM。
有像avr-size.exe
(GCC工具链的一部分)这样的工具可以在编译时检查静态SRAM的使用情况。
请记住,您还必须确保动态 SRAM 要求 (STACK) 在程序执行期间不会超过剩余内存。
还可以通过查看堆栈指针来确定运行时的 SRAM 使用情况。如果只关心最大 SRAM 使用量,也可以将虚拟模式写入 SRAM(例如全部 0xAA),并检查该模式已被覆盖到哪个地址。
关于arrays - Arduino atmega2560代码大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32737433/