硬汉嵌入式论坛

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

[RL-FlashFS] EFS文件系统有bug?

[复制链接]

21

主题

61

回帖

124

积分

初级会员

积分
124
发表于 2023-9-18 09:42:57 | 显示全部楼层 |阅读模式
测试发现EFS文件系统fcheck会返回错误,错误码为1;进一步确定了复现该问题的场景,系统上电初始化文件系统后,运行如下测试函数,必然会fcheck返回错误,多块板子现象一样:
[C] 纯文本查看 复制代码
static int dl_kernel_copyfile(const char *src, const char *dst)
{
    FILE *fd_src = NULL;
    FILE *fd_dst = NULL;
    uint32_t rdlen;
    int ret;

    fd_src = fopen(src, "r");
    if(fd_src==NULL)
        return 0;
    
    fd_dst = fopen(dst, "w");

    if (fd_dst == NULL || fd_src == NULL)
    {
        if (fd_dst)
            fclose(fd_dst);
        if (fd_src)
            fclose(fd_src);
        return 0;
    }
    
    do
    {
        memset(AppBuffer, 0, sizeof(AppBuffer));
        rdlen = fread(AppBuffer, 1, sizeof(AppBuffer), fd_src);
        if (rdlen > 0)
        {
            ret = fwrite(AppBuffer, 1, rdlen, fd_dst);
            KERNEL_DEBUG("copyfile write return:%d.\r\n",ret);
        }

    } while (rdlen >0);


    if (fd_dst)
    {
        if (ferror(fd_dst))
            clearerr(fd_dst);
        ret = fclose(fd_dst);//reli_fclose(fd_dst);
        KERNEL_DEBUG("close  %s return:%d.\r\n",dst,ret);
    }
    
    if (fd_src)
    {
        if (ferror(fd_src))
            clearerr(fd_src);
        ret = fclose(fd_src);//reli_fclose(fd_src);
        KERNEL_DEBUG("close %s return:%d.\r\n",src,ret);
    }
    return 1;
}

void fs_bug_test()
{
    FILE* fd = NULL;
    uint8_t *p1=NULL;
    uint8_t *p2=NULL;
    
    
    fsStatus fsSS=fformat("F0:","");
    KERNEL_DEBUG("fformat status:%d",fsSS); 
    
    p1 = malloc(1024);
    p2 = malloc(914);
    
    fd = fopen("temp_prg.bin","a");
    if(fd)
    {
        fwrite(p1,1,1024,fd);
        fclose(fd);
        fd=NULL;
        KERNEL_DEBUG("create temp_prg.bin\r\n"); 
    }
    fd = fopen("temp_prg.bin","a");
    if(fd)
    {
         fwrite(p2,1,914,fd);
         fclose(fd);
         fd=NULL;
    }
    fd= fopen("prg_attr.bin","w");
    if(fd)
    {
         fwrite(p2,1,40,fd);
         fclose(fd); 
        fd = NULL;
    }

    frename("temp_prg.bin","self_prg.bin");
    
    dl_kernel_copyfile("self_prg.bin","prg_backup0.bin");
    
    fd = fopen("test.bin","w");
    fsStatus fsChk=fsOK;
    if(fd)
    {
        fwrite(p1,1,1024,fd);
        fsChk=fcheck("F0");
        KERNEL_DEBUG("line %d:fscheck:%d.\r\n",__LINE__,fsChk);
        fclose(fd);  
        fd = NULL;        
    }  
    
    free(p1);
    free(p2);
}

经测试,如果把temp_prg.bin文件尺寸改大4字节后,最后的fcheck不会返回错误,改小也不会导致fcheck返回错误。如果在文件系统中已经存在文件的情况下运行测试函数也不会返回错误。感觉很奇怪,不确定是我文件操作不对还是RLFlashFs EFS文件系统有bug。
使用的硬件SPIFlsah型号是Winboard W25Q32,配置扇区如下:
[C] 纯文本查看 复制代码
#define W25QFLASH_SECTOR_COUNT      1024           /* Number of sectors */
#define W25QFLASH_SECTOR_SIZE       4096           /* FLASH_SECTORS information used */
#define W25QFLASH_PAGE_SIZE         256           /* Programming page size in bytes */
#define W25QFLASH_PROGRAM_UNIT      1           /* Smallest programmable unit in bytes */
#define W25QFLASH_ERASED_VALUE      0xFF        /* Contents of erased memory */


回复

使用道具 举报

21

主题

61

回帖

124

积分

初级会员

积分
124
 楼主| 发表于 2023-9-18 09:50:31 | 显示全部楼层
如果把拷贝函数传入的文件名“prg_backup0.bin”改为“prg.bin”,也不会导致最后的fcheck返回错误,太诡异了。。。
回复

使用道具 举报

21

主题

61

回帖

124

积分

初级会员

积分
124
 楼主| 发表于 2023-9-18 11:13:01 | 显示全部楼层
大家也可以自己测一下,是不是一样的现象?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2023-9-18 12:54:16 | 显示全部楼层
楼主测试的文件系统版本是多少
回复

使用道具 举报

21

主题

61

回帖

124

积分

初级会员

积分
124
 楼主| 发表于 2023-9-18 13:25:56 | 显示全部楼层
eric2013 发表于 2023-9-18 12:54
楼主测试的文件系统版本是多少

6.14.4
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2023-9-18 21:14:55 | 显示全部楼层
新版的我移植过,有时间我试试。

基于STM32H7的RL-FlashFS V6.X驱动SPI Flash案例发布(2021-04-14)
https://www.armbbs.cn/forum.php? ... 6037&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 18:59 , Processed in 0.280932 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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