硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4783|回复: 9
收起左侧

[有问必答] 如何实现数据的循环覆盖保存

[复制链接]

8

主题

11

回帖

35

积分

新手上路

积分
35
发表于 2019-10-14 14:05:52 | 显示全部楼层 |阅读模式
代码截图太小看不到,所以我直接上传附件。 数据循环保存.pdf (161.32 KB, 下载次数: 37)

1、目的是将每次测得的温湿度数据保存到W25Q128,可以做到数据循环覆盖,随机删除。
2、目前是将每一次测的数据保存到一个扇区,就是保存到flash芯片的1~255扇区(1个扇区=4KB=4096字节),虽然浪费空间,但是这样简单实现。

3、我现在用的链表的方式,能够保存255条数据,也可以随机删除一条数据。但是保存满后就无法再保存了,和我自己想实现的循环覆盖功能还差一步。

PS:之前试了一种方式,就是定义了3个变量,实现了循环保存和随机删除,但是在随机删除一条数据时,就会存在搬移数据,数据记录少时,卡顿还感觉不到。
一旦多了起来,在删除数据时,就会存在卡顿。所以就pass掉了。


4、我不知道接下来该怎么实现循环覆盖,始终觉得链表很抽象,使用起来就是一步一步在试。目前严重感觉这种解决实际问题的方法严重不足,有些东西只能照搬书上的,并且还不会灵活运用。
我这个就是一个自己做的小东西,课程试验那种。直接就是 单片机+W25Q128芯片+4个独立按键+LCD屏

5、希望看见的老师们能给我指点一二,这种数据保存还有没有其他好方法。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2019-10-15 00:09:06 | 显示全部楼层
这个里面有个关键问题,就是你需要做个擦写均衡支持,可以移植个littleFS或者SPIFS
回复

使用道具 举报

8

主题

11

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2019-10-15 09:23:10 | 显示全部楼层
eric2013 发表于 2019-10-15 00:09
这个里面有个关键问题,就是你需要做个擦写均衡支持,可以移植个littleFS或者SPIFS

如果不考虑使用文件系统,自己写逻辑呢
回复

使用道具 举报

96

主题

297

回帖

585

积分

金牌会员

123

积分
585
发表于 2019-10-17 14:36:03 | 显示全部楼层
雅虎9527 发表于 2019-10-15 09:23
如果不考虑使用文件系统,自己写逻辑呢

我也遇到相同问题
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2019-10-17 15:19:09 | 显示全部楼层
本帖最后由 caicaptain2 于 2019-10-17 15:43 编辑

spi保证寿命10万次,每小时一次,可以用10年。
每分钟一次,就切换扇区写,或者用eeprom,它是100万次的寿命。。
每秒一次就换别的类型存储器吧。


看你的单次数据量似乎并不多,读写速度要求也不高,用FRAM铁电就好了。
软件不好解决,就用硬件来解决。

还有,随便baidu了一下,https://blog.csdn.net/jxgxlm2008/article/details/51880799
回复

使用道具 举报

335

主题

2040

回帖

3050

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3050
发表于 2019-10-17 15:28:30 | 显示全部楼层
想到一个办法,一组数据的最后加上一个序号,每次存储前读取全部数据,取序号最大的数据,序号加一,存储数据,删除序号最小的数据。序号使用长整型即可。应该计数够了。序号大小,也可用来判断当前扇区和地址。
回复

使用道具 举报

36

主题

1446

回帖

1554

积分

至尊会员

积分
1554
发表于 2019-10-17 16:01:44 | 显示全部楼层
Flash最忌讳就是每次写数据都擦除。这里提供一种思路:假设你需要对4个字节循环写{0-1-2-3-4......},那么你可以开辟一个扇区【4096字节】出去。首次写的话将扇区擦除,然后依次按照顺序去写,读取的时候你需要判断哪个数据是最新的即可。理论上循环1024字才需要擦除一下。大大提高了寿命。
回复

使用道具 举报

8

主题

11

回帖

35

积分

新手上路

积分
35
 楼主| 发表于 2019-10-17 16:14:46 | 显示全部楼层
caicaptain2 发表于 2019-10-17 15:28
想到一个办法,一组数据的最后加上一个序号,每次存储前读取全部数据,取序号最大的数据,序号加一,存储数 ...

循环链表应给可以解决这个问题,只是觉得链表没有完全理解,还不知道如何实现功能
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-7-14 14:44:59 | 显示全部楼层
你好,大佬。请问你这个问题搞定了吗?遇到了同样的问题 ,能否指点指点?
回复

使用道具 举报

5

主题

18

回帖

33

积分

新手上路

积分
33
发表于 2021-7-14 20:57:05 | 显示全部楼层
我不太理解的是,为什么删除的时候会卡顿?我觉得应该合理地安排一下任务
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 23:10 , Processed in 0.225532 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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