这才是优美的文件系统挂载方式,亲测有效

本文介绍了如何优雅地在RT-Thread操作系统中使用装载表挂载文件系统,包括ROMFS、RAMFS和LittleFS。通过示例代码展示了如何初始化设备、创建挂载表,并实现上电自动挂载。此外,还提供了执行结果展示,包括挂载点检查和文件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文由RT-Thread论坛用户@mumumu原创发布:https://club.rt-thread.org/ask/article/573ddf0ba553a87c.html

按照手册与其它例子来挂载文件系统感觉不是很优美,研究了一下装载表的方式
在这里插入图片描述

然后在你的代码里(不限定具体文件,只要参与编译即可)加入以下代码:

//必要的头文件
#include <fal.h>
#include <dfs_fs.h>
#include <dfs_romfs.h>
#include <dfs_ramfs.h>
#include <dfs_posix.h>

rt_uint8_t rampool[1024];
#define FAL_PART_NAME "filesystem" //在fal_cfg.h中FAL_PART_TABLE定义
//ROMFS需要创建的目录,创建的目录位于/目录下给其它文件系统挂载
const struct romfs_dirent _root_dirent[] =
{
    {ROMFS_DIRENT_DIR, "ram", 0, 0},
    {ROMFS_DIRENT_DIR, "flash", 0, 0},
};
//自动挂载表
const struct dfs_mount_tbl mount_table[] =
{
    {RT_NULL, "/", "rom", 0, &(romfs_root)},//必须先创建rom文件系统,以提供后面的挂载目录
    {RT_NULL, "/ram", "ram", 0, (const void*)rampool},
    {FAL_PART_NAME, "/flash", "lfs", 0, 0},
    {0}
};
void norflash_init()
{
    fal_init();
    /* Create a block device on the file system partition of spi flash*/
    struct rt_device *flash_dev = fal_mtd_nor_device_create(FAL_PART_NAME);

}
//上电自动初始化norflash创建,保证在norflash挂载前创建设备,其它需要前期初始化的也可放入此函数
INIT_COMPONENT_EXPORT(norflash_init);

以下是执行结果:

 \ | /
- RT -     Thread Operating System
 / | \     4.0.5 build Jun 23 2022 16:33:28
 2006 - 2021 Copyright by rt-thread team
lwIP-2.1.2 initialized!
[4] I/sal.skt: Socket Abstraction Layer initialize success.
[D/FAL] (fal_flash_init:47) Flash device |                norflash0 | addr:
0x80000000 | len: 0x01000000 | blk_size: 0x00001000 |initialized finish.
                                                                     m
[I/FAL] | name       | flash_dev |   offset   |    length  |
                                                                     m
[I/FAL] | app        | norflash0 | 0x00000000 | 0x00400000 |
[I/FAL] | easyflash  | norflash0 | 0x00400000 | 0x00300000 |
[I/FAL] | download   | norflash0 | 0x00700000 | 0x00500000 |
[I/FAL] | filesystem | norflash0 | 0x00c00000 | 0x00400000 |
                                                                     m
                                                                      0m
[I/FAL] The FAL MTD NOR device (filesystem) created successfully
Not find the device(winUSB).Not find the device(i2c1).msh />[2098] I/NO_TAG
: PHY Status: Link up
[2098] I/NO_TAG: PHY Speed: 100Mbps
[2098] I/NO_TAG: PHY Duplex: full duplex


msh />mount
filesystem  device  mountpoint
----------  ------  ----------
devfs       (NULL)  /dev
rom         (NULL)  /
ram         (NULL)  /ram
lfs         filesy  /flash
msh />cd flash
msh /flash>ls
Directory /flash:
hello               <DIR>
msh /flash>mkdir hs
msh /flash>ls
Directory /flash:
hello               <DIR>
hs                  <DIR>

当然了必要的硬件与驱动需要打开,这里不再赘述。
需要加新的文件系统只用修改这个表即可,需要提前初始化的加到norflash_init()里面即可。

### RT-Thread FAL MTD NOR 设备格式化错误分析 在 RT-Thread 的 Flash Abstraction Layer (FAL) 中,MTD NOR 设备的格式化操作可能会因扇区大小与文件系统的兼容性问题而失败。具体到 `result=1` 错误的情况,通常是因为目标存储设备的物理特性(如擦除粒度或块大小)不满足所选文件系统的要求。 #### 问题原因分析 1. **扇区大小超出支持范围** 文件系统(如 FATFS 或 LittleFS)对底层存储介质有特定的约束条件。如果 NOR Flash 的最小擦除单元(即 `blk_size` 字段[^1])大于文件系统能够处理的最大簇大小,则会触发类似的错误提示。例如,在某些情况下,FATFS 要求最大扇区大小不超过 32 KB[^2]。 2. **初始化参数配置不当** 当前定义的 NOR Flash 配置可能未正确反映实际硬件能力。比如 `.len` 和 `.blk_size` 参数设置不合理可能导致后续读写操作异常或者无法通过验证阶段。 3. **驱动层实现缺陷** 如果 `{init, read, write, erase}` 接口未能严格遵循预期行为模式——特别是对于多分区共享同一颗芯片的情形下如何精确控制偏移量以及有效长度计算失误的话,也可能间接引发此类现象发生。 #### 解决方案建议 ##### 方法一:调整闪存属性设定值 重新审视并修正涉及该型号NOR FLASH的相关结构体成员赋值语句: ```c struct fal_flash_dev nor_flash0 = { .name = "W25Q64", // 确认名称无冲突 .addr = 0x00000000, // 物理基址应依据数据手册确认 .len = 8 * 1024 * 1024,// 总容量保持一致 .blk_size = 4096 // 小于等于期望使用的文件系统上限 }; ``` 注意此处`.blk_size`字段应当尽可能贴近真实情况下的最小可独立清除区域尺寸,同时兼顾上层应用需求限制因素考量[^1]。 ##### 方法二:优化低级函数逻辑设计 针对每一个被声明的操作方法逐一排查是否存在潜在隐患之处,并参照官方文档给出的标准范例完成改造工作。以下是关于`erase()`部分的一个简单示范片段: ```c static int erase(long offset, size_t size){ if((offset % SECTOR_SIZE)!=0 || (size%SECTOR_SIZE)!=0 ){ return -EINVAL; } while(size>0){ HAL_FLASH_Unlock(); uint32_t PageError=HAL_FLASHEx_Erase(&PageEraseStructure,&ErrorCode); if(PageError!=HAL_OK){ return PAGE_ERROR_CODE; } HAL_FLASH_Lock(); Offset +=SECTOR_SIZE ; Size -=SECTOR_SIZE ; } return SUCCESSFUL_OPERATION_STATUS; } ``` 上述伪代码展示了当执行批量删除动作之前先检验输入参数合法性的重要性,随后按照固定步长逐步推进直至整个区间都被妥善清理完毕为止[^2]。 最后提醒一点就是务必仔细阅读对应MCU厂商所提供的参考资料指南来辅助理解这些复杂流程背后的原理机制从而做出更加精准有效的修改决策过程之中去实践探索发现更多可能性空间吧! ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值