Arduino——把变量放到flash

如果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正常工作。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值