首页 > 资讯 > 科技 > 正文
2024-04-02 12:40

JesFS 闪存文件系统:小型控制器的大数据存储

介绍

文件在现代电子设备中非常重要。 处理器通过操作系统访问不同类型的文件,但在嵌入式领域和低功耗定制Linux解决方案中,相关解决方案还比较少见。 许多嵌入式开发人员习惯将数据放入代码中,导致每次更改都需要升级固件代码。 JesFS嵌入式文件系统旨在解决此类问题——专门为小型、低功耗设备设计。

在电影《终结者2-审判日》中,机器人T 800(施瓦辛格)说“我有详细的文件”,以表明他是一个强大的战斗机器人。 关键来了:文件无疑是高科技产品的关键要素! 这也适用于所有嵌入式系统。 本文将向您介绍一种合适的嵌入式文件系统。

文档和代码

文件本质上是用于组织和传输各种类型信息的基本容器。 大到服务器,小到微控制器的任何人都可以理解这些信息,操作系统为不同的文件提供接口。

在嵌入式系统和低功耗定制Linux解决方案领域,相关解决方案很少。 在很多重要的项目中,代码和数据没有分开,往往会导致项目失败。 例如,将系统参数放在代码中很容易,但如果以后要修改它们,则每次都必须升级固件。 然而,现在在线更新已成为常见做法。

作者从事高海拔地区科学测量及相关仪器领域工作。 几个月前我有过一次相关经历:在海拔3000米的山上更换一台旧设备的配置。 在费尽心思挖掘之后,我决定通过互联网更新比在-20°C的雪地里挖洞要容易得多。 最终我决定使用文件系统。

尽管有很多嵌入式文件系统,但这些文件系统大多数只适应它们所在的域。 所以我决定自己开发一个。 最后,JesFS(Jo' 的缩写)诞生了,其目标是微型系统和极低功耗的应用。

杰斯福斯

设计 JesFS 时最重要的标准是可靠性和占用空间小,以及数据完整性和远程固件升级。 与JesFS结合,还需要开发JesFS来帮助处理器读取AES加密固件。 它完全独立于JesFS,这里不再讨论。 目前所有的精力都集中在 JesFS 上。 JesFS已经成为一个重要且不可或缺的工具。 JesFS 是在 GPL v3[1] 许可下开源的。

参考示例

JesFS 使用标准 C 编译器进行编译。 接下来将在TI的开发板上演示一些功能。 基于32位ARM-M3架构,具有868/915 MHz无线传输功能(见图1)。

图1 JesFS开发板

/26xx系列处理器的开发平台质优价廉,配备TI的[3]IDE进行源代码调试。 /26xx开发平台配备了1MB串行闪存,这是唯一的!

免费的 TI-RTOS 可以提供工业级实时操作系统和 TI 广泛的技术支持。 JesFS的源代码可以在开发平台上编译,也可以在Linux平台上使用标准C编译器编译,但需要模拟Flash驱动程序的支持。

小型闪存芯片

嵌入式系统通常不需要太多的存储空间,1~16MB就足够了。 闪存芯片现在可以做得非常小:1 MB 闪存可以小至 1.24 mmx1.29 mm(见图 2)。

图2 WLCSP更小

JesFS文件系统本身占用的空间非常小,只占用200字节的RAM,并且运行得非常好。 还有一个经济原因:许多大型文件系统使用RAM作为缓存,这不仅复杂并且占用大量存储空间,而且切换操作模式(例如休眠或关机)会很慢。 Jes-FS 的设计考虑到了低功耗,可以在几毫秒内休眠和唤醒。 此外,串行存储器在睡眠模式下的功耗低于 1μA,非常适合电池供电的设备。

IoT 的独特功能

JesFS的一个基本特征是嵌入式系统的文件可以通过互联网自动镜像并存储在服务器上,因此服务器拥有嵌入式文件系统的实时更新的副本。 该功能也可以用于分钟级别获取数据的场景,但为了降低功耗,服务器副本一般不会通过互联网比对频繁更新(一般是几个小时更新一次)。

即使远程传输新文件或固件升级,如有必要,JesFS 也可以通过特殊标志(时间戳和 CRC32 哈希检查)轻松从服务器检索文件。 如果将这些特殊用途拓展出去,将会有无数种可能的应用场景。 所有功能和脚本都经过作者仔细测试。 关于FesFS文件系统功能的详细说明,请参考相关链接[1]。

解决目标:未关闭的文件

对于大多数文件系统,如果您没有打开文件的写权限,则只能读取该文件。 所以问题是:异常可能导致文件未关闭,或者在最坏的情况下导致数据丢失。 JesFS 不会发生这种情况。 该文件可以随时打开进行读写,不会造成数据丢失。 此功能非常适合日志文件,例如,嵌入式系统存储新数据,同时服务器使用最新数据更新。

JesFS 的局限性

JesFS卸下重担后,访问量还没有调整到最佳水平。 未来会对未封闭的文件进行一些细微的调整和限制。 由于它是专为资源有限的小型嵌入式系统设计的简单文件系统,因此文件名长度限制为最多 21 个字符。 为了减少CPU负载,索引数据也没有实现。 总的来说,它是一个平面文件系统。 这些限制不应对小型系统中的实际应用造成任何相关限制。 JesFS文件系统的简单易用可以大大提高效率。 作者本人就是最严格的测试者。

串行闪存

在设计软件细节之前,我们先介绍一下Flash存储器的一些基本知识。 Flash存储器的种类很多,串行NOR Flash芯片主要应用于嵌入式系统领域。 为了让JesFS更好的适应硬件,需要解释一些细节,同时还涉及到一些底层驱动的开发。

一般来说,几乎所有相关的闪存都具有相似的结构,但在容量、静态电流、最大时钟速率和数据位数方面有所不同。 所有串行NOR Flash芯片都有6个共同特征:

①清空内存,默认存储位为‘1’;

②写入数据时,根据需要将存储位'1'设置为'0';

③反之,擦除操作将数据位从‘0’恢复为‘1’;

④每次写操作可写入1~256字节数据,耗时约1ms;

⑤数据按块、扇区或全部擦除。 扇区通常为 4KB。 擦除一个扇区需要20~200ms(扇区擦除通常很少使用);

⑥擦除操作次数有限,通常不超过10万次。

访问串行闪存芯片非常简单,只需要 4 个步骤(见图 3):

①引脚电平从1变为0后几纳秒内芯片被激活;

②通过CLK引脚(时钟)和DIN引脚(数据)写入数据和命令;

③通过CLK(时钟)引脚和DOUT(数据/状态)引脚读取数据和状态;

④ 当该引脚电平由0变为1时,操作结束。

图3 8针串行Flash引脚分配

串行闪存芯片的最大时钟速率通常非常高(>50MHz),大多数微处理器硬件驱动程序无法充分利用它。 这里参考设计平台中使用的处理器的12 MHz时钟频率可以实现1MB/s的非常好的数据吞吐量。

以下是推荐的适合小型系统的通用存储芯片。 虽然有些有兼容的替换芯片,但替换芯片的功耗可能会更高:

◆ (1MB) 至 (16MB)

◆ (1MB) 至 (16MB)

◆(2MB)

黑匣子演示:家用飞行记录器

许多嵌入式设备在数年的使用寿命内都不会出现错误,但偶尔也会出现错误。 当发生错误时,我们会问:“发生了什么?” 要回答这个问题,我们需要足够的历史日志数据来分析和诊断。 例如,内部参数(如温度、电压、湿度)是否发生变化? 有人做过调整吗? 您以前遇到过类似的问题吗? 这些问题类似于飞机上的黑匣子。

然而,嵌入式系统通常没有足够的空间来执行此操作。 然而,JesFS文件系统的非封闭文件可以稳定、高效地记录诊断数据。 JesFS可以避免僵尸数据的产生,即使在复位或断电的极端情况下也可以写入数据。

依靠两个文件来实现这一点:

◆ 主文件Data.pri 可写入的最大数据长度为HIS-TORY 定义的长度;

◆ 重命名为辅助名称Data。 秒;

◆ 新创建的辅助文件将替换原来的辅助文件。

通过定义,可以获得特定长度的历史数据,从而保证历史数据的历史记录条数是一个常数,不会超过历史记录的2倍。 通过检索数据获得正确的顺序,首先是 Data.sec,然后是 Data.pri。

用于各种编译器(PC 和嵌入式)演示的完整记录的源代码,包括 Jes-FS 的源代码文件,可以在相关链接 [1] 中找到。 此处打印的清单显示了代码摘录:

******************************************

*(字符*,长度)

* 将一行记录到

******************************************

(字符*,){

,; //2 JesFs文件资源;

资源=();

//(快速)唤醒JesFs(可能是)if(res) res;

//Flags() : 如果没有则文件并在中打开

//RAW模式,(RAW模式文件中的RAW不是if)

res=( &, "数据, pri", );

如果(RES)RES;

//将()文件放置到文件末尾以允许写入(&, NULL,);

//(虚拟)读取尽可能多的内容

//将新数据(ASCII,来自 )写入

//文件

文件错误800017_错误文件名有哪些_错误800说少了个文件

res=(&,,tlen);

如果(RES)RES;

//显示什么是

("位置:%u 日志:%s",.,");

//现在如果数据多于 if(. >= ){ 则进行文件移位

("Shift 'Data.pri' -> 'Data.sec'\n");

// 和(在任何情况下)文件

res= (&, "Data.sec", if(res) res;);

如果(RES)RES;

//(完整)数据文件到文件

资源=(&,&);

如果(RES)RES;

(); //设置

; //好的

驱动程序基础知识

JesFS使用上层驱动和下层驱动。 底层驱动程序是针对串行Flash的,又分为通用命令.c和串行SPI的硬件控制部分(此处为.c)。 上层驱动在相关链接[1]中有详细描述。

处理闪存非常简单(大多数闪存芯片使用此处未使用的特殊命令),但很少有相关命令,幸运的是,这些命令对于几乎所有可用的串行闪存芯片都是相同的。 对于更大的容量(≥32MB),地址仅从3字节扩展到4字节。

源代码文件更准确地记录命令。 以下是十六进制表示法的命令概述。

9Fh:读取 3 字节 ID(十六进制),编码制造商、类型和容量(2 十六进制的幂)。 对于芯片输入,此 ID 为“”,其中 C2h=、28h=类型、14h=20=220=1 MB。

B9h:使闪存芯片进入深度睡眠。

ABh:在 5~50 μs 内唤醒闪存芯片。

03h:读操作。 首先,准备读取 3 字节地址(32 MB 容量为 4 字节)。 读取数据后,cs# 变高。

06h:必须在每次写/删除操作之前发送。

02h:写操作。 先发送3或4个地址字节,然后发送1~256字节数据,最多不超过256字节。

20h:删除扇区。 首先发送 3 或 4 个地址字节,然后删除关联的 4 KB 扇区。

05h:测试之前的写/删除命令是否已经完成。

Flash 中的组织结构

实现细节和图形可以在JesFS的文档和源代码中找到[1],这里仅显示结构。 JesFS 将闪存分为 3 种不同的扇区类型。 每个逻辑扇区与闪存芯片中的物理 4KB 扇区对齐。 因此,一块容量为1MB的闪存芯片最多可以存储255个文件。

扇区 0 具有特殊意义,因为它用作文件索引。 每个索引条目占用 4 个字节。 因此索引可以被认为是一个 1024 个“无符号长整型”的数组。 对于扇区 0,必须遵守以下规定:

◆ 索引扇区0仅在格式化时被删除;

◆ 前3 项包含格式化信息Magic value、Flash ID(参见命令9Fh)和格式化日期(自1970.1.1 起的Unix 秒),FFFF FFFFh 值被计算为无效/未格式化;

◆ 剩下的1021 项是文件头的起始地址。 所有这些项目必须能被 212=4096(扇区大小)整除(JesFS 将检查)。 理论上最多可以有1021个文件。

扇区 1 到 n 有 5 种可能性:

◆ 该扇区为空(包含FFh值的完整字节);

◆ 扇区是活动文件的头;

◆ 扇区指向被删除文件的头部;

◆ 扇区是活动文件的一部分;

◆ 扇区是活动文件的已删除部分。

head 是索引所指向的扇区。 因此,对头进行特殊处理非常重要,因为索引中的值仅在格式化时才会被删除。 每个扇区总是以 3 个(或 12 个头)“long”类型的值开始:

◆ 使用魔法值(标头、文件或空);

◆ 该块的所有者(引用标头,如果块本身是标头,则引用 FFFF FFFFh 值);

◆指向文件下一个块的指针,如果这是链的最后一个块,则为 FFFF FFFFh;

然后是文件数据或头部:

◆文件长度,以字节或FFFF FFFFh表示;

◆ 可选的CRC32哈希校验(如果以CRC32模式写入并关闭);

◆ 文件的创建日期(自1970年1月1日起,以Unix秒为单位);

◆ 文件名(最多21个字符,不包括最后一个字符0h);

◆文件打开标志(1字节);

◆ 保留的空字节。

一个磁头总是占用48字节,一个普通数据扇区占用12字节,开始部分是管理信息。 其结构如图4所示。

图4 索引始终指向文件头的0扇区

删除一个扇区只是对其进行标记。 使用的魔法被选择通过用“0”进行额外的覆盖来主动删除状态(这发生得非常快)。 只有当某个扇区确实需要并且没有空闲扇区时,才可以通过命令20h来删除,这会花费更多的时间。

磨损均衡和未关闭的文件

使用闪存时,所有扇区的使用频率应相同,这一点非常重要,因为它通常只能擦除和写入约 100,000 次。 这样你就可以在很短的时间内循环“杀死”一个扇区。 这种避免策略称为“磨损均衡”。 对于 JesFS 来说,这意味着一个文件(由于索引中的固定条目)最多可以被删除 100 000 次。 乍一看,擦除和写入的次数可能看起来很多,但对于嵌入式系统来说,这种限制在某些应用中肯定会出现问题。 另一方面,应该清楚的是,即使每个扇区每小时都被擦除,11年也会过去。 对于大多数项目来说,这仍然足够了。

为了删除尽可能少的扇区,还可以保持活动或使用过的文件打开; 删除字节的值始终为 FFh。 如果相关文件从不使用该值(例如,仅保存 ASCII 数据或用转义序列替换 FFh),也可以通过简单读取(最多一个 FFh 字符)来确定文件结尾。 JesFS 有一个非常快的子例程,可以在几毫秒内找到 16 MB 文件的结尾。

CRC-32 哈希和数据完整性

只有少数文件经常更改。 因此,JesFS可以在写入(和读取)文件时添加CRC-32检查,与文件头的长度一起记录在“文件关闭”中。 这样,只需读取文件即可随时检查文件的完整性。 使用的 CRC-32 算法是行业标准(ISO 3309 等),甚至受到 PHP(一种常见服务器脚本语言)的支持。

在 JesFS 启动时(或每次系统唤醒后)执行全面的测试,以检查 JesFS 的基本完整性。 JesFS 非常关注错误。 演示的源代码中还包含一个检查完整 JesFS“心脏和肾脏”(即所有扇区和文件)的功能。

引导加载程序和固件升级

由于 JesFS 的结构非常简单,即使是简单的引导程序也可以轻松读取文件并测试完整性。 然而,引导加载程序通常仅与特定的 CPU 架构或控制器类型相关。

测试JesFS

测试 JesFS 最简单的方法是使用 /26xx 系列的开发平台,这些板的价格约为 30 欧元。 在 JesFS 文档中,您还可以找到简单控制台应用程序的手册。

另外,JesFS可以在运行Linux的PC上编译,或者在Linux上模拟RAM中的Flash芯片。 生成的镜像文件与Flash芯片完全兼容。 如果微控制器的数据格式很少,并且程序员可以轻松传输或读取,则大多数 ARM SoC(例如等)都支持它。

下一步是什么?

根据读者的反馈,这份报告仅仅是一个开始。 文件系统并不是一个简单的东西,但如果 JesFS 能够成为一个通用工具,作者将会非常高兴并坚信它具有惊人的潜力。

当然,JesFS不限于/26XX系列控制器,原则上适用于几乎所有16位以上的处理器。 该系列的 Jes-FS 移植工作目前正在进行中,并且有许多可以与 JesFS 结合的可想象项目,尤其是无处不在的物联网提供了无限的可能性。 如果您确实感兴趣,可以通过电子邮件(@)联系作者。

相关链接

[1] JesFS V1.1 auf:com/joem-/JesFS

[2] TI​​-:www,ti,com/tool/-

[3]:com/工具/

[4] 闪光: . com/en - us/-ucts/NOR - 闪存/-NOR - 闪存

Von:我从小就对电子产品充满热情。 学习电气工程后,他于 1992 年将自己的爱好变成了职业,在德国南部从事科学环境测量仪器的开发工作。