Arduino atmega2560代码大小
Arduino atmega2560 code size
我一直在尝试 运行 ATMEGA2560 上的一些代码,最后我将所有内容归结为:
有效
#include "Arduino.h"
#include "HardwareSerial.h"
const char bob[7000] = "Hello[=10=]";
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[=11=]";
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.
但是,如果你有很多常量strings/data,你确实应该使用PROGMEM来指示编译器将数据移动到闪存中。
如果您的数据集需要 read/write 访问权限并且必须是非易失性的,您可以使用 EEPROM。
有像 avr-size.exe
(GCC 工具链的一部分)这样的工具可以在编译时检查您的静态 SRAM 使用情况。
请记住,您还必须确保动态 SRAM 要求 (STACK) 在程序执行期间不超过剩余内存。
还可以通过查看堆栈指针来确定运行时 SRAM 的使用情况。如果只对最大 SRAM 使用感兴趣,也可以将虚拟模式写入 SRAM(例如全 0xAA),并检查模式已被覆盖的地址。
我一直在尝试 运行 ATMEGA2560 上的一些代码,最后我将所有内容归结为:
有效
#include "Arduino.h"
#include "HardwareSerial.h"
const char bob[7000] = "Hello[=10=]";
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[=11=]";
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.
但是,如果你有很多常量strings/data,你确实应该使用PROGMEM来指示编译器将数据移动到闪存中。
如果您的数据集需要 read/write 访问权限并且必须是非易失性的,您可以使用 EEPROM。
有像 avr-size.exe
(GCC 工具链的一部分)这样的工具可以在编译时检查您的静态 SRAM 使用情况。
请记住,您还必须确保动态 SRAM 要求 (STACK) 在程序执行期间不超过剩余内存。
还可以通过查看堆栈指针来确定运行时 SRAM 的使用情况。如果只对最大 SRAM 使用感兴趣,也可以将虚拟模式写入 SRAM(例如全 0xAA),并检查模式已被覆盖的地址。