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()