【GD32E503评测】+ Littlefs移植
[复制链接]
littlefs 是 ARM 官方推出的,专为嵌入式系统设计的文件系统,相比传统的文件系统,littlefs 具有以下优点:
- 自带擦写均衡
- 支持掉电保护
- 占用的 RAM/ROM 少
littlefs 自带的擦写均衡和掉电保护使开发者可以放心的将文件系统挂载到 nor flash 上。
这是github上的开源项目地址,有兴趣的可以关注下载。
littlefs的移植也非常简单,项目上添加lfs_util.c和lfs.c文件,然后配置参数如下:
#define BUFFER_SIZE 256
#define BLOCK_SIZE 4096
#define BOLCK_NUM 512 // 2M--512 8M--2048 16M--4096
#define LOOKAHEAD_SIZE (lfs_size_t)(BOLCK_NUM / 8)
lfs_t lfs;
lfs_file_t lfs_file;
static int lfs_flash_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size);
static int
lfs_flash_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size);
static int lfs_flash_erase(const struct lfs_config *c, lfs_block_t block);
static int lfs_flash_sync(const struct lfs_config *c);
const struct lfs_config cfg = {
// block device operations
.read = lfs_flash_read,
.prog = lfs_flash_prog,
.erase = lfs_flash_erase,
.sync = lfs_flash_sync,
// block device configuration
.read_size = BUFFER_SIZE,
.prog_size = BUFFER_SIZE,
.block_size = BLOCK_SIZE,
.block_count = BOLCK_NUM,
.cache_size = BUFFER_SIZE,
.lookahead_size = LOOKAHEAD_SIZE,
.block_cycles = 500,
};
然后对接口函数进行补充
static int lfs_flash_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size)
{
uint32_t addr;
addr = ((uint32_t)block << (uint32_t)12);
addr += off;
#ifdef enable_flash_debug
char message[64];
if(Flash_Debug_Flag)
{
memset(message, 0x00, sizeof(message));
sprintf(message, "Flash Read Block is %d, Offset is %d, Size is %d\n\r", block, off, size);
debug_log(message, strlen(message));
}
#endif
spi_flash_buffer_read((uint8_t *)buffer, addr, size);
return LFS_ERR_OK;
}
static int
lfs_flash_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size)
{
uint32_t addr;
addr = ((uint32_t)block << (uint32_t)12);
addr += off;
// SPI_Flash_Write(addr, size, (uint8_t *)buffer);
#ifdef enable_flash_debug
char message[64];
if(Flash_Debug_Flag)
{
memset(message, 0x00, sizeof(message));
sprintf(message, "Flash Prog Block is %d, Offset is %d, Size if %d\n\r", block, off, size);
debug_log(message, strlen(message));
}
#endif
spi_flash_buffer_write((uint8_t *)buffer, addr, size);
return LFS_ERR_OK;
}
static int lfs_flash_erase(const struct lfs_config *c, lfs_block_t block)
{
#ifdef enable_flash_debug
char message[64];
if(Flash_Debug_Flag)
{
memset(message, 0x00, sizeof(message));
sprintf(message, "Erase Block is %d\n\r", block);
debug_log(message, strlen(message));
}
#endif
spi_flash_sector_erase(block << 12);
return LFS_ERR_OK;
}
static int lfs_flash_sync(const struct lfs_config *c)
{
return LFS_ERR_OK;
}
开发板中的spi flash的型号是gd25q16,空间大小是2M 字节,相应的驱动,开发板上附带的例程已经有了。
运行littlefs的测试程序,用串口debug输出结果
littlefs已经在我的多个项目中使用并量产了,到目前为止还没发现过大问题,就是写入文件有时候耗费的时间比较多,特别是文件数量比较多的时候,感觉更明显。
附上完整的项目文件供大家参考,有什么问题也大家也可以互相讨论一下:
GD32E503V-EVAL.7z
(577.28 KB, 下载次数: 125)
|