Arduino atmega2560代码大小

时间:2015-09-23 10:42:04

标签: arrays arduino avr avr-gcc atmega

我一直在尝试在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关键字也应该意味着它进入闪存?

1 个答案:

答案 0 :(得分:3)

是的,你确实耗尽了你的SRAM。

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

  

const用于告诉编译器数据是“只读”的。 const旨在用于此类用途,而不是用于识别数据应存储位置的方法。如果它被用作定义数据存储的手段,那么它在其他情况下失去了正确的含义(改变其语义),例如在函数参数示例中。

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

如果您的数据集需要读/写访问且必须是非易失性的,那么您将使用EEPROM。

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

还可以通过查看堆栈指针来确定运行时的SRAM使用情况。如果只关注最大的SRAM使用率,也可以将一个虚拟模式写入SRAM(例如所有0xAA),并检查模式被覆盖的地址。