arrays - Arduino atmega2560代码大小

标签 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(但它应该告诉我是否是这样?),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/

相关文章:

arrays - 有选择地使用 drop [R] - 仅删除指定的 length-1 尺寸

c++ - QObject::connect: 需要括号,信号 QSerialPort::readyRead in ..\voltage_sensor\dialop.cpp:41

c++ - Arduino - 具有 pow(x,y) 函数的奇数指数行为

serial-port - 如何更改 Arduino Due 的串行缓冲区大小?

timer - Arduino Uno PWM 引脚冲突

c - 需要计时器方面的帮助

c - 将 simulavr 与 avr-gdb 一起使用时抛出奇怪的异常

c - Ansi C - 函数期望指向数组的指针

javascript - 如何使用基本 KO 可观察数组来更新绑定(bind)到选择选项下拉列表的多个计算可观察数组

c - C 编程的指针和数组(基础)