搜索
bottom↓
回复: 24

这种情况下RAM不够用怎么办?

[复制链接]

出0入0汤圆

发表于 2016-10-2 20:00:35 | 显示全部楼层 |阅读模式
用的STM32L0的片子,周边有SPI-Flash,采集的时候放在RAM缓冲区中,然后再写到Flash,可是现在最多可以挤出3K RAM,
Flash每个擦除单元就是4K了,就算我每次的缓冲区用1K,为了不擦除前面已经写入的数据,我要读出这4K的数据,根本不够
用怎么办,有没有什么更好的办法?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-10-2 20:10:08 来自手机 | 显示全部楼层
换大ram片子

出0入0汤圆

发表于 2016-10-2 20:19:38 | 显示全部楼层
STM脚兼容,也许你运气好,片子其实是高容量的,你试试运气直接写更多空间

出0入0汤圆

发表于 2016-10-2 20:32:04 | 显示全部楼层
可以把整个页一个一个字节写到另外一空页中  , 然后反过来 写回去。

RAM 有 几十字节即可

出0入0汤圆

发表于 2016-10-2 22:26:47 | 显示全部楼层
擦要整页擦,写难道也要整页写?

出300入477汤圆

发表于 2016-10-2 22:40:37 来自手机 | 显示全部楼层
每个页面只用3k即可。或者为了好算只用2k也行,后面的空着不用。这样只要留2k缓存就够了

出0入0汤圆

发表于 2016-10-2 22:50:30 | 显示全部楼层
可以加个铁电存储器

出0入0汤圆

 楼主| 发表于 2016-10-2 23:04:49 | 显示全部楼层
redroof 发表于 2016-10-2 22:40
每个页面只用3k即可。或者为了好算只用2k也行,后面的空着不用。这样只要留2k缓存就够了 ...

我现在的方法可以全部都用上,就是用1K的缓冲区,擦除的时候要4K对齐的时候才擦除。

出0入0汤圆

发表于 2016-10-3 02:35:51 | 显示全部楼层
擦要整页擦,写难道也要整页写?


我也是没看懂楼主的逻辑

出0入0汤圆

发表于 2016-10-3 07:22:01 来自手机 | 显示全部楼层
整页写速度快

出0入0汤圆

发表于 2016-10-3 07:40:00 | 显示全部楼层
先读入RAM,再写, 这种做法太危险, 在擦除后,断电,复位等,都导致所有数据丢失。
使用多个块, 先把要擦除的块,慢慢搬到新的块,并写入新数据,然后再擦除原来的块,几个块,循环使用。

出0入0汤圆

发表于 2016-10-3 08:08:00 | 显示全部楼层
可以只读出任意字节数的, 不一定要一次全部读出一个sector

出0入0汤圆

 楼主| 发表于 2016-10-3 10:55:00 | 显示全部楼层
MasterPhi 发表于 2016-10-3 02:35
我也是没看懂楼主的逻辑

想做到修改SECTOR任何一个地方,都必须全部读出来,ram修改,擦除扇区,写入扇区。
这就需要有扇区那样大的ram

出0入85汤圆

发表于 2016-10-3 11:24:25 | 显示全部楼层
本帖最后由 Huaan 于 2016-10-3 11:30 编辑

一般的SPI Flash擦除是按扇区擦除,写入是按页写入
扇区是最小的擦除单位,页是最大的写入单位
只要不是把0改为1,是不需要擦除的,
比如假设地址0x1000的位置被连续写入了0x12 0xFF 0x56 0x78,此时要再对0x1001地址写入0x34也是可行的,但是要对0x1000地址改写为0x34就不行,因为有0变1。

出300入477汤圆

发表于 2016-10-3 21:20:16 | 显示全部楼层
weshare 发表于 2016-10-2 23:04
我现在的方法可以全部都用上,就是用1K的缓冲区,擦除的时候要4K对齐的时候才擦除。 ...

看你的需求了。
如果是存历史数据,这个时候数据量会比较大,但完全可以从最旧的开始整块擦,不需要考虑改写部分。
如果是存参数,那么就需要允许任意位置改写,但一般来说这种需求的数据量都不会大,所以用两个块轮换擦写就行了。两个块不够也可以用更多的块来轮换擦写。
这种擦写,首先擦掉最旧的块,然后把上一块里面不需要改的部分拷过来,合并上需要改的部分,版本号加1,再加上校验和,一起写入新块即可。
只有这样做才能保证擦写的时候掉电以后还能恢复。
故障分析:
擦最旧的块时断电,显然无任何影响。当前使用的参数块仍然完好无损。
写新的块没写完就断电,下次上电检查新的块里面校验和不对,擦掉这一块,继续使用旧的。



出0入0汤圆

发表于 2016-10-3 22:41:57 来自手机 | 显示全部楼层
搞得那么复杂干嘛?要么换RAM更大的,要么剩多少RAM则每个扇区只用多少。

出0入0汤圆

 楼主| 发表于 2016-10-5 08:05:51 | 显示全部楼层
dadatou 发表于 2016-10-3 22:41
搞得那么复杂干嘛?要么换RAM更大的,要么剩多少RAM则每个扇区只用多少。

更换RAM不复杂?剩下多少RAM每个扇区用多少那有点浪费。
看似简单的方法不一定是最好的

出300入477汤圆

发表于 2016-10-5 11:55:25 来自手机 | 显示全部楼层
weshare 发表于 2016-10-5 08:05
更换RAM不复杂?剩下多少RAM每个扇区用多少那有点浪费。
看似简单的方法不一定是最好的 ...

按我上面说的做就行了。简单的对同一块做读改写是不可靠的。万一那几百毫秒内断电就没了

出0入0汤圆

发表于 2016-10-5 12:04:18 | 显示全部楼层
redroof 发表于 2016-10-5 11:55
按我上面说的做就行了。简单的对同一块做读改写是不可靠的。万一那几百毫秒内断电就没了 ...

硬件上做断电数据保护

出0入42汤圆

发表于 2016-10-5 14:55:22 来自手机 | 显示全部楼层
用台系片,动不动就不够用了。用过一个歪主意:把不用的功能寄存器用上,如端口上拉电阻设置等。

出0入0汤圆

发表于 2016-10-5 15:27:53 来自手机 | 显示全部楼层
wangjiati 发表于 2016-10-5 14:55
用台系片,动不动就不够用了。用过一个歪主意:把不用的功能寄存器用上,如端口上拉电阻设置等。 ...

楼主缺1K多,恐怕把所有寄存器用上都不够吧!

出0入0汤圆

发表于 2016-10-5 15:35:41 | 显示全部楼层
redroof 发表于 2016-10-3 21:20
看你的需求了。
如果是存历史数据,这个时候数据量会比较大,但完全可以从最旧的开始整块擦,不需要考虑 ...


嗯,这个做法比较稳妥。

出300入477汤圆

发表于 2016-10-5 16:33:39 | 显示全部楼层
wildcat7261 发表于 2016-10-5 12:04
硬件上做断电数据保护

除非你做到跟很多PLC一样,掉电十秒钟才熄灯
要不然总会有一天碰到擦写时丢数据~

出0入0汤圆

发表于 2016-10-6 07:43:58 | 显示全部楼层
将buf改成局部变量即可,亲测有效,可以一试。

出0入0汤圆

 楼主| 发表于 2016-10-6 08:56:57 | 显示全部楼层
奔跑的小白 发表于 2016-10-6 07:43
将buf改成局部变量即可,亲测有效,可以一试。

局部变量本质也是ram,也就是栈,要小心堆栈溢出,不是说这个ram就是凭空出现的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 19:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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