如果arduino程序莫名不能運行、重啓,莫名的問題,內存不夠,內存溢出,如果還不能搞定arduino內存不夠用,也許可以通過把變量定義到Flash來解決。
PROGMEM 關鍵字可以幫你把放在ram裏面的變量,存到flash上面去,釋放內存的佔用。
比如:
原來這樣定義,放到ram中,佔用內存寶貴的6個字節。
unsigned int charSet[] = {1,2,3};
改成這樣:放到flash中,佔用廉價的flash6個字節,釋放出內存6個字節。
PROGMEM prog_uint16_t charSet[] = { 1,2,3};
然後再讀出來放到ram裏面來運行。
這樣的6個字節看起來沒節省什麼空間是嗎?
unsigned int charSet[] = {1,2,3};
那這樣的呢?能省很多了吧。。
PROGMEM unsigned int rawCodes_ac_open[200] = {4397,4368,561,1578,560,537,557,1581,584,1582,584,486,558,537,584,1554,560,538,558,510,558,1607,557,513,585,511,556,1585,581,1583,583,486,557,1609,556,513,558,538,557,512,558,1607,558,1583,557,1608,558,1608,557,1580,559,1606,559,1581,556,1609,557,512,559,537,558,512,557,539,557,512,558,1607,558,1582,558,537,584,1555,558,1607,556,514,559,537,556,513,558,537,556,514,558,1606,559,511,583,513,558,1582,557,1608,558,1580,585,5154,4419,4347,584,1555,558,539,557,1581,584,1581,571,501,577,516,571,1568,557,541,581,487,557,1608,557,513,558,538,557,1582,583,1582,584,487,557,1608,557,511,611,486,558,510,558,1607,557,1609,556,1583,583,1582,583,1555,558,1607,558,1607,559,1582,557,537,585,486,558,510,558,540,558,509,557,1608,558,1608,557,512,559,1606,559,1581,558,537,581,490,558,510,587,511,557,511,559,1606,559,510,569,527,558,1582,560,1604,561,1605,561};
還可以更多的
看看官方的reference:
http://www.arduino.cc/en/Reference/PROGMEM
要想省內存出來,就需要2步,一步寫到flash,一步從flash讀出來。
看看例子,其實不難。下面看看支持哪些,
不支持float型...不支持float型....
prog_char - a signed char (1 byte) -127 to 128
prog_uchar - an unsigned char (1 byte) 0 to 255
prog_int16_t - a signed int (2 bytes) -32,767 to 32,768
prog_uint16_t - an unsigned int (2 bytes) 0 to 65,535
prog_int32_t - a signed long (4 bytes) -2,147,483,648 to * 2,147,483,647.
prog_uint32_t - an unsigned long (4 bytes) 0 to 4,294,967,295
下面是一段讀寫的例子
//保存一些 unsigned ints
PROGMEM prog_uint16_t charSet[] = { 65000, 32796, 16843, 10, 11234};
// 或者保存一些chars
prog_uchar signMessage[] PROGMEM = {"I AM PREDATOR, UNSEEN COMBATANT. CREATED BY THE UNITED STATES DEPART"};
unsigned int displayInt;
int k; //k在這裏類似於i,你要自己循環增加
char myChar;
// 讀回來一個 2-byte 的 int
displayInt = pgm_read_word_near(charSet + k)
// 讀回來一個 char
myChar = pgm_read_byte_near(signMessage + k);
注意事項
請注意,必須使用全局變量定義flash存儲的數據,或者用static關鍵字定義,這樣才能使PROGMEM正常工作。