个性签名:
强者为尊应让我
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
辛昕 发表于 2023-11-28 12:51 如果只是单纯的 AD采样数据—— 对我来说,我把它等同理解为 单一变量,比如说,你是12位AD ...针对写了个测试函数,验证可以。 代码在这里,https://gitee.com/xinxin19871118_admin/interview/blob/master/src/binary_search_4_flash_sector.c
回复了主题帖: spi flash是否可以位写?
bigbat 发表于 2023-11-29 12:30 软件行业有一则谚语:“输入的是垃圾,输出也是垃圾!”,谚语的原文我忘记了,普遍的翻译是这 ...https://gitee.com/xinxin19871118_admin/interview/blob/master/src/binary_search_4_flash_sector.c
回复了主题帖: spi flash是否可以位写?
bigbat 发表于 2023-11-29 10:13 数组的时间复杂度,无可避免是 O(n); 这个你都给我整不会了,数组使用线性搜索和链表也是不一样的, ...你考虑这么一个情况。 如果我要不断地往前覆盖,就是不在同一个地址写数据, 假如是 int a b c d 写入顺序是随机的 a b d d c c a a b c 这种情况下,你要查找a b c d中一个元素的最后一个覆写位置。查找时间,最坏情况就是 O(n),无论正查还是反查都一样 尤其是,万一查找不到的情况下。 而且,这个东西,没办法实现在 flash上排序。 除非重写,就是重新排序重新写入。 那这样的话,wl的代价就太大了。时间代价也大。
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
bobde163 发表于 2023-11-29 08:35 这么早的帖子了,辛辛还在一一回复,真是感动。针对断电的情景,我的设计思想是数据结构中使用一个字节的 ...哦,你也是用一个单独字节。 其实这样子的话,我建议还是用CRC一类的算法比较好。 因为你只能检查一个字节,但如果用上CRC,好处是可以检查一整条记录的有效性。 而代价都是一个字节。
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
damiaa 发表于 2023-11-29 08:59 2015的帖子大家都还在继续啊,看来这个问题很多人思考过。最近接触MSPM0的评测,里面有个eeprom模拟模型 A ...看到了,确实如此。 大差不差。 我所考虑的地方比较麻烦的地方在于多id情形。 单一id,其实很简单的,而且可以实现高速的二分查找。 麻烦的地方在于多id 而littlefs这种就实现了更全面的 wl 算法——这也是这个问题的核心难点和关键点。
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
bobde163 发表于 2023-11-29 08:35 这么早的帖子了,辛辛还在一一回复,真是感动。针对断电的情景,我的设计思想是数据结构中使用一个字节的 ...断电的话,其实都是类似的思路——就是检查数据的有效性。 无论是你设计的这个思路——这个思路我蛮喜欢的,可以节省一个字节。 还有就是我想到的CRC。 这个思路,littlefs里也是。 我昨晚在看littlefs的思路,我突然发现,它的核心搜索算法其实和我设想的,大差不差,所以我也不折腾了,我决定移植它,或者对比spiffs. 当然,从活跃和适用性而言,以及后续进一步维护角度,littlefs更好。
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
辛昕 发表于 2023-11-28 12:51 如果只是单纯的 AD采样数据—— 对我来说,我把它等同理解为 单一变量,比如说,你是12位AD ...我确认了,这个问题是可以使用二分查找的。 因为,这个问题可以进一步抽象为 对于char A[size],A的前半部分已经存入无序非0元素,A的后半部分全部为0. 请采用快速的查找方法,找到无序非0元素的长度。 这个方法,之所以可以用二分查找,是因为—— 如果我们把 char A[size],看成是 short B[size/2]; 那么,无须非0元素出现的位置,一定就是在一个 0xXX00的地方。 而这个元素的类型,在B中是唯一的,而且,有且只有一个。 而它的左边全部是 0xXXXX,右边全部是 0x0000。由于我们并不关心,0xXXXX的大小问题,而0x0000显然也全部是0,对于任何一个B,它的左侧、右侧,永远可以区分 全0xXXXX 和 0x0000
回复了主题帖: spi flash是否可以位写?
bigbat 发表于 2023-11-28 14:19 只要是flash物理上就是先擦除后写入,而且是以块为单位的,读取也是以块为单位的,flash的擦除是有次数的, ...数组的时间复杂度,无可避免是 O(n); ——当然,这里说的数组,指的是顺序访问的意思 而链表,其好处是,可以只一路查找一个 ID 我的设计意图是 ,以ID为标识,设计的实际存储段内容是 这里只考虑 1/2/4 B的情形,更多的数组后续另行考虑 【ID:2B】【LEN:1B】【DATA:1~4B】【NEXT_ADDR(*)】【CHECK:1B】 *在真正找到下一个位置写入同一个ID的内容以前,NEXT_ADDR是 FF FF,相当于一般链表元素的 *next,指向下一个元素的地址。 原本,我可以把它设计成一个栈(这样就永远可以把最新写入的地址浮在栈顶,可以实现O(1)常数时间查找) 然而,我后来意识到,没办法,因为,已经写入的NEXT_ADDR没办法改变。 而且,相同的问题会出现,无论是要设置成二叉查找树,还是任何带指针的结构,都没有办法,因为,这个位置已经写入了。 在这种情况下,查找时间就变成了同一个ID已经写入的次数。 这个效果,比 O(n)在平均情况下会好一些,但在极端情况下,两者实际是一样的。
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
辛昕 发表于 2023-11-26 06:58 基本想通了,过了很久。 没什么好纠结的。 就是用 TLV 结构,当然还要加个 ID。 然后,数据在 ...预建二叉树的做法是不行的。 我自己补充一下。 常见这一楼的回答 http://bbs.eeworld.com.cn/thread-1264747-1-1.html#pid3282030
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
wj1478 发表于 2016-12-8 18:17 请教楼主关于nand flash的问题,一个单片机系统要将AD采样的数据存储到nand flash中,数据量较大,需要考虑 ...如果只是单纯的 AD采样数据—— 对我来说,我把它等同理解为 单一变量,比如说,你是12位AD,那么,你每次采样的数据应该是用 16位,2字节存储。 假如是这种单一变量。 我认为这种特殊的磨损平衡是很容易实现的。 我提个思路,你参考一下。 由于是单一变量,2字节(对于1字节,4字节都一样)——重点不是多长,而是单一变量。 你可以为它划分一个片区。 并非一定是1个sector 或者 一页。 你可以不断地往前写啊写啊。 由于你是单一变量,并且定长——我建议是,无论一个数据块多长(AD这个情形是2个字节),我建议你设计成为2的幂,比如 1 2 4 8 16...等。 如此,由于你不断往前写。 你要搜索最新的写入位置 和 计算已写入多少,可以通过很简单的二分查找实现高效率。 为啥呢? 很简单,对于一个没写完的片 前面全部是有效数据,即,非全FF FF 后面未写区域全部是 FF FF 在AD 2字节这个情形里——假设你的AD采样值不可能出现 FF FF (假设有,那你就把每个字节定义为 4字节好了,这样,无论如何都不可能出现 FF FF FF FF,因为最多也就是 00 00 FF FF——大端存储) 如此,你可以对地址,进行 4字节对齐查找。 当你找到那个 前四个字节 非全FF 后四个字节全FF 时,就完成了查找。 这个查找可以等价为下面一个问题 1、在一个 4字节长度(比如为uint32_t)数组 uint32_t A[N],前m个数据非0xFFFFFFF,m+1到n-1 为全0xFFFFFFFF,请设计一个高效算法,查找m的位置。 显然,这个题目是对上述sector的抽象,而这个问题,显然是可以使用二分查找法。 我的第一直觉是这个应该是可以二分查找的,让我思考一下——确认一下,毕竟,它不是有序数列。但是它比较特殊的是,后面都是最大的FF FF FF FF 应该可以。
回复了主题帖: spi flash是否可以位写?
回复了主题帖: spi flash是否可以位写?
bigbat 发表于 2023-11-27 16:45 只要是flash都是块写的,只有eeprom是可以位写的,而且eeprom的寿命也比flash长。哦,eeprom可惜贵了点...... 话说,铁电和eeprom相比如何,我的意思是,如果要用eeprom的话,是不是fram更经济实惠还合适
回复了主题帖: spi flash是否可以位写?
ljj3166 发表于 2023-11-27 19:23 干哈要这么办?减少擦写次数?对。
发表了主题帖: spi flash是否可以位写?
回复了主题帖: 为什么MCU也需要AI?
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
bobde163 发表于 2015-8-2 22:31 我当时的做法是比较简单的,就在2个page的空间做成了一个环形存储器,每次有数据更新就往下一个空间写入 ...基本想通了,过了很久。 没什么好纠结的。 就是用 TLV 结构,当然还要加个 ID。 然后,数据在FLASH物理地址里是顺序往前写。 至于如何记住某个ID最后的地址,考虑的方法是 预建一颗二叉查找树,二叉树以ID值为关键值排序(这样可以实现 平均 O(LogN)的操作时间) 预建是在初始化时,以当前FLASH区域写入情况的最后一页来实现—— 最后一页的定位是相对容易的,而且可以用很标准的二分查找实现——因为未写入区域是纯 FF FF FF FF FF FF FF 这个查找起来,比在一堆(就算是一堆未排序定长TLV结构快 里查找某个特定ID的TLV块的最后一个记录,是两个不一样的算法题。 ) 至于断电等情形,我的想法是 构建的TLV结构快,要留一个CRC校验码;因此.....而且这个过程其实和wl不wl没关系 但凡flash写入,都有这种危险,因此CRC校验,足够防止;
回复了主题帖: 用flash存储数据,你还想着用文件系统?不,你需要的是......wear leveling
白丁 发表于 2015-8-1 22:47 对于算法的仿真有宾夕法尼亚州立大学开发的flashsim还有华科胡洋博士的ssdsim,都是不错的仿真平台,可以省 ...那个,我突然觉得,很多年前你误解了我的意思 当然,主要是我也没说清楚。 那时候我自己也是往这方面找的。 其实严格来说,我不关心文件系统,我关心的是 单片机小参数存储场合。 也就是说,其实我不是fs,我是kv键值对...... 所以,很多现成的wl库,都是在fs场合里用的
回复了主题帖: 简单说说链表和一个应用实例
终南愚公 发表于 2023-11-4 16:07 好像没有讲清楚链表和游标的联系?没有什么联系,游标只是一种非动态分配的方案。 也不只有链表会用到对栈的分配。
回复了主题帖: 真心请问大佬们嵌入式怎么规划职业生涯
回复了主题帖: 发现一个生产国产高速ADC的厂家
已有89261人来访过