Flash文件系统方案
存储芯片分析
DataFlash是大容量串行Flash存储器产品,采用NOR技术制造,写慢读快,可用于存储数据或程序代码,其产品型号为GD25Q127C。
此存储器容量为128M-b,16384K-byte;采用SPI接口进行读写,支持SPI总线模式0和3。输入数据在SCLK上升沿锁存,下降沿改变数据。128Mb容量的页面尺寸为256字节。
Endurance: 100,000 program/erase cycles per page minimum
FLASH磨损均衡原理及实现
什么是磨损均衡(wear leveling)?
闪存芯片磨损。每次擦除和写入闪存的一部分时,都会对其造成轻微损坏。嵌入式Flash文件系统注意到了这种危险,有时会尝试分散损坏而不是将损坏集中在一个区域中,从而延长了内存的寿命和设备的寿命。
文件系统对比
文件系统(官方链接) | 简介 | 企业商用 | 掉电安全 | Flash均衡磨损 | 代码大小 | 动态内存 | 更新日期 | 备注 |
---|---|---|---|---|---|---|---|---|
FatFs R0.14a | FATFS是一个完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计。支持FAT12、FAT16 和FAT32。 | 是 | 否 | 否 | 6.4k-13.1kbytes | 4*分区+2 | 2021年2月14日 | 不支持flash均衡 |
DIY | 手写代码实现 | 是 | 是 | 是 | ** | ** | ** | 针对特定需求,通用性差。 |
littlefs V2.4 | LittleFS是ARM工程师开发,社区活跃 | 是 | 是(LittleFS在设计时就保证了掉电安全的问题,因此不需要每次掉电后执行修复工作) | 是 | 24kbytes | 3856 B | 2021年1月20日 | 首选 |
spiffs V0.3.7 | 一个用于嵌入式设备上的SPI NOR flash设备的文件系统 | 是 | 是(SPIFFS掉电后需要调用SPIFFS_check() 进行修复,否则无法保证文件系统一致性) | 是 | 36.94kbytes | 3790 B(没有堆) | 2017年7月17日 | 上游开发人员不再积极支持SPIFFS。 支持256 byte页面 |
Yaffs2 | 专门为NAND Flash芯片提供了一个强大的日志文件系统,Yaffs当前是版本2。Yaffs2支持2K字节的页面闪存以及512字节的页面闪存。(Yaffs1仅支持原始的512字节页面闪存,并且现在处于维护模式。) | 是 | 是 | 是 | ** | ** | ** | 不支持256字节页面 |
JFFS2 | JFFS2是RedHat公司基于JFFS开发的闪存文件系统,从2.4.10版本开始,JFFS2已包含在正式的Linux内核中。 | 是 | 是 | 是 | ** | ** | ** | 挂载时间慢 |
参考:
- RTOS文件系统对比:LittleFS Vs. SPIFFS
- SPIFFS是什么
- Yaffs(Yaffs2)和JFFS2之间的比较
- SD卡中FAT32文件格式快速入门(图文详细介绍)
- SPIFFS弃用警告
- LittleFS Explorer
LittleFS-高完整性嵌入式文件系统
LittleFS文件系统特性:
- 断电恢复能力-它需要强有力的保证,以确保文件系统保持一致,并将数据刷新到基础存储。
- 损耗均衡-通常,存储支持每个块有限数量的擦除操作,因此,使用整个存储设备对于可靠性至关重要。
- 微小的占用空间-IoT设备受ROM和RAM限制。占地面积小节省金钱。
数据格式
工作历史信息记录
每1分钟,覆盖最后500小时(30000分钟)。
保存为\history\x.asc,x = 210413173800_0(年月日时分秒)
表1b 单位分钟 工作历史信息单元数据格式
字节序号 | 数据格式及范围 | 数据内容 | 说明 |
---|---|---|---|
1 | 00~99(BCD码) | 时间-年 | 表示范围2000年1月1日0时0分0秒到2099年12月31日23时59分59秒 |
2 | 01~12(BCD码) | 时间-月 | |
3 | 01~31(BCD码) | 时间-日 | |
4 | 00~23(BCD码) | 时间-时 | |
5 | 00~59(BCD码) | 时间-分 | |
6 | 00~59(BCD码) | 时间-秒 | |
7 | 00~100 | SOC | 1%分辨率 |
8 | 00~100 | SOH | 1%分辨率 |
9~10 | 0x00~0xFFFF | Battery voltage | 100 mV resolution |
11~12 | 0x00~0xFFFF | Battery current | 100 mA resolution |
13~14 | 0x00~0xFFFF | Cells voltage maxV | 10 mV resolution |
15~16 | 0x00~0xFFFF | Cells voltage minV | 10 mV resolution |
17~18 | 0x00~0xFFFF | Cells temperature maxT | 0.1 C° resolution |
19~20 | 0x00~0xFFFF | Cells temperature minT | 0.1 C° resolution |
21~23 | 0x00~0xFFFFFF | 累计放电能量 | |
24~26 | 0x00~0xFFFFFF | 累计充电能量 | 只统计充电,不包括回馈 |
27~29 | 0x00~0xFFFFFF | Cumulated exchanged energy | between two last sampling : signed 100 mWh resolution |
30~31 | 0x00~0xFFFF | CRC校验码 |
故障和错误信息记录
对于每一个报警、故障或警告事件,触发时刻之后5分钟信息记录(300秒):
保存为\event\x.asc,x = 210413173800(年月日时分秒 - 触发时刻)
表2b 单位秒 事件触发单元数据块格式
字节序号 | 数据范围及格式 | 数据内容 | 说明 |
---|---|---|---|
1~3 | DBC码 | 事件时间:时,分,秒 | |
4~5 | 0x00~0xFFFF | 事件时间之后第0ms电池电压 | 100 mV resolution |
6~7 | 0x00~0xFFFF | 事件时间之后第0ms电池电流 | 100 mA resolution |
8~71 | 0x00~0xFFFF | 事件时间之后第0ms,1`32号单体电压 | 10 mV resolution |
… | … | … | |
616~617 | 0x00~0xFFFF | 事件时间之后第900ms电池电压 | 100 mV resolution |
618~619 | 0x00~0xFFFF | 事件时间之后第900ms电池电流 | 100 mA resolution |
620~683 | 0x00~0xFFFF | 事件时间之后第900ms,1`32号单体电压 | 10 mV resolution |
684 | 0x00~0xFF | SOC | |
685~716 | 0x00~0xFFFF | 0~16号 单体温度 | 0.1 C° resolution |
717~718 | 0x00~0xFFFF | 功率连接器温度 | 0.1 C° resolution |
719~720 | 0x00~0xFFFF | 其他传感器温度 | 0.1 C° resolution |
721~730 | 10BYTE | CAN messages 1 +ID | |
731~732 | 2BYTE | CAN messages 1 事件时间之后第xx ms | |
733~742 | 10BYTE | CAN messages 2 +ID | |
743~744 | 2BYTE | CAN messages 2 事件时间之后第xx ms | |
… | … | … | |
757~766 | 10BYTE | CAN messages 4 +ID | |
767~768 | 2BYTE | CAN messages 4 事件时间之后第xx ms | |
769~770 | 2BYTE | CRC 校验码 |