13397158231   jevian_ma@worldflying.cn

rtthread利用片上flash挂载littlefs文件系统并操作

2022-02-06 06:30:51

littlefs是用于嵌入式的文件系统。特点是对资源消耗小,可用于小容量的flash,小沃最新产品利用片上flash挖出了一部分空间实现片上flash的littlefs挂在并编辑。

现在就讲讲如何实现的。

1、启动片上flash的使用

方法为通过menuconfig启动on-chip FLASH。

Hardware Drivers Config -> On-chip Peripheral Drivers -> Enable on-chip FLASH

4.PNG

2、下载线上的fal库与littlefs库

方法为通过menuconfig下载并启动fal库。

RT-Thread online packages -> system packages -> fal -> version -> v0.5.0

RT-Thread online packages -> system packages -> Littlefs -> Version -> v2.3.0

1.PNG

3、关闭fal库不必要的log

方法为通过menuconfig关闭fal库的log。

RT-Thread online packages -> system packages -> fal -> Enable debug log output

2.PNG

4、修改littlefs库的enable wear leveling,默认为-1

方法为通过menuconfig修改littlefs库的enable wear leveling值,该值必须修改,因为flash有复写数量限制。

RT-Thread online packages -> system packages -> Littlefs -> lfs enable wear leveling

3.PNG

5、启动nor flash的mtd驱动

方法为通过menuconfig添加Nor flash的mtd驱动

RT-Thread Components -> Device Drivers -> Using MTD Nor Flash device drivers

5.PNG

6、启动文件系统管理

方法为通过menuconfig启动,同时启动romfs,用于根文件系统。根文件系统中创建一个storage的文件夹,方便用于mount littlefs。

RT-Thread Components -> Device Device virtual file system -> Enable ReadOnly file system on flash

6.PNG

7、修改分区大小

完成修改后,保存配置,运行pkgs --update,这样在bsp目录的board/ports下会创建一个fal_cfg.h文件,分区表大小在这里。

修改如下:

#define FAL_PART_TABLE                            \
{                                       \
    {FAL_PART_MAGIC_WROD, "app",     "onchip_flash",        0, 502*1024, 0}, \
    {FAL_PART_MAGIC_WROD, "storage", "onchip_flash", 502*1024,  10*1024, 0}, \
}

前面的app为代码区域大小,502kbyte,后面的为存储区大小,10kbyte。这样编译出的bin文件小于412kbyte都不会有异常。

8、最后main文件需要先mount romfs,然后再mount littlefs

代码如下:

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#include <fal.h>
#include <dfs_fs.h>
#include <dfs_romfs.h>

int main(void) {

    if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) != 0) {
        rt_kprintf("ROM file system initializate failed!\n");
        return RT_ERROR;
    }

    fal_init();
    struct rt_device *flash_dev = fal_mtd_nor_device_create("storage");
    if (flash_dev == NULL) {
        rt_kprintf("Partition find failed!\n");
        return RT_ERROR;
    }
    // mount littlefs, param: dev name, folder path, file system type, rw sign, file system private data
    if (dfs_mount("storage", "/storage", "lfs", 0, 0) != RT_EOK) {
        dfs_mkfs("lfs", "storage"); // format partition to littlefs
        if (dfs_mount("storage", "/storage", "lfs", 0, 0) != RT_EOK) {
            rt_kprintf("Failed to initialize filesystem!\n");
            return RT_ERROR;
        }
    }

    while (1) {
        rt_thread_mdelay(1000);
    }

    return RT_EOK;

}

注意,这里几个storage要统一,第6步分区叫storage,那么fal_mtd_nor_device_create、dfs_mount、dfs_mkfs的参数都必须是storage。

dfs_mount的第二个参数必须是romfs中存在的文件夹。


文章作者:沃航科技

优秀产品推荐:可编程网络IO控制器

上一篇:程序获取最大并发连接的方法

下一篇:Linux下的图形化串口调试助手

联系我们

  • 地址:武汉市东湖高新开发区光谷总部国际1栋2412室
  • QQ:932773931
  • 电话:027-59761089-806
  • 手机:13397158231
  • 邮箱:jevian_ma@worldflying.cn

关注公众号

扫码添加微信

沃航(武汉)科技有限公司版权所有

备案号:鄂ICP备16014230号-1

本网站由提供CDN加速/云存储服务