嵌入式技术论坛
直播中

贾小龙

7年用户 1587经验值
私信 关注
[经验]

在W25Q128上使用FatFS文件系统生成多个目录

硬件:STM32F429IGT6核心板

操作系统:RTT V4.1.0

使用原因:

之前在W25Q128上使用littlefs文件系统,并且使用FLASHDB文件模式保存参数。写入参数时间过长,测试平均一个参数需要6s时间。想过片内flash搭载littlefs文件系统去使用,这样时间会缩短。

但是因为片内flash只用4个128kb的扇区,使用littlefs文件系统可以搭接却无法生成多个目录。尝试使用elm fatfs文件系统。

littlefs文件系统结构:

1、littlefs文件系统初始化时,会在SPI Flash最开始的两个块中格式化出两个超级块,用于对文件系统的识别及根目录的索引;

2、在建立文件或目录时,littlefs会从超级块中分配一个页用于记录文件的基本信息,并建立文件数据的索引以找到文件的具体数据内容;

3、当文件大小小于一个块尺寸时,尽管文件系统不对超出的部分引索,但其他文件仍然不能使用这个块的剩余部分,所以一个文件至少占用一个块尺寸;

一通操作:

搭载报错format error, result=1。

单步调试,定位问题出现在ff.c 的f_mkfs函数中

if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR;

这段代码disk_ioctl函数

/* Miscellaneous Functions */

DRESULT disk_ioctl(BYTE drv, BYTE ctrl, void *buff)

{

rt_device_t device = disk[drv];

if (device == RT_NULL)

return RES_ERROR;

if (ctrl == GET_SECTOR_COUNT)

{

struct rt_device_blk_geometry geometry;

rt_memset(&geometry, 0, sizeof(geometry));

rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);

*(DWORD *)buff = geometry.sector_count;

if (geometry.sector_count == 0)

return RES_ERROR;

}

else if (ctrl == GET_SECTOR_SIZE)

{

struct rt_device_blk_geometry geometry;

rt_memset(&geometry, 0, sizeof(geometry));

rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);

*(WORD *)buff = (WORD)(geometry.bytes_per_sector);

}

else if (ctrl == GET_BLOCK_SIZE) /* Get erase block size in unit of sectors (DWORD) */

{

struct rt_device_blk_geometry geometry;

rt_memset(&geometry, 0, sizeof(geometry));

rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);

*(DWORD *)buff = geometry.block_size / geometry.bytes_per_sector;

}

else if (ctrl == CTRL_SYNC)

{

rt_device_control(device, RT_DEVICE_CTRL_BLK_SYNC, RT_NULL);

}

else if (ctrl == CTRL_TRIM)

{

rt_device_control(device, RT_DEVICE_CTRL_BLK_ERASE, buff);

}

return RES_OK;

}

,其中rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry);指向到了MDT设备中

static rt_err_t _mtd_control(rt_device_t dev, int cmd, void *args)

{

return RT_EOK;

}

找到原因了。

elm 需要注册成块设备,我是注册成MTD Device.注释掉注册成MTD设备代码,变成注册块设备解决。

int FileSystem_Init(void)

{

/* 初始化 fal */

fal_init();

//必须先创建rom文件系统,以提供后面的挂载目录

if(dfs_mount(RT_NULL,"/","rom",0,&(romfs_root)) == 0)

{

LOG_I("ROM file system initializated!");

/* Create a block device on the file system partition of spi flash*/

struct rt_device *blk_dev = fal_blk_device_create(FS_PARTITION_NAME);

if (!blk_dev)

{

LOG_E("Can't create a mtd device on '%s' partition.", FS_PARTITION_NAME);

}

else

{

/* 挂载 elm */

if (dfs_mount(FS_PARTITION_NAME, "/flash", "elm", 0, 0) == 0)

{

LOG_I("Filesystem /flash initialized!");

}

else

{

/* 格式化文件系统 */

dfs_mkfs("elm", FS_PARTITION_NAME);

/* 挂载 littlefs */

if (dfs_mount(FS_PARTITION_NAME, "/flash", "elm", 0, 0) == 0)

{

LOG_I("Filesystem /flash initialized!");

}

else

{

LOG_E("Failed to initialize filesystem /flash!");

}

}

}

}

else

{

LOG_E("ROM file system initializate failed!");

}

Flash_KVDB_Init();

return RT_EOK;

}

成功解决。

原作者:用户名由3_15位

更多回帖

发帖
×
20
完善资料,
赚取积分