OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6219|回复: 27

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

[复制链接]

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
发表于 2018-12-7 00:34:04 | 显示全部楼层 |阅读模式
1金钱
最近在学习正点原子提供的FATFS文件系统,在针对NAND FLASH设备,正点原子提供了FTL层使它能兼容FAT文件系统,但正点原子没有提供关于FTL较为详细的资料!大家有关于FTL详细的文档或自己的见解吗?正点原子提供的FTL用的算法均衡摩擦算法是什么?有没有垃圾回收?坏块管理?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-7 01:46:51 | 显示全部楼层
我们算法比较简单,分析源码吧
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-7 12:34:21 | 显示全部楼层
正点原子 发表于 2018-12-7 01:46
我们算法比较简单,分析源码吧

FTL中包含了均衡摩擦和垃圾回收及坏块管理等功能了吗?您能简单说一下均衡摩擦和坏块管理是怎么实现的吗?
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-7 12:42:50 | 显示全部楼层
正点原子 发表于 2018-12-7 01:46
我们算法比较简单,分析源码吧

  学习过程还遇到一个问题是:每当读文件的时候总是出现ecc出错>2bit,无论文件>512还是<512字节。但数据都是正确的。(现象是每f_read()一次都返回一个ecc>2bit的校验错误)。
另外我看具体代码,无论我们读写大于512字节还是小于512字节,每次FTL_ReadSectors(buff,sector,512,count);FTL_WriteSectors((u8*)buff,sector,512,count);还是以512字节为单位啊。这样<512字节的岂不也需要ecc校验,但内容却没有512个字节啊。
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-7 13:00:13 | 显示全部楼层
正点原子 发表于 2018-12-7 01:46
我们算法比较简单,分析源码吧

在FTL_ReadSectors()函数中有这么一句,不太明白。
if(flag==NSTA_ECC2BITERR)flag=0;        //2bit ecc错误,不处理(可能是初次写入数据导致的)
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-7 21:26:53 | 显示全部楼层
有了解的大神吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-8 01:28:44 | 显示全部楼层
fskofcpu 发表于 2018-12-7 13:00
在FTL_ReadSectors()函数中有这么一句,不太明白。
if(flag==NSTA_ECC2BITERR)flag=0;        //2bit ecc错误, ...

多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有问题了。所以要忽略这种情况
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-9 16:03:25 | 显示全部楼层
正点原子 发表于 2018-12-8 01:28
多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有 ...

原子哥,我上面3、4楼的问题能帮我看看是什么问题吗
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-9 16:15:47 | 显示全部楼层
正点原子 发表于 2018-12-8 01:28
多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有 ...

串口发上来调试信息:
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
err hd,rd:0xff9a5999,0xff96a69a
eccnum,eccstart:1,0
PageNum,ColNum:261888,0
2bit ecc error or more
err hd,rd:0xffaaa599,0xffaaa6a5
eccnum,eccstart:1,1
PageNum,ColNum:261888,512
2bit ecc error or more
容量
disk total volume:950 MB
disk valid volume:950 MB
扫描到文件
err hd,rd:0xff9966a5,0xbedede4c
eccnum,eccstart:1,0
PageNum,ColNum:262002,0
2bit ecc error or more
1:/0
1:/1
1:/2
1:/3
读文件0:
Read file data is:
err hd,rd:0xff033cc0,0xf7ff9e4c
eccnum,eccstart:1,0
PageNum,ColNum:262003,0
2bit ecc error or more
0031   0032   0033   0034   0035   0036   0037   0038   0039   0000   
Readed data len:10
Read data over
读文件3:
Read file data is:
err hd,rd:0xffffffff,0x00
eccnum,eccstart:1,0
PageNum,ColNum:262004,0
2bit ecc error or more
0000   0001   0002   0003   0004   0005   0006   0007   0008   0009   
000A   000B   000C   000D   000E   000F   0010   0011   0012   0013   0014   0015   0016   0017   0018   0019   001A   001B   001C   001D   001E   001F   0020   0021   0022   0023   0024   002…………后面还有很多数据,但每512字节就有>2bit的ECC错误

下面是测试函数:

FTL_Init();
        fatfs_init();
        res=f_mount(fs[1],"1:",1); //挂载NAND FLASH.
                if(res==0X0D)//NAND FLASH磁盘,FAT文件系统错误,重新格式化NAND FLASH
                {
                        printf("%s\r\n","NAND Disk Formatting...");//格式化NAND
                        res=f_mkfs("1:",1,4096);//格式化FLASH,2,盘符;1,不需要引导区,8个扇区为1个簇
                        if(res==0)
                        {
                                f_setlabel((const TCHAR *)"0:NANDDISK");        //设置Flash磁盘的名字为:NANDDISK
                                printf("%s\r\n","NAND Disk Format Finish");                //格式化完成
                        }else printf("%s\r\n","NAND Disk Format Error ");        //格式化失败
                        delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();
                }
        DELAY_US(1000000L);

        //fatfs_unlink((u8*)"1:/3");

        fatfs_showfree((u8*)"1:");//显示剩余容量
        fatfs_scan_files((u8*)"1:");//遍历文件

        fatfs_open((u8*)"1:/1",0x01);//打开、读取文件
        fatfs_read(10);
        fatfs_close();
        fatfs_open((u8*)"1:/3",0x01);
        fatfs_size();
        fatfs_read(8192);
        fatfs_close();
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-9 16:17:00 | 显示全部楼层
正点原子 发表于 2018-12-8 01:28
多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有 ...

串口发上来调试信息:
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
bad block index:2440
bad block index:3940
total block num:4096
good block num:4094
valid block num:3807
err hd,rd:0xff9a5999,0xff96a69a
eccnum,eccstart:1,0
PageNum,ColNum:261888,0
2bit ecc error or more
err hd,rd:0xffaaa599,0xffaaa6a5
eccnum,eccstart:1,1
PageNum,ColNum:261888,512
2bit ecc error or more
容量
disk total volume:950 MB
disk valid volume:950 MB
扫描到文件
err hd,rd:0xff9966a5,0xbedede4c
eccnum,eccstart:1,0
PageNum,ColNum:262002,0
2bit ecc error or more
1:/0
1:/1
1:/2
1:/3
读文件0:
Read file data is:
err hd,rd:0xff033cc0,0xf7ff9e4c
eccnum,eccstart:1,0
PageNum,ColNum:262003,0
2bit ecc error or more
0031   0032   0033   0034   0035   0036   0037   0038   0039   0000   
Readed data len:10
Read data over
读文件3:
Read file data is:
err hd,rd:0xffffffff,0x00
eccnum,eccstart:1,0
PageNum,ColNum:262004,0
2bit ecc error or more
0000   0001   0002   0003   0004   0005   0006   0007   0008   0009   
000A   000B   000C   000D   000E   000F   0010   0011   0012   0013   0014   0015   0016   0017   0018   0019   001A   001B   001C   001D   001E   001F   0020   0021   0022   0023   0024   002…………后面还有很多数据,但每512字节就有>2bit的ECC错误

下面是测试函数:
        FTL_Init();
        fatfs_init();
        res=f_mount(fs[1],"1:",1); //挂载NAND FLASH.
                if(res==0X0D)//NAND FLASH磁盘,FAT文件系统错误,重新格式化NAND FLASH
                {
                        printf("%s\r\n","NAND Disk Formatting...");//格式化NAND
                        res=f_mkfs("1:",1,4096);//格式化FLASH,2,盘符;1,不需要引导区,8个扇区为1个簇
                        if(res==0)
                        {
                                f_setlabel((const TCHAR *)"0:NANDDISK");        //设置Flash磁盘的名字为:NANDDISK
                                printf("%s\r\n","NAND Disk Format Finish");                //格式化完成
                        }else printf("%s\r\n","NAND Disk Format Error ");        //格式化失败
                        delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();delay_200ns();
                }
        DELAY_US(1000000L);

        //fatfs_unlink((u8*)"1:/3");

        fatfs_showfree((u8*)"1:");//显示剩余容量
        fatfs_scan_files((u8*)"1:");//遍历文件

        fatfs_open((u8*)"1:/0",0x01);//打开、读取文件
        fatfs_read(10);
        fatfs_close();
        fatfs_open((u8*)"1:/3",0x01);
        fatfs_size();
        fatfs_read(8192);
        fatfs_close();
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-10 23:13:49 | 显示全部楼层
正点原子 发表于 2018-12-8 01:28
多看几遍。
第一次写的时候,根本就没有数据,全部是0XFF,读出来ECC校验值的位置,也是0XFFF
自然就有 ...

原子哥,麻烦你看一下我的问题,谢谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-12 01:26:15 | 显示全部楼层
fskofcpu 发表于 2018-12-10 23:13
原子哥,麻烦你看一下我的问题,谢谢!

没看明白你问题是什么?
你直接用我们例程,可以操作么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-12 23:36:12 | 显示全部楼层
正点原子 发表于 2018-12-12 01:26
没看明白你问题是什么?
你直接用我们例程,可以操作么?

现在我有疑问的几点如下:
1、底层驱动中规定:大于512字节进行ECC校验,小于512字节不进行ECC校验,但是在读写时我看代码都是以512字节(扇区大小)为单位,根本没有区分写入字节到底是多少:因为diskio.c文件中disk_read和disk_write分别调用的FTL函数为:FTL_ReadSectors(buff,sector,512,count);//读取数据FTL_WriteSectors((u8*)buff,sector,512,count);//写入数据。单位都是512而不是我们要写入读取的字节数。

2、在diskio.c文件中的disk_ioctl函数中获取nand参数:在case  GET_BLOCK_SIZE  等于 nand_dev.page_mainsize/512;//block大小,定义成一个page的大小。明明要定义成一个page大小为什么还要除以512.

3、您实现的坏块管理和均衡摩擦主要是通过保留区实现的。剩下百分之七的块作为保留区,提供坏块替换的块和plane内复制时的替换块,后者擦除成功后可以继续留在保留区使用不成功丢弃为坏块,如此循环往复。我这样理解对吗?

4、我现在遇到的问题就是,如上面我贴出的代码(串口返回的信息):无论我进行何种操作:比如打开文件、写入文件,读取数据(每读取512字节,好像缓存只有这么大)都会返回一个>2bit的ECC校验错误。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-13 02:51:02 | 显示全部楼层
1,因为我们规定以512字节为单位访问SD卡。所以,你如果写入数据不是512的整数倍,FATFS会等待数据填满512字节再调用写入函数。
2,这里确实应该是个bug,不用除512
3,快内复制没有做坏块检查的,坏块检查在ecc出错的时候才执行,而且会多次读取以确认,然后会进行坏块检查,如果确实是坏块,则会标记坏块。不会直接标记保留区的。
4,新建文件和写文件可能会,读文件一般就不会出现2bitecc错误了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-13 23:25:57 | 显示全部楼层
本帖最后由 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主要是通过保留区来实现坏块管理和均衡摩擦(块内复制)吗?但是这样均衡摩擦好像没什么效果还是我理解的有错误???因为每次操作的块还是从头开始啊,并没有随机!!!

感谢您的耐心解答!

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-14 02:27:13 | 显示全部楼层
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,不对。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-14 23:54:59 | 显示全部楼层
正点原子 发表于 2018-12-14 02:27
1,大体是这样,fatfs源码我是没看过的,你可以屡一下。
2,关于:GET_BLOCK_SIZE,FATFS是这样解释的:Re ...

谢谢您的解答。
关于第三个问题,我从代码和开发指南上理解的是上面那样,由于问了好几个地方,不知道错在什么地方了?希望原子哥能给我指点指点。谢谢!
保留区在这里作用难道不是为了坏块管理和均衡摩擦吗?只是我自己理解这样好像没什么效果来均衡摩擦?还请您详细指点一下!

下面是块内复制源代码:
u8 FTL_CopyAndWriteToBlock(u32 Source_PageNum,u16 ColNum,u8 *pBuffer,u32 NumByteToWrite)
{
    u16 i=0,temp=0,wrlen;
    u32 source_block=0,pageoffset=0;
    u32 unusedblock=0;
    source_block=Source_PageNum/nand_dev.block_pagenum;        //获得页所在的块号
    pageoffset=Source_PageNum%nand_dev.block_pagenum;        //获得页在所在块内的偏移
retry:      
    unusedblock=FTL_FindSamePlaneUnusedBlock(source_block);//查找与源块在一个plane的未使用块
    if(unusedblock>nand_dev.block_totalnum)return 1;        //当找到的空余块号大于块总数量的话肯定是出错了
    for(i=0;i<nand_dev.block_pagenum;i++)                                //将一个块的数据复制到找到的未使用块中
    {                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        if(i>=pageoffset&&NumByteToWrite)                                //数据要写入到当前页
        {
                        if(NumByteToWrite>(nand_dev.page_mainsize-ColNum))//要写入的数据,超过了当前页的剩余数据
                        {
                                wrlen=nand_dev.page_mainsize-ColNum;        //写入长度等于当前页剩余数据长度
                        }else wrlen=NumByteToWrite;                                        //写入全部数据
            temp=NAND_CopyPageWithWrite(source_block*nand_dev.block_pagenum+i,unusedblock*nand_dev.block_pagenum+i,ColNum,pBuffer,wrlen);
                        ColNum=0;                                                //列地址归零
                        pBuffer+=wrlen;                                        //写地址偏移
                        NumByteToWrite-=wrlen;                        //写入数据减少                       
                }else                                                                //无数据写入,直接拷贝即可
                {
                        temp=NAND_CopyPageWithoutWrite(source_block*nand_dev.block_pagenum+i,unusedblock*nand_dev.block_pagenum+i);
                }
                if(temp)                                                        //返回值非零,当坏块处理
                {
                        FTL_BadBlockMark(unusedblock);        //标记为坏块
                        FTL_CreateLUT(1);                                //重建LUT表
                        goto retry;
                }
    }
    if(i==nand_dev.block_pagenum)                         //拷贝完成
    {
        FTL_UsedBlockMark(unusedblock);                //标记块已经使用       
        NAND_EraseBlock(source_block);                //擦除源块
                //printf("\r\ncopy block %d to block %d\r\n",source_block,unusedblock);//打印调试信息
                for(i=0;i<nand_dev.block_totalnum;i++)        //修正LUT表,用unusedblock替换source_block
                {
                        if(nand_dev.lut==source_block)
                        {
                                nand_dev.lut=unusedblock;
                                break;
                        }
                }  
    }
    return 0;                               //成功
}   
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-15 02:40:57 | 显示全部楼层
fskofcpu 发表于 2018-12-14 23:54
谢谢您的解答。
关于第三个问题,我从代码和开发指南上理解的是上面那样,由于问了好几个地方,不知道错 ...

保留区的作用:
1,替换有问题的块
2,内部数据拷贝时可以作为目标块,提高速度。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-15 23:52:44 | 显示全部楼层
本帖最后由 fskofcpu 于 2018-12-15 23:53 编辑
正点原子 发表于 2018-12-15 02:40
保留区的作用:
1,替换有问题的块
2,内部数据拷贝时可以作为目标块,提高速度。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-12-16 02:14:58 | 显示全部楼层
fskofcpu 发表于 2018-12-15 23:52
谢谢您的解答!
原子哥,我想搞明白:FTL中磨损均衡是怎么实现的。(我说利用保留区,你说不正确)您能 ...

磨损均衡主要用在快内拷贝写入这个操作上面,也就是:FTL_CopyAndWriteToBlock函数。
每次执行这个函数,基本都会使用不同的新块来做目标块,这样不会重复操作某个块,就实现了磨损均衡(只是一定程度上)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-20 23:13:08 | 显示全部楼层
正点原子 发表于 2018-12-16 02:14
磨损均衡主要用在快内拷贝写入这个操作上面,也就是:FTL_CopyAndWriteToBlock函数。
每次执行这个函数 ...

谢谢原子哥这几次的耐心解答,还在学习中……
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2018-12-31 23:30:37 | 显示全部楼层
正点原子 发表于 2018-12-16 02:14
磨损均衡主要用在快内拷贝写入这个操作上面,也就是:FTL_CopyAndWriteToBlock函数。
每次执行这个函数 ...

您好,原子哥:我们在利用API函数f_unlink删除文件时只是修改了FAT表和文件目录项,没有真正的删除数据(也就是擦除块),所以需要垃圾回收管理。正点原子设计的FTL好像没有这一功能吧,那么使用时间长了不就没有可用空闲块了吗?那怎么办啊!谢谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-1 02:53:08 | 显示全部楼层
fskofcpu 发表于 2018-12-31 23:30
您好,原子哥:我们在利用API函数f_unlink删除文件时只是修改了FAT表和文件目录项,没有真正的删除数据( ...

你可以移植开源的NAND 文件系统,比如yaffs
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2019-1-20 22:49:32 | 显示全部楼层
正点原子 发表于 2019-1-1 02:53
你可以移植开源的NAND 文件系统,比如yaffs

原子哥,利用正点原子FatFS+FTL对NAND FLash进行读写文件,读写速度大约是多少?谢谢!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-1-22 01:32:05 | 显示全部楼层
fskofcpu 发表于 2019-1-20 22:49
原子哥,利用正点原子FatFS+FTL对NAND FLash进行读写文件,读写速度大约是多少?谢谢!

我们测试是700KB左右首次写入。
后续是400KB~500KB的复写速度。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2017-7-9
在线时间
19 小时
 楼主| 发表于 2019-5-21 12:58:36 | 显示全部楼层
正点原子 发表于 2019-1-22 01:32
我们测试是700KB左右首次写入。
后续是400KB~500KB的复写速度。

原子哥,我想请教一下NAND FLash随机读写问题,正点原子设计的FafFS+FTL对NAND Flash读写时是以扇区512字节为单位的,页面大小是4K,但是FTL层的底层驱动:读写时没有采用随机读写,而是直接给出页内地址进行读写的。NAND Flash不是只能以页为单位进行读写吗?这样难道不需要随机读写吗?驱动层中只有对空闲区的ECC校验值的读写是采用随机读写的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-5-22 02:31:54 | 显示全部楼层
fskofcpu 发表于 2019-5-21 12:58
原子哥,我想请教一下NAND FLash随机读写问题,正点原子设计的FafFS+FTL对NAND Flash读写时是以扇区512字 ...

没毛病的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-4-6
在线时间
13 小时
发表于 2020-8-30 23:05:03 | 显示全部楼层
借鉴一下内容
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 16:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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