zhumx 发表于 2023-9-18 09:42:57

EFS文件系统有bug?

测试发现EFS文件系统fcheck会返回错误,错误码为1;进一步确定了复现该问题的场景,系统上电初始化文件系统后,运行如下测试函数,必然会fcheck返回错误,多块板子现象一样:
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,配置扇区如下:
#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 */

zhumx 发表于 2023-9-18 09:50:31

如果把拷贝函数传入的文件名“prg_backup0.bin”改为“prg.bin”,也不会导致最后的fcheck返回错误,太诡异了。。。

zhumx 发表于 2023-9-18 11:13:01

大家也可以自己测一下,是不是一样的现象?

eric2013 发表于 2023-9-18 12:54:16

楼主测试的文件系统版本是多少

zhumx 发表于 2023-9-18 13:25:56

eric2013 发表于 2023-9-18 12:54
楼主测试的文件系统版本是多少

6.14.4

eric2013 发表于 2023-9-18 21:14:55

新版的我移植过,有时间我试试。

基于STM32H7的RL-FlashFS V6.X驱动SPI Flash案例发布(2021-04-14)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=106037&fromuid=58
(出处: 硬汉嵌入式论坛)
页: [1]
查看完整版本: EFS文件系统有bug?