【问题标题】:Arduino atmega2560 code sizeArduino atmega2560 代码大小
【发布时间】:2015-12-20 15:28:36
【问题描述】:

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

【问题讨论】:

  • 我只是 saw this page on PROGMEM 并修复了它 - 但是如果我用完 RAM,我如何收到警告,理想情况下如何让 const 自动执行此操作

标签: arrays arduino avr avr-gcc atmega


【解决方案1】:

是的,你确实用完了你的 SRAM。

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

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

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

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

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

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

【讨论】:

  • 由于我是从 ARM 移植的,他们确实将 const 数据放入闪存,因此我有数百个 const 变量。有没有办法自动完成,而不仅仅是用 PROGMEM 向我的所有代码发送垃圾邮件?看起来这可能只是制作我自己的链接器文件的问题。
  • @GordonWilliams:没有线索。但是,我理解PROGMEM page 关于const 的推理。
  • 哇,是的。我似乎是页面,但直到现在才深入阅读。似乎很奇怪,通用 C 指针无法指向闪存中的某些内容(如果我没看错的话)。似乎几乎扼杀了我移植代码的任何希望。
  • @GordonWilliams:嗯,“通用 C 指针”最终只是一个内存地址。编译器需要它指向的内存的信息,默认情况下是 SRAM。因此,您需要第二种类型的指针和函数(pgm_*)来识别它并知道如何访问“其他内存”,在这种情况下就是闪存。我认为按原样实现它并从编码的角度明确意图是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多