本站无需注册,无需积分,无需回复可下载所有资料,如果真的喜欢小站,请您注册之后请至少回复一个帖子激活Id,谢谢支持! 站长QQ: 516333132 (挖坑网/填坑网) admin@debugdump.com
拥有小巧灵活的文件系统对许多物联网设备至关重要。使用文件系统并将其与正确的存储技术(如外部闪存或SD卡)配对可能很困难。Mbed操作系统使文件系统的组合变得简单。Mbed OS 5.7既支持FAT文件系统,又引入了高度集成的嵌入式文件系统。这包括对没有自己的磨损平衡控制器的闪存芯片的磨损平衡支持。
LittleFS - 一个高度完整的嵌入式文件系统
将数据存储在嵌入式设备上非常有用:无论是配置文件,传感器信息批量还是新的固件更新。您可以抓取一些非易失性存储器(如EEPROM或SD卡),并将这些数据写入随机闪存页面,但容易出错。没有关于闪存数据的概述,不保证您不覆盖其他数据使用的页面,并且一遍又一遍地写入同一闪存页面对于耐久性是不利的。所以,你需要一个文件系统(自1965年左右),为您管理这一切。
嵌入式系统和物联网设备的文件系统有一些额外的要求:
断电恢复能力 - 要求文件系统保持一致,并将数据刷新到底层存储。
平均磨损 - 通常情况下,存储支持每块数量有限的擦除,因此使用整个存储设备对于可靠性非常重要。
微小的占地面积 - 物联网设备受到ROM和RAM的限制。占地面积小可以节省资金。
市场上有许多商业和开源嵌入式文件系统,但都没有达到我们的设计代码大小,功能或可靠性要求,这对于成功部署物联网设备至关重要。我们正在发布高完整性嵌入式文件系统,这是一个为嵌入式系统设计的小型故障安全文件系统。它作为Mbed OS 5.7的一部分以早期版本形式提供,并作为非Mbed系统的独立C库提供。它是在从GitHub的允许Apache 2.0许可和可用许可这里。
Mbed OS长久以来都支持由安全数字卡或NOR闪存支持的FAT文件系统。FAT文件系统于2010年首次引入,作为外部库,然后作为Mbed OS 5.5核心操作系统的一部分进行集成。由于FAT文件系统对从DOS 6到Mac OS 10.13等其他操作系统的广泛支持和兼容性,FAT文件系统仍然是一个重要的功能。在许多物联网使用案例中,需要具有电源丢失弹性,数据完整性和更长的存储器使用寿命。对于很多物联网设备,与传统的FAT文件系统相比,高完整性嵌入式文件系统是一个更好的选择。
RAM / ROM大小
fatfs与littlefs RAM + ROM大小
Littlebed是Mbed OS中高度集成的嵌入式文件系统,可以在有限的RAM和ROM下工作。它避免了递归,将动态内存限制为可配置的缓冲区,并且不需要将整个存储块存储在RAM中。通过专注于一小组多用途数据结构,这个高度集成的嵌入式文件系统使用比FAT少的13K ROM和少于4K的RAM。
失电恢复能力
fatfs引导计数应用程序 littlefs引导计数应用程序
我们为可能有随机电源故障的系统设计了这个文件系统。它具有强大的copy-on-write保证,并且磁盘上的存储总是保持有效状态。在上面的gif中,您可以看到FAT文件系统损坏的速度以及该文件系统的弹性。有关更多详细信息,请参阅我们用于测试的程序。
磨损均衡
fatfs vs littlefs平均分
大多数嵌入式设备使用的存储芯片支持每个扇区有限的一组擦除。如果您没有支持磨损平衡的存储控制器,则嵌入式设备的使用寿命可能会受到影响。嵌入式文件系统提供动态损耗均衡,以在整个闪存的整个区域内跨扇区传播数据。这可以防止应用程序频繁地写入相同的扇区。失败模式是文件系统使用和文件系统中存储的数据量的组合。平均算法并不完美,但具有扩展闪存存储容量的优点,增加了设备的使用寿命。
gif显示了高完整性嵌入式文件系统与FAT文件系统在静态数据3K和动态数据3K之间的比较。要查看不同配置的磨损级别行为,请参阅此交互式仿真。
如何开始使用高完整性嵌入式文件系统?
任何实现BlockDevice接口的设备都可以在Mbed OS中托管文件系统。您可以更改基于BlockDevice的存储驱动程序,而无需更改您的应用程序或库代码。
开始:
1. 选择一个BlockDevice为您的闪存实现API 的驱动程序: DataFlash,SD卡,SFDP SPI Flash或实现您自己的。
2. 初始化并挂载文件系统:
BlockDevice bd = / *获取块设备* / ;
//第一个参数是挂载点,例如文件将在/ fs /下可用,第二个指向块设备的指针
LittleFileSystem fs(“fs”,&bd);
使用POSIX文件系统调用来读取和写入文件(例如fread,fopen等等)。
你可以在这里找到一个示例程序。如果您的开发板上没有任何存储空间,您可以使用HeapBlockDevice来测试这个高度集成的嵌入式文件系统,HeapBlockDevice将数据存储在内存中(但不会持久存储)。
测试
由于文件系统是设备固件的重要组成部分,因此这个高度集成的嵌入式文件系统带有一套完整的单元和集成测试,Mbed OS测试服务器场每天运行该测试。要运行这些测试,您需要mbed CLI:
功能测试 - mbed test -n 'features-filesystem-littlefs-tests-filesystem-*'。
重新测试 - mbed test -n 'features-filesystem-littlefs-tests-filesystem_retarget-*'。
磨平测试 - mbed test -n 'features-filesystem-littlefs-tests-filesystem_recovery-wear_leveling'。
模拟功率弹性测试mbed test -n 'features-filesystem-littlefs-tests-filesystem_recovery-resilience'。
硬件功率弹性测试mbed test -n 'features-filesystem-littlefs-tests-filesystem_recovery-resilience_functional'。
另外,我们建立了浸泡测试来验证文件系统在真实的硬件上正确处理闪存耗尽失败。
-
Jan Jongboom是Arm的物联网开发人员,他看到太多损坏的SD卡。Chris Haster是Arm的一名软件工程师。
参考链接:LittleFS - 一个高度完整的嵌入式文件系统
arm官方项目地址:armmbed/mbed-littlefs
原作者项目地址:geky/littlefs
在线
看起来不错,去下载学习学习!
离线
看了一下还是不会, 求带
离线
我试了一下 geky/littlefs-fuse,还挺顺利。
1. 克隆项目: git clone https://github.com/geky/littlefs-fuse.git
2. 安装用户空间文件系统库: sudo apt-get install libfuse-dev
3. libfuse版本不能低于2.6,使用命令查看版本,我的是2.9: fusermount -V
4. 执行make, 生成lfs 的可执行文件。
5. 执行命令:
sudo chmod a+rw /dev/loop0 # make loop device user accessible
dd if=/dev/zero of=image bs=512 count=2048 # create a 1MB image
losetup /dev/loop0 image # attach the loop device
5. 格式化文件系统:
./lfs --format /dev/loop0
6. 挂载文件系统:
mkdir mount
./lfs /dev/loop0 mount
7. 然后现在进入mount目录就像操作硬盘上的文件系统操作lfs文件系统了.
8. 如果想看到调试信息:
./lfs -d /dev/loop0 mount
运行输出:
littlefs@ubuntu:/tmp/littlefs-fuse$ ./lfs -d /dev/loop0 mount
FUSE library version: 2.9.2
nullpath_ok: 0
nopath: 0
utime_omit_ok: 0
unique: 1, opcode: INIT (26), nodeid: 0, insize: 56, pid: 0
INIT: 7.23
flags=0x0003f7fb
max_readahead=0x00020000
INIT: 7.19
flags=0x00000039
max_readahead=0x00020000
max_write=0x00020000
max_background=0
congestion_threshold=0
unique: 1, success, outsize: 40
unique: 2, opcode: LOOKUP (1), nodeid: 1, insize: 47, pid: 2588
LOOKUP /.Trash
getattr /.Trash
unique: 2, error: -2 (No such file or directory), outsize: 16
unique: 3, opcode: LOOKUP (1), nodeid: 1, insize: 52, pid: 2588
LOOKUP /.Trash-1000
getattr /.Trash-1000
unique: 3, error: -2 (No such file or directory), outsize: 16
在线
不错, 坐等大神移植到STM32或者ARM9上.
离线
电脑上用一块缓冲区创建模拟flash,使用littlefs创建文件夹, 读写文件成功!
在线
有详细说明吗
离线
是针对nor还是nand?
离线
是针对nor还是nand?
代码没有oob,应该真对nor.
在线
如何实现标准posix接口?
离线
http://www.gnu.org/software/libc/manual/html_node/I_002fO-on-Streams.html
是指实现这些 fopen, fclose, fwrite, fread 这些接口吧?
离线
已经整合进去了, 但是没看明白如何整合的, 反正就是使用了 libc 一样的接口读写文件.
在线
http://www.gnu.org/software/libc/manual/html_node/I_002fO-on-Streams.html
是指实现这些 fopen, fclose, fwrite, fread 这些接口吧?
是的,mbed似乎是实现了标准接口,但是我没找到实现。littlefs自己的接口只是posix like但不是直接可用
离线
已经整合进去了, 但是没看明白如何整合的, 反正就是使用了 libc 一样的接口读写文件.
是,看了半天都没发现怎么实现的
离线
写flash的速度有测试过么,我这边写的好慢但是找不出来原因
离线
写flash的速度有测试过么,我这边写的好慢但是找不出来原因
你用什么SOC, 我用 f1c100s裸奔上 littlefs 没什么问题, 所有没有测速度。
看看你的spi速率.
离线
伽美什 说:写flash的速度有测试过么,我这边写的好慢但是找不出来原因
你用什么SOC, 我用 f1c100s裸奔上 littlefs 没什么问题, 所有没有测速度。
看看你的spi速率.
华为的liteos,用littlefs写4M要30400ms,驱动用了23776,同样写4Mjffs就只要826ms,调用方式都是一样的O_o
离线
lilo 说:伽美什 说:写flash的速度有测试过么,我这边写的好慢但是找不出来原因
你用什么SOC, 我用 f1c100s裸奔上 littlefs 没什么问题, 所有没有测速度。
看看你的spi速率.
华为的liteos,用littlefs写4M要30400ms,驱动用了23776,同样写4Mjffs就只要826ms,调用方式都是一样的O_o
这个差距有点夸张了。。。
离线
lilo 说:伽美什 说:写flash的速度有测试过么,我这边写的好慢但是找不出来原因
你用什么SOC, 我用 f1c100s裸奔上 littlefs 没什么问题, 所有没有测速度。
看看你的spi速率.
华为的liteos,用littlefs写4M要30400ms,驱动用了23776,同样写4Mjffs就只要826ms,调用方式都是一样的O_o
请问您是如何测试读写速度的,我这里测的更慢,打开debug发现有很多擦写,在mbed os上的
离线
为什么我要拷进去1M以上文件就死机,stm32,还有就是不太适合sd,每次写只写512字节,速度太慢太慢
离线
围观
离线
为什么我要拷进去1M以上文件就死机,stm32,还有就是不太适合sd,每次写只写512字节,速度太慢太慢
是如何写的?每次写512字节有记过时间吗?会耗时多久,我这些1024字节要150ms左右
离线
sd卡写有个写入时间(很长,ms级),你传多个块(好像个数也有个限制)(一个块512)和一个块,后面等待的写入时间其实差不多(其实数据传输时间并不多)。所以每次写越多块,速度越快。以前拿示波器看过。 搞了一周,放弃了。写几k长的文件还可以,大文件老是死机。不好查。说明也太少,实在搞不懂那个 ahead_buffer是做什么的。
最近编辑记录 gotofly21 (2018-12-11 10:01:47)
离线
sd卡写有个写入时间(很长,ms级),你传多个块(好像个数也有个限制)(一个块512)和一个块,后面等待的写入时间其实差不多(其实数据传输时间并不多)。所以每次写越多块,速度越快。以前拿示波器看过。 搞了一周,放弃了。写几k长的文件还可以,大文件老是死机。不好查。说明也太少,实在搞不懂那个 ahead_buffer是做什么的。
那个head_buffer用处不太大,只是用来寻找下一个block 的作用,个人理解。 我这写1k字节数据要100-200ms,blocksize是4096,因为写的是spiflash,所以这值最小是4096.读和写的大小是256字节。
离线
sd卡写有个写入时间(很长,ms级),你传多个块(好像个数也有个限制)(一个块512)和一个块,后面等待的写入时间其实差不多(其实数据传输时间并不多)。所以每次写越多块,速度越快。以前拿示波器看过。 搞了一周,放弃了。写几k长的文件还可以,大文件老是死机。不好查。说明也太少,实在搞不懂那个 ahead_buffer是做什么的。
大文件死机可以查看下是不是溢出了,可以分次进行写操作。
离线
gotofly21 说:sd卡写有个写入时间(很长,ms级),你传多个块(好像个数也有个限制)(一个块512)和一个块,后面等待的写入时间其实差不多(其实数据传输时间并不多)。所以每次写越多块,速度越快。以前拿示波器看过。 搞了一周,放弃了。写几k长的文件还可以,大文件老是死机。不好查。说明也太少,实在搞不懂那个 ahead_buffer是做什么的。
大文件死机可以查看下是不是溢出了,可以分次进行写操作。
都不算大,才几十K,几百K。主要死在链表上 static int lfs_dir_commit(lfs_t *lfs, lfs_dir_t *dir,
const struct lfs_region *regions, int count)
for (lfs_dir_t *d = lfs->dirs; d; d = d->next), d->next变野指针了。搞不清楚
离线
mark
离线
厉害了
离线