引言
随着嵌入式系统的迅速发展和广泛应用,大量需要一种能多次编程,容量大,读写、擦除快捷、方便、简单,外围器件少,价格低廉的非易挥发存储器件。闪存flash存储介质就是在这种背景需求下应运而生的。它是一种基于半导体的存储器,具有系统掉电后仍可保留内部信息,及在线擦写等功能特点,是一种替代eeprom存储介质的新型存储器。因为它的读写速度比eeprom更快,在相同容量的情况下成本更低,因此闪存flash将是嵌入式系统中的一个重要组成单元。然而,由于flash读写存储的编程特点,有必要对其进行存储过程管理,以使整个系统性能得以改善。
1、 闪存flash的存储编程特点
flash写:由1变为0,变为0后,不能通过写再变为1。
flash擦除:由0变为1,不能只某位单元进行擦除。
flash的擦除包括块擦除和芯片擦除。块擦除是把某一擦除块的内容都变为1,芯片擦除是把整个flash的内容都变为1。通常一个flash存储器芯片,分为若干个擦除block,在进行flash存储时,以擦除block为单位。
当在一个block中进行存储时,一旦对某一block中的某一位写0,再要改变成1,则必须先对整个block进行擦除,然后才能修改。通常,对于容量小的block操作过程是:先把整个block读到ram中,在ram中修改其内容,再擦除整个block,最后写入修改后的内容。显然,这样频繁复杂的读-擦除-写操作,对于flash的使用寿命以及系统性能是很不好的,而且系统也常常没有这么大的ram空间资源。一种基于虚拟扇区的管理技术可以有效地控制flash的擦写次数,提高flash的使用寿命,从而提高系统性能。
2、 基本原理
2.1概念
vss(visual small sector),虚拟小扇区:以它为单位读写flash内容。
vss id(visual small sector identity),虚拟小扇区号:只通过虚拟扇区号进行存储,不用考虑它的真实物理地址。
si(sector identity),分割号:一个擦写逻辑块中物理扇区的顺序分割号。
bi(block identity),块号:flash芯片中按擦除进行划分的块号。
sat(sector allocate table),扇区分配表:一个擦写逻辑块中的扇区分配表。一个sat由许多sat单元组成,一个sat表对应一个block,一个sat单元对应一个vss。
每个sat单元最高两位为属性位,后面各位为vss id号。如果一个sat单元由16位组成,则vss id最大可以达到161024;而如果sat单元由8位组成,则vss id最大可以达到64,具体约定由应用情况而定。
2.2 实现原理
把每个block分为更小的虚拟逻辑块(visual small sector),称为虚拟扇区,扇区大小根据应用而定。每个block前面的一固定单元用于记录本block中扇区分配的使用情况(即扇区分配表),包括扇区属性及扇区逻辑号。图1为逻辑扇区划分示意图。
在进行数据读写和修改时,以虚拟扇区块的大小为单位。要修改某一扇区的数据时,先读出这个扇区的内容,重新找一个未使用的扇区,把修改后的内容写入这个新扇区。然后,修改原来扇区的属性值为无效,修改这个新扇区的属性为有效,拷贝vss id号到新扇区对应的sat单元中。
这样,当某一个block中的sat属性都标为无效时,才对当前block进行擦写。可见,以虚拟扇区大小为单位的存储管理,对flash块的擦写次数可大大减少,从而提高了系统性能。
3 、vss管理实现要点
3.1 常数部分
#define blocksize 128*1024 //可根据flash型号修改
#define sectorsize 512 //可根据flash型号及应用情况修改
#define max_block 8 //可擦除块个数
#define max_si_1b 255 //每个可擦除块中有效si个数
#define satsize 510 //扇区分配表大小
#define vss_mask 0xc000 //vss属性屏蔽值
#define vss_free 0xc000 //vss为未使用的属性值
#define vss_valid 0x4000 //vss为有效的属性值
#define vss_invalid 0x0000 //vss为无效的属性值
3.2 数据结构部分
unsigned char vss_table[max_block][max_si_1b/8];用于记录flash中各个block的使用情况。数组中的某位为1,表示相应sector为未使用;否则,为已经写过,系统通过这个表可以跟踪各个block的使用情况。
3.3 函数功能部分
1) flash_format()//擦除整块flash存储介质。
2) flash_init()//对vss管理系统参数进行初始化,填充vss_table表,统计flash的使用情况。在系统复位初始时调用。
3) block_erase(int blockid)//擦除块号为block id的块。
4) find_vss(int vss)//查找vss所在的block id及分割号si。
5) get_addr(int vss)//取得vss所在的物理地址。
6) scan_sat(int blockid)//整理块号为block id的sat,填充vss_table[]。
7) flash_read(long addr,char *pdata,int len)//从物理地址为addr的flash处读取len个字节到pdata。
8) flash_write(long addr,char *pdata,int len)//写pdata中长度为len的数据到指定地址为addr的flash中。
9) read_sat(int bi)//读取块号为blockid的sat。
10) isvalid(vat)//检查本sat单元属性是否有效。
11) isfree(vat)//检查本sat单元属性是否未使用。
12) isinvalid(vat)//检查本sat单元属性是否无效。
13) read_vss(addr)//从地址为addr处读一个vss。
14) write_vss(addr,*pdata)//把pdata中的内容写到从地址addr开始的一个vss中。
4、 计算vss id的物理地址
要对某个vss id进行读写操作,必须先找到其物理地址。
定位某个vss id物理地址的过程如下。
① 查找这个vss id所在的块号(bi)以及在这个块中所处的分割号(si)。
从第一个block开始,搜索这个块的sat表。首先搜索属性,只有属性为有效的才比较vss id号。如果条件满足,记录所在的块号bi及sat的位置,即扇区分割号si;否则,block号增加,继续按照上面步骤查找。
bfound=0;
for(int i=0;imax_block;i++)
{//读取对应block的sat表
psat=readsat(i)
for(j=0;jmax_si_1b;j++)
{//分析每个sat单元
sat=*psat++;
if(isvalid(sat))//比较属性是否有效
{//比较逻辑号是否相等,相等设置标志退出
if(equal(sat,vssid)){bfound=1;break;}
}
}
if(bfound){bi=i;si=j;break;}//找到后记录块号和分割号退出
}
②找到vss id所在的块号及分割号(si)后,这个vss id的物理地址为:
addr=整个flash的偏地址+
blockid*blocksize+satsize+si*sectersize。
5、应用
应用于名片记录管理系统:由于名片记录很大,而且记录很多,存在常常修改的情况,因此可以使用flash作存储介质。
名片记录结构为:
struct card
{
char name[10]; //姓名:10字节
char position[15]; //出职务:15字节
char companyname[40]; //公司名称:15字节
char mobilephone[11]; //手机号码:11字节
char homephone[15]; //家庭电话:15字节
char officephone[15]; //办公电话:15字节
char email[30]; //邮件地址:30字节
char homepage[30]; //公司主页:30字节
char remark[40]; //备注:40字节
}card_record;
每个名片记录大小为:181字节。
对于1mb的flash,分为8个block,每个block为128kb(131072字节)。
针对以上情况,作如下分配:
每个扇区大小为181字节;
sat大小为1432字节,每个sat单元用16位(2字节);
分为716个扇区,也相当于1个block能存716条名片记录,则131072-1432-716181=44字节为空闲。
常数定义部分修改如下:
#define blocksize 128*1024 //每个block大小
#define sectorsize 181 //每个扇区大小
#define max_si_1b 716 //每个可擦除块中有si个数
#define satsize 1432 //扇区分配表大小
#define vss_mask 0xc000 //vss属性屏蔽值
#define vss_free 0xc000 //vss为未使用的属性值
#define vss_valid 0x4000 //vss为有效的属性值
#define vss_invalid 0x0000 //vss为无效的属性值
约定:首先对名片进行编号,且约定名片的编号对应于vss id逻辑号。
a) 记录增加。增加一个记录时,根据提供的vss id号,首先查找这个记录号是否在使用。如果还没有使用,首先查找这个记录号是否在使用。如果还没有使用,则申请一个未使用的vss,把相在内容写入这个vss,修改其对应的sat单元,写入有效属性值和vssid号;否则,进入记录修改过程。
b) 记录删除。要删除一个记录时,根据提供的vss id号,查找sat表。如果找到,修改其对应的sat属性为无效;否则,说明这个记录不存在。
c) 记录查找。①由vss id号进行的查找:根据提供的vss id号,查找所有的sat表中属性为有效的vss id,返回相应的bi及si。②根据名片的用户名查找:检测所有的sat表中属性为有效的vss id,得到相应的bi及si,由bi及si定位到指定flash物理地址读入用户各到ram中,比较是否相等。如果相等,读取并返回sat单元的vss id;否则,继续查找。
d) 记录修改。当要修改一名片记录时,由vss id先把这个记录读入到ram中,然后修改其内容,重新找一个未使用的扇区,把修改后的内容写入到这个新扇区中,并拷贝其vss id号到这个新扇区对应的sat单元,修改其属性为高,修改原来的扇区属性为无效。
6、结语
本文提出的flash存储管理技术原理简单实用。它是对那些复杂的flash文件管理系统的一种剪裁、简化和定制。对于那些不需要复杂的文件管理系统,而又使用了flash作为存储介质的嵌入式系统有很好的借鉴意义和使用价值,如手机电话号码簿管理、短信管理等都可以利用这种技术进行管理。
自动驾驶汽车测试为何在美惹争议?
软件定义技术如何为网络服务
中控智慧科技指纹门禁一体机OF107简介
爆料称英特尔CEO将于2月15日离职
网络编码在无线通信网络中的应用知识
基于虚拟扇区管理技术提高Flash存储器的应用系统性能
PCBA加工的表面组装方法有哪些?
国科微全固态硬盘入选中国品牌日电子信息行业国货新品推广目录
9.43亿!方正科技拟在泰国新建PCB智造基地项目
双11最强的电视盒子是哪款?2022电视盒子排名新鲜出炉
IPv4超网的定义 超网是如何进行聚合的?
Raspberry Pi与过去的计算机相比如何?
特斯拉电池的维修
智能锁的优点缺点
什么是波分/频分光交换(WDPS/FDPS)
CC2340R2和CC2340R5低功耗蓝牙MCU比较
关于重量变送器的误差类型的介绍分析
健康教育照明市场爆发在即
采用DSP和GC5322芯片实现数字预失真校正系统的设计,简化实现难度
Fairchild车载FL7734可调光LED照明解决方案