极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 37355|回复: 17

解决问题系列(5)——把定义的变量放到flash里面去

[复制链接]
发表于 2013-7-2 13:40:27 | 显示全部楼层 |阅读模式
本帖最后由 瘦网虫 于 2013-7-2 14:03 编辑

这个问题与本系列中前几个问题有一丁点的联系。

如果你遇到了你的arduino程序莫名不能运行,莫名重启,莫名的问题,
可以简单浏览下此贴,说不定这就是你的菜。

内存不够,内存溢出,内存没法再释放了,程序精简到不能再精简了,如果还不能搞定arduino内存不够用,来试试这个。

PROGMEM

这个干什么用?它可以帮你把放在ram里面的变量,存到flash上面去,释放出你可怜的内存。
比如:
你原来这样定义,放到ram中,占用内存宝贵的6个字节。
  1. unsigned int charSet[] = {1,2,3};
复制代码


改成这样:放到flash中,占用廉价的flash6个字节,释放出内存6个字节。

  1. PROGMEM  prog_uint16_t charSet[]  = { 1,2,3};
复制代码

然后再读出来放到ram里面来运行。

这样的6个字节看起来没节省什么空间是吗?
  1. unsigned int charSet[] = {1,2,3};
复制代码

那这样的呢?能省很多了吧。。
  1. 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);

Enjoy your free ram~


解决问题系列(4)——红外编码分析利器使用


回复

使用道具 举报

发表于 2013-7-15 00:26:12 | 显示全部楼层
非常有用。
lz,精简代码基于什么原则。?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-15 09:03:18 | 显示全部楼层
伯德 发表于 2013-7-15 00:26
非常有用。
lz,精简代码基于什么原则。?

在自己能力允许的情况下,首先保证功能,精简掉无用的变量声明、提示信息、测试代码、函数过程。
回复 支持 反对

使用道具 举报

发表于 2013-7-22 09:28:12 | 显示全部楼层
假如想定义一个int型大小10000的数组, 并且在arduino运行时对数组赋值,也可以用闪存吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 10:04:45 | 显示全部楼层
Evilfat 发表于 2013-7-22 09:28
假如想定义一个int型大小10000的数组, 并且在arduino运行时对数组赋值,也可以用闪存吗?

10000,近10K了啊,你确定你的arduino运行时不会溢出吗?

写入到flash里肯定没问题的。
回复 支持 反对

使用道具 举报

发表于 2013-7-22 10:11:07 | 显示全部楼层
瘦网虫 发表于 2013-7-22 10:04
10000,近10K了啊,你确定你的arduino运行时不会溢出吗?

写入到flash里肯定没问题的。

很完美的溢出了  完全不能执行   为这个事犯愁呢   闪存是不是只有定义的变量才能写进去?   我loop里再向闪存写进去数据会报错
回复 支持 反对

使用道具 举报

发表于 2013-7-22 10:11:27 | 显示全部楼层
瘦网虫 发表于 2013-7-22 10:04
10000,近10K了啊,你确定你的arduino运行时不会溢出吗?

写入到flash里肯定没问题的。

很完美的溢出了  完全不能执行   为这个事犯愁呢   闪存是不是只有定义的变量才能写进去?   我loop里再向闪存写进去数据会报错
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 10:14:45 | 显示全部楼层
空谈比较不着边际,最好你能贴个代码,有个说明什么的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 10:15:11 | 显示全部楼层
Evilfat 发表于 2013-7-22 10:11
很完美的溢出了  完全不能执行   为这个事犯愁呢   闪存是不是只有定义的变量才能写进去?   我loop里再向 ...

空谈比较不着边际,最好你能贴个代码,有个说明什么的。
回复 支持 反对

使用道具 举报

发表于 2013-7-22 10:29:58 | 显示全部楼层
代码如上 利用旋转编码器测量角速度的问题  但是编码器一周有6000个脉冲 频率太高 转速又太快。如果用Serial.print 来输出的话 会出现漏读脉冲的情况 所以希望讲所有结果全部存储以后一口气读出来 不过发现内存不够 程序完全不能运行
回复 支持 反对

使用道具 举报

发表于 2013-7-22 10:40:28 | 显示全部楼层
arduino需要记录每750个脉冲的周期与每5个脉冲的周期(如果可能希望是每个脉冲的)。 总共有1万个脉冲左右。
回复 支持 反对

使用道具 举报

发表于 2013-7-22 11:13:40 | 显示全部楼层
Evilfat 发表于 2013-7-22 10:29
代码如上 利用旋转编码器测量角速度的问题  但是编码器一周有6000个脉冲 频率太高 转速又太快。如果用Seria ...
  1. 编码写在这里!
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-7-22 11:15:31 | 显示全部楼层
伯德 发表于 2013-7-22 11:13

哦  不好意思  我在试一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 11:21:32 | 显示全部楼层
Evilfat 发表于 2013-7-22 10:29
代码如上 利用旋转编码器测量角速度的问题  但是编码器一周有6000个脉冲 频率太高 转速又太快。如果用Seria ...

1周6000个脉冲,什么设备,这么凶猛?

觉得用arduino对付这样的怪兽有些力不从心。
回复 支持 反对

使用道具 举报

发表于 2013-7-22 11:26:10 | 显示全部楼层
瘦网虫 发表于 2013-7-22 11:21
1周6000个脉冲,什么设备,这么凶猛?

觉得用arduino对付这样的怪兽有些力不从心。

目前看来不作任何处理 单纯读出每750脉冲的周期还是可以的   只是万一涉及到每10脉冲的周期的话,处理时间就会太久 力不从心了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-6-2 03:29 , Processed in 0.064570 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表