Arduino memory

来自Jack's Lab
2014年6月25日 (三) 17:04Comcat (讨论 | 贡献)的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到: 导航, 搜索

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

















个人工具
名字空间

变换
操作
导航
工具箱