[技术问答]

关于N76E003的FLASH保存需要修改几十万次掉电数据的问题讨论

[复制链接]
1485|14
手机看帖
扫描二维码
随时随地手机跟帖
kevinleez|  楼主 | 2019-6-19 14:52 | 显示全部楼层 |阅读模式
关于N76E003的FLASH保存需要修改几十万次掉电数据的问题讨论

最近要做一个项目,由于成本考虑,就选择了N76E003。这个项目有几个数据需要掉电保存,而且会被修改几十万次,我对cpu的FLASH做了一些规划保存的方案,各位帮忙看看可行不?
我保存的数据大概在4个左右,所以我把就准备把FLASH的最小页128Byte分成32Byte一个单元,总共4个单元;
每个单元32byte保存我的数据格式为:
byte 01:0xA5
byte 02:0x5A
byte 03:本页FLASH擦除次数(高位)
byte 04:本页FLASH擦除次数(低位)
byte 05~08:数据1(第一遍)+数据2(第一遍)+数据3(第一遍)+数据4(第一遍)
byte 09~12:数据1(第二遍)+数据2(第二遍)+数据3(第二遍)+数据4(第二遍)
byte 13~16:数据1(第三遍)+数据2(第三遍)+数据3(第三遍)+数据4(第三遍)
byte 17~20:数据1(第四遍)+数据2(第四遍)+数据3(第四遍)+数据4(第四遍)
byte 21~24:数据1(第五遍)+数据2(第五遍)+数据3(第五遍)+数据4(第五遍)
byte 25~28:数据1(第六遍)+数据2(第六遍)+数据3(第六遍)+数据4(第六遍)
byte 29~32:数据1(第七遍)+数据2(第七遍)+数据3(第七遍)+数据4(第七遍)

比如从8K地址(0X2000)~16K地址(0x4000)为保存数据的FLASH空间,那么从0x2000开始的第一个FLASH最小页128byte先擦除,然后把数据写入128byte中的第一个单元(1~32byte),当数据有修改的时候,保存到这个页FLASH的第二个单元(33~64byte),以此类推,一直到保存到第四个单元(也就是87~128byte)后,再有数据修改,就把这页FLASH擦除,再从第一个单元开始写(因为擦除后,所有的byte都变成了0xFF,我对前面32byte写,不会影响后面FLASH内的数据,后面FLASH的数据还是保持0XFF,所以第二次可以再对后面的数据进行写)。当这页FLASH被反复擦写达到5000次(由于一页FLASH被分成4个单元,相当于有效数据被修改了5000*4=20000次),就抛弃这一页,换成下一页的128Bye进行数据保存。(如果5000次内有发现数据的第一遍和第七遍中有不一致的,说明有对应的bit有损坏,直接跳转到下一页保存数据,即便知道有损坏了,由于我是保存了7遍,把不对的剔除掉还是比较容易的,使用比较的方式,把相等数据最多的那个数作为正确数据的正确性应该可以达到95%吧,呵呵)
0x2000~0x4000之间总共有64页,一页对应的可以保存20000次数据,64页就可以保存64*20000=128万次。

各位高人,觉得我的思路可行吗?提一下意见,大家讨论一下。

使用特权

评论回复
评论
windows100 2019-6-19 16:31 回复TA
如果5000次内有发现数据的第一遍和第七遍中有不一致的,说明有对应的bit有损坏。你存的本来就是修改数据怎么通过判断数据不一致,来断定数据有损坏。如果数据是不变的,就没有存储这么多次的意义,如果是变的,那前后数据肯定就会不一样。这里我没看明白,麻烦解释一下。 
kevinleez|  楼主 | 2019-6-19 14:54 | 显示全部楼层
目前的FLASH技术可以保存10万次,如果我把单页FLASH的保存次数提高到1万次,那么对于有效数据单页就可以保存4万次,我只需要32页就可以保存128万次,也就是0x2000~0x3000的FLASH空间即可。

使用特权

评论回复
tianxj01| | 2019-6-19 15:24 | 显示全部楼层
本帖最后由 tianxj01 于 2019-6-19 15:25 编辑
kevinleez 发表于 2019-6-19 14:54
目前的FLASH技术可以保存10万次,如果我把单页FLASH的保存次数提高到1万次,那么对于有效数据单页就可以保 ...


很多需要超次数擦写的,基本上都采取类似方法来做,即一次性擦除,陆续顺序跟着写下面数据,写满了再写新一页。
这里有一个东西非常需要技巧,那就是系统怎么去记录或者识别我到底写到什么地方了的问题。这才是更需要做可靠安排的东东,倒序搜索,搜索连续的FF到第一个非FF字符止,然后按照整数字节划定新的存储地址是一种可行的办法。
也有自己规定加入一个数据外的中止符,这样倒着搜索中止符就成了,程序效率高点,缺点是浪费一个存储空间。
为了节省运行时间,你还可以另外找一个位置存储页码,这样搜索效率会高很多,只是记录一个页码,该存储位置多次改写次数并不多,可靠性当不是问题。

使用特权

评论回复
kevinleez|  楼主 | 2019-6-19 16:55 | 显示全部楼层
tianxj01 发表于 2019-6-19 15:24
很多需要超次数擦写的,基本上都采取类似方法来做,即一次性擦除,陆续顺序跟着写下面数据,写满了再写新 ...

对的,我可以把0x2000开始的第一页中的第一个byte,用来保存当前保存到哪一页了。
当然,在对应一页范围内,有4个单元,我就只能取检测byte1和2、byte33和34、byte65和66以及byte97和98是否都为0xFF,因为开始是擦除FLASH的,所有所有byte都为0xFF。当写了第一个单元,那么byte1和byte2就有0xA5和0X5A了,下次要写入时,如果搜索到byte1和byte2不是0xFF,而byte33和byte34是0xFF,那么我就把数据写入第二个单元。

使用特权

评论回复
幸福小强| | 2019-6-19 23:01 | 显示全部楼层
那就是划分一段区间,再分成若干个写入分区,轮流写。写下一块时候,这个块擦擦,保持总是只有一个小分区是写有数据的,这样就方便读了。

使用特权

评论回复
幸福小强| | 2019-6-19 23:02 | 显示全部楼层
不知道我的想法是否符合楼主啊

使用特权

评论回复
小灵通2018| | 2019-6-19 23:24 | 显示全部楼层
主要是想**流写。

使用特权

评论回复
小灵通2018| | 2019-6-19 23:24 | 显示全部楼层
好像安卓就是用轮流写,实现的

使用特权

评论回复
ayb_ice| | 2019-6-20 09:17 | 显示全部楼层
用空间换寿命是可行的,也不难,

使用特权

评论回复
kevinleez|  楼主 | 2019-6-20 09:24 | 显示全部楼层
幸福小强 发表于 2019-6-19 23:01
那就是划分一段区间,再分成若干个写入分区,轮流写。写下一块时候,这个块擦擦,保持总是只有一个小分区是 ...

我本来的想法是一个扇区内轮流写,写完这个扇区再擦除,循环写5000次,再换下一个扇区。你的意思是多个扇区轮流写,比如32个扇区,等32个扇区全部写完,再全部擦除重新写一遍?
我后来仔细想了一下,你的想法比较好。因为我一直在考虑一个问题,就是我如果只对一个扇区重复写5000次,那么当正在擦除这个扇区的时候,突然断电了,那么这个扇区内所有的数据都没有....用户数据就没有了。如果按你说的轮流写,我一个扇区写完了,不擦除,先把数据写入下一个扇区,比如我写完了第1个扇区,写第2个扇区,当写到第3个扇区的时候,我去擦除第1个扇区;当写到第4个扇区的时候,我去擦除第2个扇区,这样的话,即使在我擦除是发生断电情况,我还是可以把其他扇区好的内容读出来。

使用特权

评论回复
kevinleez|  楼主 | 2019-6-21 22:19 | 显示全部楼层
今天已经写完程序,正在破坏性测试,1秒钟写100次,对30个扇区轮路写,一个扇区分16个单元。等于30个扇区全部写一遍,可以保存数据480次。我要保存999999次,相当于对这30个扇区擦写2100次左右,远低于极限10万次。。。。。。目前1秒钟写100次,只需要30个小时左右就可以写完100万次。。。。。我还对每个扇区的损坏情况做监控,有坏的扇区直接跳过。。。。等破坏性试验之后,我看着30个扇区是否有损坏(液晶屏上都可以显示出来)

使用特权

评论回复
caijie001| | 2019-6-22 09:56 | 显示全部楼层
kevinleez 发表于 2019-6-21 22:19
今天已经写完程序,正在破坏性测试,1秒钟写100次,对30个扇区轮路写,一个扇区分16个单元。等于30个扇区全 ...

赞,我记得还有一些flash擦写均衡算法,提高flash寿命的

使用特权

评论回复
kevinleez|  楼主 | 2019-6-23 11:58 | 显示全部楼层
目前已经对一个扇区擦写次数超过20万次,依然正常运行。。。。看来FLASH的擦写次数应该没有很大问题。
开始对30个扇区轮流写入擦除,进行5万次,没有问题。
昨天开始对2个扇区轮流写入擦除,到现在已经擦写了20多万次,没有问题。
继续擦写中.........

使用特权

评论回复
kevinleez|  楼主 | 2019-6-23 12:00 | 显示全部楼层
caijie001 发表于 2019-6-22 09:56
赞,我记得还有一些flash擦写均衡算法,提高flash寿命的

你说的擦写均衡算法是怎么样的,请教一下。
我是对一个扇区擦除,然后写16个单元的数据,一个单元8个byte,正好128个byte(一个扇区)。然后写下一个扇区。写完30个扇区后,又循环到第一个扇区开始擦除,写入。然后把30个扇区中有损坏的做标记,当下次擦写的时候,对损坏的扇区跳过。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

137

帖子

2

粉丝