求助FATFS文件系统中正点原子提供FTL转化层算法

2019-07-21 01:04发布

最近在学习正点原子提供的FATFS文件系统,在针对NAND FLASH设备,正点原子提供了FTL层使它能兼容FAT文件系统,但正点原子没有提供关于FTL较为详细的资料!大家有关于FTL详细的文档或自己的见解吗?正点原子提供的FTL用的算法均衡摩擦算法是什么?有没有垃圾回收?坏块管理?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
26条回答
正点原子
1楼-- · 2019-07-22 18:37
1,因为我们规定以512字节为单位访问SD卡。所以,你如果写入数据不是512的整数倍,FATFS会等待数据填满512字节再调用写入函数。
2,这里确实应该是个bug,不用除512
3,快内复制没有做坏块检查的,坏块检查在ecc出错的时候才执行,而且会多次读取以确认,然后会进行坏块检查,如果确实是坏块,则会标记坏块。不会直接标记保留区的。
4,新建文件和写文件可能会,读文件一般就不会出现2bitecc错误了。
fskofcpu
2楼-- · 2019-07-22 22:05
本帖最后由 fskofcpu 于 2018-12-13 23:27 编辑
正点原子 发表于 2018-12-13 02:51
1,因为我们规定以512字节为单位访问SD卡。所以,你如果写入数据不是512的整数倍,FATFS会等待数据填满512 ...

非常感谢您的解答。
1、对于第一个问题,我经过查询,如果写入字节小于512,则FATFS先从物理磁盘相应扇区位置读取一扇区内容到buffer中,然后修改其中相应内容,并设置回写标记,这样下次调用f_close或者f_write时,就会将buffer内容回写到物理设备中,这也就符合每512字节写一次。读的过程与此类似。这样理解对吧?
2、对于第二个问题,您上次给的人回复:http://www.openedv.com/posts/list/22812.htm。说也得除以512。我上网查询,有人这样写到:GET_BLOCK_SIZE 代表着:返回以扇区为单位的存储阵列的擦除块大小赋给 Buffer 指向的 DWORD 变量。当擦除块大小未知或是磁盘设备时,返回 1 。只在 f_mkfs 函数中,使用了该命令。

那么按照这种说法,也是需要除以512来获取扇区数了。那这个地方到底应该怎么回事?

3、对于第三个问题,源代码中:块内复制确实没有坏块检查,但却会标记坏块,若复制不成功,则会标记从保留区搜到的未使用的块为坏块,然后重建LUT表;若复制成功,则会标记该块已经使用,并修正LUT表,然后擦除源块,这样源块不就进入保留区了?我这样理解对吗?
    另外我还想搞明白的是:您所实现的这个FTL主要是通过保留区来实现坏块管理和均衡摩擦(块内复制)吗?但是这样均衡摩擦好像没什么效果还是我理解的有错误???因为每次操作的块还是从头开始啊,并没有随机!!!

感谢您的耐心解答!

正点原子
3楼-- · 2019-07-22 23:05
1,大体是这样,fatfs源码我是没看过的,你可以屡一下。
2,关于:GET_BLOCK_SIZE,FATFS是这样解释的:Returns erase block size of the flash memory media in unit of sector into the DWORD variable pointed by buff. The allowable value is 1 to 32768 in power of 2. Return 1 if the erase block size is unknown or non flash memory media. This command is used by only f_mkfs function and it attempts to align data area on the erase block boundary. Required at FF_USE_MKFS == 1., 因此,是返回以扇区为单位的block大小,因此要/512,之前我说错了。我们代码是没问题的。
3,不对。
fskofcpu
4楼-- · 2019-07-23 01:25
 精彩回答 2  元偷偷看……
正点原子
5楼-- · 2019-07-23 04:31
 精彩回答 2  元偷偷看……
fskofcpu
6楼-- · 2019-07-23 04:38
本帖最后由 fskofcpu 于 2018-12-15 23:53 编辑
正点原子 发表于 2018-12-15 02:40
保留区的作用:
1,替换有问题的块
2,内部数据拷贝时可以作为目标块,提高速度。

谢谢您的解答!
原子哥,我想搞明白:FTL中磨损均衡是怎么实现的。(我说利用保留区,你说不正确)您能细说说均衡摩擦的原理吗?这对我理解很重要,谢谢啦。
下面图片是我从开发指南看到的:

一周热门 更多>