我一直在尝试在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(但它应该告诉我,如果是这样?),const
上的bob
关键字也应该意味着它进入闪存?
答案 0 :(得分:3)
是的,你确实耗尽了你的SRAM。
关于您的评论:您无法以某种方式使用const
关键字来实现与使用PROGMEM属性相同的功能。
const用于告诉编译器数据是“只读”的。 const旨在用于此类用途,而不是用于识别数据应存储位置的方法。如果它被用作定义数据存储的手段,那么它在其他情况下失去了正确的含义(改变其语义),例如在函数参数示例中。
但是,如果你有很多常量字符串/数据,你应该使用PROGMEM来指示编译器将数据移动到闪存中。
如果您的数据集需要读/写访问且必须是非易失性的,那么您将使用EEPROM。
有一些工具,如avr-size.exe
(GCC工具链的一部分),可以在编译时检查静态SRAM的使用情况。
请记住,您还必须确保在程序执行期间动态SRAM要求(STACK)不超过剩余内存。
还可以通过查看堆栈指针来确定运行时的SRAM使用情况。如果只关注最大的SRAM使用率,也可以将一个虚拟模式写入SRAM(例如所有0xAA),并检查模式被覆盖的地址。