硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1169|回复: 6
收起左侧

[FileX] LevelX测试工程:FileX+LevelX+USBX使用内置RAM模拟U盘

[复制链接]

9

主题

66

回帖

108

积分

初级会员

积分
108
发表于 2025-1-7 00:53:38 | 显示全部楼层 |阅读模式
本帖最后由 egoistaw 于 2025-1-7 01:00 编辑

levelx维护了均衡磨损的算法。
下面只讨论NOR Flash。
封装后提供的读写api仅支持以一整个512字节单位扇区读写。
  • lx_nor_flash_close:关闭 NOR 闪存实例
  • lx_nor_flash_defragment:对 NOR 闪存实例进行碎片整理
  • lx_nor_flash_extended_cache_enable:启用/禁用扩展 NOR 缓存
  • lx_nor_flash_initialize:初始化 NOR 闪存支持
  • lx_nor_flash_open:打开 NOR 闪存实例
  • lx_nor_flash_partial_defragment:NOR 闪存实例的部分碎片整理
  • lx_nor_flash_sector_read:读取 NOR 闪存扇区
  • lx_nor_flash_sector_release:释放 NOR 闪存扇区
  • lx_nor_flash_sector_write:写入 NOR 闪存扇区


注意:
0. API里没有叫扇区擦除,而是叫扇区释放。
1. 每次调用lx_nor_flash_sector_write,都会将当前sector拷贝到新sector中。
2. 因为重定向了sector,所以读写时要查找扇区,耗时会增加,且扇区数越多越久。
3. 会造成部分空间浪费。
   例如 W25q32的sector为4096,即物理扇区。levelx将其切分成8个512字节的逻辑扇区。
   其中第1个逻辑扇区用于记录擦写信息,剩余的7个逻辑扇区才是用于存储数据的。空间利用率7/8 = 87.5%。
   当然可以把2个或者4个物理扇区合并成一个物理扇区,利用率会升至15/16(93.75%)、31/32(96.875%)。
   位图是32bit,所以一个物理扇区最多切出32个逻辑扇区。
4. 源码里
LX_NOR_SECTOR_SIZE 为逻辑扇区字数,即(512/sizeof(ULONG));
nor_flash->lx_nor_flash_total_blocks为物理扇区总数;
nor_flash -> lx_nor_flash_total_physical_sectors为实际可用于存储的逻辑扇区数(在lx_nor_flash_open里计算出来并被赋值);

驱动移植时需要提供以下驱动接口
  • lx_nor_flash_driver_read: 任意地址读
  • lx_nor_flash_driver_write: 任意地址写
  • lx_nor_flash_driver_block_erase: 擦除物理扇区
  • lx_nor_flash_driver_block_erased_verify: 检查物理扇区是否已被擦除
  • lx_nor_flash_driver_system_error: 错误处理


附带的测试工程完全由CubeMX生成,使用内置RAM模拟NOR Flash,物理扇区4KB,总大小512KB,物理扇区总数512/4=128。
使用levelx初始化后,逻辑扇区512B,可用逻辑扇区总数:512KB / 512B * 7 / 8 = 896,可用大小512*896 = 448KB
debug.png


再使用filex格式化后,连接电脑,查看总容量444KB,可用432KB。

win.png
少了4KB不知道去哪里了。
个人理解,如有错误欢迎指出。







H743_USBX_Dev_MSC_Demo.rar

5.56 MB, 阅读权限: 100, 下载次数: 31

评分

参与人数 3金币 +140 收起 理由
KK-1 + 20
callan + 20 赞一个!
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116197
QQ
发表于 2025-1-7 07:44:53 | 显示全部楼层
谢谢楼主分享,很详细。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2025-1-7 13:48:00 | 显示全部楼层
这个你测试没有?能不能格式化?那432K能不能用完呢?
回复

使用道具 举报

9

主题

66

回帖

108

积分

初级会员

积分
108
 楼主| 发表于 2025-1-7 15:50:04 | 显示全部楼层
callan 发表于 2025-1-7 13:48
这个你测试没有?能不能格式化?那432K能不能用完呢?

可以填满,然后清空。格式化没尝试。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2025-1-7 20:48:41 | 显示全部楼层
egoistaw 发表于 2025-1-7 15:50
可以填满,然后清空。格式化没尝试。

1.按照你的demo做了修改,依然无法格式化
2.存344K的jpg,等了2分钟左右提示目标文件对于文件系统过大,

3.删除u盘中的文件后再复制,直接异常了

还是无法格式化

还是无法格式化
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2025-1-7 21:06:08 | 显示全部楼层
现在读写可以了,但是格式化死活不行
回复

使用道具 举报

9

主题

66

回帖

108

积分

初级会员

积分
108
 楼主| 发表于 2025-1-8 19:54:31 | 显示全部楼层
callan 发表于 2025-1-7 21:06
现在读写可以了,但是格式化死活不行

使用media api无法格式化的原因论坛讨论了很多。
https://www.armbbs.cn/forum.php?mod=viewthread&tid=103401
电脑格式化时从逻辑扇区0开始,但是fx_media api不允许改动逻辑扇区0,
filex自己格式化时也是从逻辑扇区1开始的。
如果有格式化需求,自己实现usb接口时最好调用更底层的API例如levelx层,但是也会出现与filex竞争的风险。
或者改动源码,注释掉那两句 if ((logical_sector == 0) || (logical_sector == ((ULONG)0xFFFFFFFF)))也是可以的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-9 19:53 , Processed in 0.496717 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表