硬件: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位