参考:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/qemu-network/filesystems/filesystems?id=%e4%bd%bf%e7%94%a8-romfs
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/qemu-network/filesystems/filesystems?id=%e4%bd%bf%e7%94%a8-ramfs
前言:
适用于需要简单测试文件操作,且具备足够的ram/rom空间的场景(不依赖特定硬件,能跑rtthread就行)
因为板子上未带spi flash/SD卡,片内flash驱动还未完善 ,懒得移植fal就随便折腾下
1.创建并挂载ramfs:
使用rtthread studio,配置勾选dfs和ramfs
将如下代码加入工程,即可自动挂载ramfs,使用动态内存或静态分配内存均可,挂载到根目录即可操作
- 使用静态数组可以指定ram的地址,并略微减小内存管理开销;缺陷是该部分内存空间将一直占用无法释放
int fs_test(void)
{
// if (dfs_mount(RT_NULL, "/ram", "ram", 0, dfs_ramfs_create(rt_malloc(8192),8192)) == 0) // 动态申请内存作为ramfs的存储空间
static char ramfs_buf[8192];
if (dfs_mount(RT_NULL, "/", "ram", 0, dfs_ramfs_create(ramfs_buf,sizeof(ramfs_buf))) == 0) // 使用静态分配的内存空间
{
rt_kprintf("RAM file system initializated!\n");
}
else
{
rt_kprintf("RAM file system initializate failed!\n");
}
return 0;
}
INIT_APP_EXPORT(fs_test);
- ramfs无法操作创建文件夹,猜想rtt的ramfs设计比较简单,未实现文件夹操作
2. 创建并挂载romfs:
使用rtthread studio,配置勾选dfs和ramfs
修改加入工程的fs_test函数,即可自动挂载romfs
#include <dfs_romfs.h>
int fs_test(void)
{
if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) == 0)
{
rt_kprintf("ROM file system initializated!\n");
}
else
{
rt_kprintf("ROM file system initializate failed!\n");
}
}
INIT_APP_EXPORT(fs_test);
编译到romfs的文件和文件夹在romfs.c,结构很直观,与文件系统相同的树形结构
下载运行
也可以参考官方说明,使用rt-thread/tools/mkromfs.py脚本来打包生成romfs,这里不再赘述
- romfs是只读文件系统,所以创建文件/创建文件夹等操作不可用,适合存放无需被修改的文件,或创建文件夹作为其他文件系统的挂载点
3.同时挂载romfs和ramfs
在romfs.c新建文件夹/ramfs作为ramfs的挂载点:
(也可以在romfs.c中新建/romfs /ramfs等文件夹,分别作为相应文件系统的挂载点)
修改加入工程的fs_test函数
#include <dfs_romfs.h>
int fs_test(void)
{
if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) == 0)
{
rt_kprintf("ROM file system initializated!\n");
}
else
{
rt_kprintf("ROM file system initializate failed!\n");
}
static char ramfs_buf[8192];
if (dfs_mount(RT_NULL, "/ramfs", "ram", 0, dfs_ramfs_create(ramfs_buf,8192)) == 0) // 挂载ramfs到/ramfs
{
rt_kprintf("RAM file system initializated!\n");
}
else
{
rt_kprintf("RAM file system initializate failed!\n");
}
}
INIT_APP_EXPORT(fs_test);
完结撒花✿✿ヽ(°▽°)ノ✿
1.1 彩蛋
挂载ramfs,并使用ymodem传输文件
需要挂载ramfs到根目录,并配置ymodem和文件传输特性
- 用ramfs是因为ramfs可读写;而挂载在根目录是因为ry命令接收的文件默认写入根目录,且未提供指定文件路径的方式(除非修改ymodem源码)
终端需要使用secureCRT/xshell,(注意mobaxterm不支持ymodem)
以前者为例,输入ry命令并执行,选择传输/发送ymodem,选中要传输的文件即可
看完了,点个赞再走吧 : )