基于NOR Flash的低开销分区管理实现

2024-01-23 00:44易恒武柯安
现代信息科技 2023年23期
关键词:单片机

易恒 武柯安

摘  要:NOR Flash用于存储运行程序和应用数据,在嵌入式系统中应用广泛。针对NOR Flash的文件系统较为臃肿,在内存较小的嵌入式系统中无法正常工作,导致NOR Flash的读写方式为直接地址访问,人为地分配地址空间,管理数据不方便且容易出错。为解决这一问题,设计了一套针对NOR Flash的低内存占有率的存储访问分区管理方法,满足嵌入式系统中原始数据、静态数据和动态数据的管理要求。

关键词:NOR Flash;分区管理;文件系统;单片机

中图分类号:TP333  文献标识码:A  文章编号:2096-4706(2023)23-0079-04

Implementation of Low Cost Partition Management Based on NOR Flash

YI Heng, WU Kean

(No.30 Institute of CETC, Chengdu  610041, China)

Abstract: NOR Flash is used to store running programs and application data, and is widely used in embedded systems. The file system for NOR Flash is relatively bulky and cannot function properly in embedded systems with small memory. It causes that the reading and writing method of NOR Flash is direct address access, address space is artificially allocated, and data management is inconvenient and prone to errors. To solve this problem, this paper designs a set of storage access partition management method with low memory usage for NOR Flash, which meets the management requirements of raw data, static data and dynamic data in embedded systems.

Keywords: NOR Flash; partition management; file system; Single-Chip Microcomputer

0  引  言

NOR Flash是一種非易失闪存技术,是Intel在1988年创建。它是市场上两种主要的非易失闪存技术之一。主要特点是芯片内执行(eXecute In Place, XIP),这样应用程序可以直接在NOR Flash闪存内运行,不必再把代码读到系统ram中。NOR Flash的传输效率很高,在1~4 MB的小容量时具有很高的成本效益。根据NOR Flash中常存放的数据类型,提炼出三种类型的数据,同种类型的数据存放在一个区域,每个区域使用一种管理方法。

1  系统设计

嵌入式系统的NOR Flash驱动支持读写和擦除。将NOR Flash分为三个管理区,分别为原始数据管理区、静态数据管理区和动态数据管理区,每个管理区拥有自有的初始化、打开、读、写、擦除操作,且每个管理区均按最小擦除块对齐,相同大小擦除块的区域需划分到一个管理区。每个管理区均含地址边界管理,防止数据越界,确保读写数据的安全可靠。管理区示意图如图1所示。

每个管理区如图2所示,起始页地址和结束页地址,均需要整除最小擦除块,即n =页起始地址/最小擦除块大小,k =页结束地址/最小擦除块大小n,k = {0,1,2,3,…}。

管理区头信息定义如表1所示。

1.1  原始数据管理区

针对NOR Flash中存放原始数据的需求,该管理区的存储区域全部用于存放数据。管理区头信息中序号4和序号5中指定的区域即为该区可使用的存储空间大小。逻辑区参数数据定义如表2所示。该管理区占用的管理内存开销如表2所示。

表2中序号1~3,根据表1中序号4和5指定的地址,在读写擦除操作时进行边界控制,表2中序号3根据表1中序号3指定大小,进行擦除操作。

一次完整的原始数据管理区读写流程如图3所示。

(a)读流程

(b)写流程

1.2  静态数据管理区

针对NOR Flash中存放已知大小数据,且该区域数据不能再被保存到其他存储区域,擦除时整块擦除。最小管理单元为静态节点,在使用前先分配NOR Flash空间,且分配空间需要按擦除块对齐,后期对同一静态节点的读写擦除都需要在分配的空间内进行,每一个静态节点的字符串描述通过crc16计算后的结果保存在节点校验码位置,在检索同一静态节点时通过crc16结果码进行快速查找。初始化静态数据管理区时,动态计算出该区最大的静态节点个数及需要使用多少个擦除页来存放和备份静态节点信息。逻辑区参数数据定义如表3所示。该管理区占用的管理内存开销为表3所示内容加上静态节点个数乘表4所示内容。

计算单个擦除块可以存放的静态节点个数k,k = 擦除块大小/静态节点描述信息大小,k为向下取整后的值,得出一个擦除块可以存放的静态节点个数。

静态数据管理区需要使用的静态节点描述个数j,j =(逻辑页结束地址-逻辑页开始地址)/擦除页大小,其中j必然是正整数。

计算最多需要的静态管理节点个数占用的擦除块个数m,当k≥j - 1,m = 1;当k<j - 1,m>j / (K + 1),m向上取整。实际应用中,需要用的擦除块个数为2×m。静态节点和可使用最小擦除块在静态管理区中的分布如图4所示。

其中,j1 + j2 + j3 + … + jn = j。

当k≥j - 1,m = j1,2m = j1 + j2,可用于存储数据的最小擦除块个数为j - 2。

当k<j - 1,m≥j1 + j2,可用于存储数据的最小擦除块个数为j - 2m。

静态节点初始化,静态节点在m区为顺序排列,首先扫描擦除区m和m + 1,根据表4所示内容,找到节点起始地址位于表1中序号4和序号5指定的地址区间,并做统计,比较m和m + 1中的统计结果,当且仅当m和m + 1中的统计结果都不为0时,表示有异常断电发生,使用统计结果计数大的为当前静态节点区,并擦除另一区。当两个区统计结果都为0时,表示该静态管理区第一次使用,选择m作为当前静态节点区,当一个区为0,另一区不为0时,选择不为0的区作为当前节点静态节点区。然后,扫描当前静态节点区,根据表4中描述,节点回收为0x55的节点放到删除节点链表,节点回收为0xff且节点初始化为0xaa的放到使用节点链表,并记录最大的静态节点的结束地址,最后,计算可以分配的最小擦除块个数。

静态节点打开,在静态节点初始化完成后,根据静态节点的名称,计算crc16值,遍历使用节点链表,成功,则返回节点信息,没有匹配到,则判断该节点所分配的最小擦除块个数能否满足,如果满足,则创建该节点信息,追加到静态节点区中,并将该节点插入使用节点链表尾部,否则,遍历删除节点链表,选择条件满足的擦除次数最少的静态节点,将其从删除链表中取出,更新节点校验码,设置节点回收为0xff,设置节点初始化为0xaa,将该静态节点插入到使用节点链表,将使用节点链表和删除节点链表上的静态节点写入另一个m区,写入完成后,擦除当前m区,设置更新后的m区为当前静态节点区,记录最大的静态节点结束地址;找不到匹配的管理节点,打开失败。静态节点和最小可擦除页的映射关系如图5所示。

在静态节点打开成功以后,方可进行静态节点读/写/擦除/删除操作。

静态节点读取/写入:静态数管理区读操作方法/写操作方法根据静态节点中的节点起始地址和节点结束地址,任意读取/写入该区域的内容。

静态节点擦除:静态数据管理区擦除操作方法根据静态节点中节点起始地址和节点结束地址,进行整块擦除,并更新RAM中该静态节点信息中的擦除次数。

静态节点删除:先使用静态管理区擦除方法,将该区域数据擦除,然后将节点回收写为0x55,最后,将该节点从使用节点链表删除,并加入删除节点链表。

1.3  动态数据管理区

针对NOR Flash中存放未知大小且支持读写、更新和擦除的数据。最小管理单元为动态节点,大小为4 096字节,包含动态节点信息和可写入数据区。根据系统自身内存容量,可以设置动态节点为4 096字节的整数倍,典型值为8 192字节。每一个动态节点的字符串描述通过crc16计算后,将结果保存于表6中的节点校验码字段。在检索同一动态节点时通过crc16结果码进行快速查找。设置节点回收阈值,即最小擦除块回收节点占整个擦除块的比例,典型为70%。节点回收缓存区位于整个动态管理区的最后位置,典型为4个最小擦除区,根据自身NOR Flash大小,调节回收缓存区大小,因此,动态数据管理区在分区时,至少要大于节点缓存区。逻辑区参数数据如表5所示。该管理区占用的管理内存开销为表5所示加上最小管理区大小,典型为8 192字节。

动态节点初始化:回收缓存区只有在异常断电的时候,才会有数据。首先扫描回收缓存区,统计上面的使用动态节点个数,如果大于零,则根据动态节点信息中的节点起始地址,找到原始可擦除块并进行扫描,如果原始可擦除块上数据不全是0xff,则统计其使用动态节点个数,与回收缓存区中的统计结果做比较,如果大于回收缓存区中的结果,则擦除对应回收缓存区,选择另一个回收缓存区备份,然后擦除该块,如果小于等于回收缓存区中的结果,则擦除该块,将回收缓存区中的非回收动态节点回写到原位置,完成后擦除该回收缓存区。然后,扫描动态管理区有效数据区域,以动态节点大小为步长,将动态节点地址为0xffffffff的节点设置为其现在的地址,不合法的动态节点地址或者节点校验码为非0xffff且节点属性为非法的,将其及其子节点设置为回收。

动态节点打开:在动态节点初始化完成后,根据动态节点名称,计算节点名称crc16值,扫描动态管理区内的所有动态节点,找到节点校验码匹配的节点,且节点属性为0xee且节点回收为0xff,记录该节点信息。如果没有找到,则随机查找一个初始化的空闲动态节点信息,设置节点校验码,将节点属性设置为0xee,记录该节点信息。

动态节点读取:根据打开的动态节点信息,读取动态节点链上的数据。

动态节点写入:如果动态节点是全新节点,写入数据在动态管理节点大小以内,直接写入数据,如果数据大于动态管理节点大小,则写满一个动態管理节点后,随机分配一个未使用的动态管理节点,将该动态管理节点的子节点地址设置为新分配的动态管理节点的子节点起始地址,并将该节点crc16的值写入子节点中的节点校验码,设置子节点属性为0x77,将待写入数据写入子节点,同理,子节点写完还不够,则继续分配子节点,子节点分配失败,则启动动态节点回收,回收完成后,再进行子节点分配,仍然不成功,则写入失败;如果动态管理节点是已经有数据的,根据写入数据,找到需要写入的管理节点区域,如果该区域的数据区为全0xff,则直接写入数据,否则,将该区备份到回收缓存区中,将需要写的动态节点整个区更新到内存,然后擦除原可擦除区,将备份的数据除了需要更新的都回写到原区域。最后,将更新到内存中的数据块写入原区域。

动态节点删除:将打开的动态节点及其子节点中的节点回收设置为0x55。

2  结  论

常用的文件系统臃肿,在嵌入式系统中有些无法工作,且功能强大,其中很多功能在应用中用不到。相对于复杂的文件系统,本文提出的方法,适用于低内存的嵌入式系统中,为NOR Flash访问隐藏地址信息,让操作更容易,其中三个不同的管理区,适用于不同的使用场景,为此类系统提供一种读写访问NOR Flash的方法。

参考文献:

[1] 朱海东,王新社.基于扇区映射的NOR flash磁盘模拟方法 [J].计算机工程与设计,2007(24):5899-5902.

[2] 陈桂生,李志刚.嵌入式Flash文件系统的设计与实现 [J].计算机系统应用,2010,19(5):36-40+62.

[3] 杜伟庆,苏凯雄.嵌入式系统中NOR Flash的分块管理与实现 [J].计算机与数字工程,2009,37(12):80-82.

[4] 马资道,魏贵鹏,谢演.一种基于FLASH的智能卡文件系统的实现方法 [J].通信技术,2019,52(4):1020-1024.

[5] 张明磊,尚利宏.几种源码开放的嵌入式文件系统分析与比较 [J].单片机与嵌入式系统应用,2007(11):15-18.

作者简介:易恒(1990—),男,汉族,四川蒲江人,工程师,本科,研究方向:嵌入式系统应用。

猜你喜欢
单片机
基于单片机的SPWM控制逆变器的设计与实现
基于单片机的层次渐变暖灯的研究
基于单片机的便捷式LCF测量仪
小议PLC与单片机之间的串行通信及应用
基于单片机的平衡控制系统设计
Microchip推出两个全新PIC单片机系列