Arduino memory
来自Jack's Lab
以 Arduino 的主力单片机 ATMEGA 系列,片内一般有如下三部分可用存储资源
Flash memory (Program Space) SRAM (Data memory) EEPROM
ATMEG 168 这三部分存储空间的大小为:
- Flash 16KB
- SRAM 1KB
- EEPROM 512B
ATMEG 328 这三部分存储空间的大小为:
- Flash 32KB
- SRAM 2KB
- EEPROM 1KB
C 环境下编译的全局变量和常量,编译器都处理中 data memory 中
若要将这些存储于 program space 则:
#include <avr/pgmspace.h>
char str1[] PROGMEM = {
"<html><hr><hd></html>\r\n"
"<html2><hr><hd></html>"
};
char str2[] PROGMEM = "12346788";
char str3[] PROGMEM = "hahahahah";
char str4[] PROGMEM = "fuckfuck";
PGM_P str_table[] PROGMEM = {
str1,
str2,
str3,
str4
};
void setup()
{
Serial.begin(9600);
}
void loop()
{
char buf[128];
for(uint8_t i = 0; i < 4; i++)
{
strcpy_P(buf, (PGM_P)pgm_read_word(&(str_table[i])));
Serial.println(buf);
}
delay(5000);
}
注意:data memory 的空间不能分配太大,比如上面的 buf[] 为 buf[256] 的话,栈就会溢出,输出结果不可知。不管 char buf[256] 定义在函数内还是函数外(类似 C 全局变量的)输出结果都不可知
单个 char str[] PROGMEM 的长度最好不要超过 200
有关 AVR 体系上内存的使用 Tips 可参考这个不错的文档 <Tips and Tricks to Optimize
Your C Code for 8-bit AVR Microcontrollers> [1]
更多的 memory sections Memory Areas and Using malloc()