搜索
bottom↓
回复: 41

W25QXX存储实时数据有什么思路

  [复制链接]

出0入0汤圆

发表于 2017-10-27 08:56:41 | 显示全部楼层 |阅读模式
我这里使用W25Q64存储温湿度或考勤等信息,我想问问各位有什么好的思路?如果直接往FLASH里写的话,每次复位时我要判断我写到哪个位置,然后从上一次的位置里继续写?对于用户调取FLASH的数据,调取完后要进行删除,我这里可以进行标记。譬如,我的FLASH存储IC卡的卡号,那么删除卡号时将对应的记录写0实现。这样又会遇到问题,当卡数量很多时(几千张),每次都要从头开始找,导致运行的很慢。我用的STM32,公司产品实际遇到这个问题,请问你们怎么解决,对于每次一个记录的数据(20个字节以内),这个flash需要保存这些数据(估计是实时的话,实时性不是很高),你们怎么组织和维护这个FLASH的,当然还有个读写均衡问题。

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出25入84汤圆

发表于 2017-10-27 09:06:55 | 显示全部楼层
先做一个数据表,比如1000个数据用不到1k的字节来表示,0或者1表示是否已经写入,然后写个for循环和地址对应起来查询数据。

出10入0汤圆

发表于 2017-10-27 09:30:52 | 显示全部楼层
需要有个参数区,可以不放到这个flash中;参数区包含起始写入地址和结束地址,可以有2楼的数据表;

出0入0汤圆

发表于 2017-10-27 09:46:09 | 显示全部楼层
没考虑上个文件系统,fatfs啥的?

出0入46汤圆

发表于 2017-10-27 10:16:48 | 显示全部楼层
文件系统

出0入91汤圆

发表于 2017-10-27 10:57:42 | 显示全部楼层
FLASH写入寿命有限

出0入0汤圆

发表于 2017-10-27 12:25:22 | 显示全部楼层
上电判断位置续写这个不现实,25Q64查到很后面的位置,需要的时间不短。
我现在的做法是用一块Fram,记录flash写到哪了,哪些写了多少次了,这样子,FLASH有变动就更新fram.

出0入0汤圆

发表于 2017-10-27 12:40:42 来自手机 | 显示全部楼层
chun2495 发表于 2017-10-27 09:06
先做一个数据表,比如1000个数据用不到1k的字节来表示,0或者1表示是否已经写入,然后写个for循环和地址对 ...

改为位映射表,应该会更省空间

出0入8汤圆

发表于 2017-10-27 12:44:52 来自手机 | 显示全部楼层
Gline77 发表于 2017-10-27 12:40
改为位映射表,应该会更省空间

具体怎么操作

出0入0汤圆

发表于 2017-10-27 13:01:45 来自手机 | 显示全部楼层
比如1000个数据,建立一个1000个bit的表

出0入0汤圆

 楼主| 发表于 2017-10-27 13:59:40 | 显示全部楼层
对于数据删除和数据查找,如果数据量大,几千条,删除的数据在中间呢?你们是怎么做的?后面的数据拷贝覆盖前面的数据实现的?
对于哪个区使用了,我打算这样做:
每个W25Q sector为4K, 对于每个sector使用4bit描述,对应的sector情况, 1111表示空, 1110表示正在使用,1100表示满, 1000表示该块被标记为删除,0000保留。每次先读取参数区的4K或8KB,判断我当前读取到哪里扇区,然后调取扇区的数据进行判断当前的读写位置。这样做最省FLASH,稍微麻烦。
如果每个page用4bit描述状态,就会好操作很多,但是参数区会占用稍多FLASH,20来K我觉得没所谓吧,几M的FLASH浪费几十K算不了什么,我FLASH保留区都几百KB了。对于删除中间的数据你们怎么操作的。。

出0入0汤圆

发表于 2017-10-27 14:08:09 | 显示全部楼层
关注 一下 这个问题

出0入0汤圆

发表于 2017-10-27 14:53:31 | 显示全部楼层
正常思路应该是上个文件系统的,然后就是另外一种搞法了。但SPI Flash有个特性,擦除较慢,写文件的时候,可能在擦除Flash,突然断电了,就悲剧了

出0入0汤圆

 楼主| 发表于 2017-10-27 15:06:11 | 显示全部楼层
存储的是大批量小型记录(温湿度数据、IC卡数据),如果上操作系统,我这频繁的删除和添加,会不会导致问题。

出0入0汤圆

发表于 2017-10-27 15:40:12 | 显示全部楼层
451006071 发表于 2017-10-27 15:06
存储的是大批量小型记录(温湿度数据、IC卡数据),如果上操作系统,我这频繁的删除和添加,会不会导致问题 ...

弄个铁电RAM先存着,够一定数量,再往Flash里写

出0入0汤圆

 楼主| 发表于 2017-10-27 15:44:07 | 显示全部楼层
硬件定了下来,没法修改,只有AT24C08和W25Q64

出0入0汤圆

发表于 2017-10-27 16:34:02 | 显示全部楼层
在STM32里面开个几K的RAM空间,如果全部有改动了,再写一次,这不是很好~

出0入4汤圆

发表于 2017-10-27 16:34:26 | 显示全部楼层
风险很大的做法:stm32 + rtc 用Backup_Register做记录指针,如果Backup_Register也掉了,只能历遍了。

出100入85汤圆

发表于 2017-10-27 16:40:17 来自手机 | 显示全部楼层
可以用接口兼容的铁电存储器

出0入0汤圆

发表于 2017-10-27 17:49:14 来自手机 | 显示全部楼层
入\ꪣ"ꪣ父货:JQ》!

出0入0汤圆

发表于 2017-10-27 19:51:10 | 显示全部楼层
分块处理   数据块之间一个索引地址    块内部一个索引地址  索引地址标识  写入地址   数据空  数据满
这样应该可以吧    具体自己根据实际情况处理     
  
像FAT 链表方式经得起数据变更 ,但是空间利用率不高,

出0入0汤圆

发表于 2017-10-27 21:23:57 来自手机 | 显示全部楼层
最近有个项目需要存储数据想想还是用24c512算了,spiflash插除太慢,就怕插除时掉电。

出140入8汤圆

发表于 2017-10-27 22:23:32 | 显示全部楼层
不知道armink大神的这个东西对你有用没?https://github.com/armink/EasyFlash

出0入9汤圆

发表于 2017-10-27 22:41:31 | 显示全部楼层
建议用EEPROM(或者FRAM)+Flash的方式

出0入0汤圆

发表于 2017-10-27 22:41:44 | 显示全部楼层
spcm 发表于 2017-10-27 15:40
弄个铁电RAM先存着,够一定数量,再往Flash里写

这个方法好,铁电存储速度快,并且不需要执行擦除操作,随时改随时写,每次写数据之后记录写数据SIZE,当SIZE大小大于1KB时候,执行一次血FLAH操作
头像被屏蔽

出0入0汤圆

发表于 2017-10-28 10:14:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2017-10-28 10:30:40 来自手机 | 显示全部楼层
立创商城-技术 发表于 2017-10-28 10:14
现在有大容量的SPI SRAM,接口同W25系列,操作RAM不用考虑太多比如删除或者寿命等等。这样的RAM,比如32KB ...

这sram跟同容量flash比差多少

出0入0汤圆

发表于 2017-10-28 10:32:56 | 显示全部楼层
上个文件系统吧,比如轻量级的spiffs

出10入120汤圆

发表于 2017-10-28 10:33:36 | 显示全部楼层
zhiwei 发表于 2017-10-27 21:23
最近有个项目需要存储数据想想还是用24c512算了,spiflash插除太慢,就怕插除时掉电。 ...

数据量稍大的情况下,FLASH操作速度比EEPROM快一些。

出0入85汤圆

发表于 2017-10-28 11:52:13 | 显示全部楼层
如果如果不会出现掉电情况,我会用RAM存数据,定期(如,1小时)保存入FLASH一次。

出0入85汤圆

发表于 2017-10-28 13:46:57 | 显示全部楼层
dzymushi 发表于 2017-10-27 12:25
上电判断位置续写这个不现实,25Q64查到很后面的位置,需要的时间不短。
我现在的做法是用一块Fram,记录fl ...

fram的实际写入速度能做到多少?

出50入0汤圆

发表于 2017-10-28 13:57:58 | 显示全部楼层
fram写入速度基本不用考虑,你的单片机SPI能跑多快就有多快。

出0入0汤圆

发表于 2017-10-28 16:46:03 来自手机 | 显示全部楼层
用B-tree/binary search tree组织,做日志型存储系统。定期垃圾回收。

出0入0汤圆

发表于 2017-10-28 16:56:54 来自手机 | 显示全部楼层
我风见的打卡机怎么都是网络的,数据都存到数据库了

出0入4汤圆

发表于 2017-10-29 09:26:58 | 显示全部楼层
http://elm-chan.org/fsw/ff/00index_p.html

帮到你这了,我用这个存储过MP3歌曲。

出105入79汤圆

发表于 2017-10-29 21:50:06 | 显示全部楼层
上文件系统

出105入79汤圆

发表于 2017-10-29 21:51:24 | 显示全部楼层
Petit FatFs 就是FatFs的精简版

出0入0汤圆

发表于 2017-10-29 22:04:29 | 显示全部楼层
marshallemon 发表于 2017-10-28 13:46
fram的实际写入速度能做到多少?

SPI的话这个得看你的单片机能多块,IIC的话最多400K吧好像

出0入0汤圆

发表于 2017-10-30 10:36:42 来自手机 | 显示全部楼层
24c08换成fm24c08来暂存数据和地址信息,这样最好了。

出0入0汤圆

发表于 2017-10-30 11:10:22 | 显示全部楼层
没什么要求的话上个文件系统就好。但如果你希望均衡擦写,断电不会损坏数据,文件系统就不太符合要求。毕竟常见的fatfs很难保证。我这里提供一个思路:1.同样类型(长度)的数据按sector保存称为数据sector,有个根来保存数据sector的信息,比如一个tag+flag,tag标识数据类型,flag表示sector状态(未使用,有空闲,写满,损坏),flag可以利用spi flash可以按位从0写1无需擦除的特性。2.数据sector按数据长度均分,然后前部放一个bit表表示有数据状态(00表示空闲,01表示有数据,11表示数据不能通过校验),数据从前往后写,这样只要检查最后一个置01的t就是最新的数据了。每一笔数据包括要保存数据+CRC校验,这样写数据结束CRC校验通过才算一个有效数据,再去改变bit表的状态,如果中途断电,这笔数据就无法设成01,当然读的时候需要看最后一个00的数据通过CRC校验来判定它是有效数据还是损坏数据。3.写满一个sector,新数据正确保存到新的sector后,再将写满的sector擦除回收(如果为了均衡擦写,可以暂时将sector置为写满状态,等待没有空闲sector后再进行擦除回收)。

出0入0汤圆

 楼主| 发表于 2017-10-31 09:58:49 | 显示全部楼层
谢谢各位,我直接用SPIFFS算了=。=,方便简单支持坏块处理。不知道为什么github下载的SPIFFS不能用,估计要大幅修改,还提示GNU什么什么的。然后我用了论坛里别人移植好的SPIFFS。→_→
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-6-3 22:22

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

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