基于msp430F149管理sst25vf016b存储芯片的文件管理系统

sst25vf016b是以块2Mbyte大小的存储芯片总共分为啦512块,每块4K,来进行管理,

首先介绍全局变量:

unsigned char Flag_Key12=0;

标志是否为最后一块

unsigned char Flag_Read=0;

标志读完整块flash,

unsigned int Flag_16Num=0;

写数据,读数据时的控制器

unsigned int Block_MuluNow=0;

保存当前正在操作的目录

unsigned int Table_Block[64];

每两个Bit表示一个块,每8个块压缩正一个字节,64个字节,正好对应512个块,每个块有3种状态,00空,01占用,10脏块

unsigned char Table_Block_1[8];

把一个字节展开放入此数组,查找的时候更快速

unsigned int Next_Block=0;

下一块

unsigned char block_n=1;

记录当前操作块的下一块,以此来实现擦出的轮番使用,不会应为某一块的过度擦除而导致整块flash损坏

unsigned char Name_Front=0;

记录管理的条目,本系统设置是不超过146个条目

unsigned char Name_Empty=0;

记录要删除的条目

flash管理的总体规划:

flash的存储管理就是按照实现安排的内容来进行管理的.

函数说明:

/*

功能:检查目录,开机进行

*/

unsigned char Flash_JCmulu()

{

unsigned int i=0;

unsigned char Table[2]={0,0};

unsigned long int Block_MuluAdd=0;

unsigned char Table_Block_H=0,Table_Block_L=0;

for(i=0;i<512;i++)

{

Block_MuluAdd=i<<12;      //首先i进行右移12位,总是乘以4096,即4K,达到对                     Read_Byte_Cont(Block_MuluAdd,Table,2); //512 块的循环

if((Table[0]==0)&&(Table[1])==0)  //首先查找目录块

{

Block_MuluNow=i;

break;

}

else if(i==511) return 0;

}

Block_MuluAdd=Block_MuluNow<<12;    //赋值给Block_MuluAdd,来进行保存Block_MuluNow

Name_Front=Read_Byte(Block_MuluAdd+1024);//的值

//读取64字节的Table_Block的内容

for(i=0;i<64;i++)

{

Table_Block_H=Read_Byte(Block_MuluAdd+1024+1+i);

Table_Block_L=Read_Byte(Block_MuluAdd+1024+2+i);

Table_Block[i]=(Table_Block_H<<8)|Table_Block_L;

}

//按照上表来进行读取相关内容

Read_Byte_Cont(Block_MuluAdd+1024+1+128,Table_Block_1,8);

Next_Block=Read_Byte(Block_MuluAdd+1024+1+128+8+2);

block_n=Read_Byte(Block_MuluAdd+1024+1+128+8+3);

return 1;

}

//给新的条目分配空间,同时更新目录,当然只有第一次使用时不需要更新,以后使用每次都更新目录

unsigned char Flash_AllocateSpace(unsigned char *Table_Time)

{

unsigned long int Block_MuluAdd=0;

unsigned int Block=0;

if(Name_Front!=146)

{

Block_MuluAdd=(Block_MuluNow<<12);

Block=Search_Block();   //搜寻空块

if(Block==512)return 0;

else Block_MuluNow=Block;  //作为本次操作使用

Block=Search_Block();  //搜寻空块,作为下次操作使用

if(Block==512)return 0;

else Next_Block=Block;

Write_Byte(Block_MuluNow<<12,0); //标志为目录

Write_Byte((Block_MuluNow<<12)+1,0);

//向里面写入Table_Time数据,以及下一块的标号

Write_Byte_Cont((Block_MuluNow<<12)+2+Name_Front*7,Table_Time,5);

Write_Byte((Block_MuluNow<<12)+2+Name_Front*7+5,(Next_Block>>8)&&0xff);

Write_Byte((Block_MuluNow<<12)+2+Name_Front*7+6,Next_Block&0xff);

//第一次时,不需要更新,以后每次都更新目录,并且相应目录块标志为11(分配空间时标志为1,后更新目录时又和2相或,故为3)

if(Block_MuluAdd!=(Block_MuluNow<<12))

Mulu_InformationUpdate(Block_MuluAdd,WRITE);

//条目加1

Name_Front++;

//同时当前操作块表为1,占用块,此为有用数据

Table_Block[Block_MuluNow/8]|=0x0001<<((Block_MuluNow%8)*2);

//当然下一块也要更新为占用块,以免下次查找到同一块

Table_Block[Next_Block/8] |= 0x0001<<((Next_Block%8)*2);

return 1;

}

return 0;

}

void Flash_Write(unsigned char*Table,unsigned char Flag_Key12)

{

unsigned long int Next_Block_MuluAdd=0;

unsigned long int Next_BlockAdd=0;

unsigned int Block=0;

//每次写入16字节,Flag_16Num为256时,写满一个块

Next_BlockAdd=(Next_Block<<12)+16*Flag_16Num;

Write_Byte_Cont(Next_BlockAdd,Table,16);

Flag_16Num++;

//当写满一个块时,查询下一块,并写入Next_Block_MuluAdd这个地址,然后向下一空块继续写入数据

if(Flag_16Num==256)

{

Flag_16Num=0;

Next_Block_MuluAdd=(Block_MuluNow<<12)+3072+Next_Block*2;

Block=Search_Block();

if(Block==512)return;

else Next_Block=Block;

Table_Block[Next_Block/8] |=0x0001<<((Next_Block%8)*2);

Write_Byte(Next_Block_MuluAdd,(Next_Block&0xff00)>>8);

Write_Byte(Next_Block_MuluAdd+1,Next_Block&0xff);

}

//如果是向末块,即512写入,就写如512,表示用完

if(Flag_Key12)

{

if(Flag_16Num!=0)

Next_Block_MuluAdd=(Block_MuluNow<<12)+3072+Next_Block*2;

Write_Byte(Next_Block_MuluAdd,0x02);

Write_Byte(Next_Block_MuluAdd+1,0x00);

Flag_16Num=0;

}

}

//搜寻空块

unsigned int Search_Block()

{

unsigned char i=0;

unsigned char num=block_n-1;  //block_n记录当前操作Table_Block字节的下一字节

//即返回操作块的标号

for(i=0;i<8;i++)

{

if(Table_Block_1[i]==0)

{

Table_Block_1[i]=3;

return num*8+i;

}

}

num=Search_Table();

for(i=0;i<8;i++)

{

if(Table_Block_1[i]==0)

{

Table_Block_1[i]=3;

return num*8+i;

}

}

return  512;

}

//搜寻Table_Block中的空块,并展开到Table_Block_1

unsigned int Search_Table()

{

unsigned char num=0;

unsigned char i=0;

unsigned char Flag_0=0;

for(num=block_n;num<64;num++)

{

for(i=0;i<8;i++)

{

Table_Block_1[i]=(Table_Block[num]>>(i*2))&0x0003;

if(Table_Block_1[i]==0) Flag_0=1; //只要有一个空块,Flag_0就为1

}

if(Flag_0==1)

{

block_n=num+1;          //操作block_n指向下一要操作的8个块,即

if(block_n==64)block_n=0;    //Table_Block对应的下一字节

return num;

}

}

for(num=0;num<block_n;num++)

{

for(i=0;i<8;i++)

{

Table_Block_1[i]=(Table_Block[num]>>(i*2))&0x0003;

if(Table_Block_1[i]==0) Flag_0=1;

}

if(Flag_0==1)

{

block_n=num+1;

if(block_n==64)block_n=0;

return num;

}

}

return 64;

}

//擦除空块

void Flash_DirtyBlock()

{

unsigned int i=0;

unsigned char num=0;

for(num=0;num<64;num++)

{

for(i=0;i<8;i++)

{

if(2==((Table_Block[num]>>(i*2))&0x0003))

{

Block_Erase_4K((num*8+i)<<12);

Table_Block[(num*8+i)/8]&=0xfffc<<(((num*8+i)%8)*2);

}

}

}

}

//把全局变量更新到目录中,

void Process_TableBlock()

{

unsigned char i;

Write_Byte((Block_MuluNow<<12)+1024,Name_Front);

for(i=0;i<64;i++)

{

Write_Byte((Block_MuluNow<<12)+1024+1+i,(Table_Block[i]>>8)&0xff);

}

for(i=0;i<64;i++)

{

Write_Byte((Block_MuluNow<<12)+1024+1+64+i,(Table_Block[i]>>8)&0xff);

}

Write_Byte_Cont((Block_MuluNow<<12)+1024+1+128,Table_Block_1,8);

Write_Byte((Block_MuluNow<<12)+1024+1+128+8,Block_MuluNow);

Write_Byte((Block_MuluNow<<12)+1024+1+128+8+1,Next_Block);

Write_Byte((Block_MuluNow<<12)+1024+1+128+8+2,block_n);

}

//目录更新

//WRITE:把Name_Front中的条目直接复制即可

READ:把Name_Empty记录的条目删除

void Mulu_InformationUpdate(unsigned long int Block_MuluAdd,unsigned char Flag_Write_Read)

{

unsigned char num=0;

unsigned char i=0;

unsigned char SST_Read[7]={0};

if(Flag_Write_Read==WRITE)

{

for(i=0;i<Name_Front;i++)

{

Read_Byte_Cont(Block_MuluAdd+2+i*7,SST_Read,7);

Write_Byte_Cont((Block_MuluNow<<12)+2+i*7,SST_Read,7);

}

}

else if(Flag_Write_Read==READ)

{

for(i=0;i<Name_Front;i++)

{

if(i<Name_Empty)

{

Read_Byte_Cont(Block_MuluAdd+2+i*7,SST_Read,7);

Write_Byte_Cont((Block_MuluNow<<12)+2+i*7,SST_Read,7);

}

else if(i>Name_Empty)

{

Read_Byte_Cont(Block_MuluAdd+2+i*7,SST_Read,7);

Write_Byte_Cont((Block_MuluNow<<12)+2+(i-1)*7,SST_Read,7);

}

}

Name_Front--;

}

for(num=0;num<64;num++)

{

for(i=0;i<8;i++)

{

if(1==(Table_Block[i]>>(i*2))&0x0003)

{

Read_Byte_Cont(Block_MuluAdd+3072+(num*8+i)*2,SST_Read,2);

Write_Byte_Cont((Block_MuluNow<<12)+3072+(num*8+i)*2,SST_Read,2);

}

}

}

//擦出原来的目录,并置位脏块

Block_Erase_4K(Block_MuluAdd);

Table_Block[(Block_MuluAdd>>12)/8]|=0x0002<<(((Block_MuluAdd>>12)%8)*2);

}

经过验证可以使用..

并且读取依靠的是链表,当存储的数据大于一个块时,每个块的末尾存储着下一块的号码,可以继续读写.

时间: 2024-10-18 10:02:58

基于msp430F149管理sst25vf016b存储芯片的文件管理系统的相关文章

11 磁盘存储和系统分区管理 (2)文件管理系统

文件系统 操作系统中负责管理和存储文件信息的软件结 构称为文件管理系统,简称文件系统.它负责为用户建立 文件,存入.读出.修改.转储文件,控制文件的存取,安全控制,日志,压 缩,加密等支持的文件系统:ls /lib/modules/uname -r/kernel/fs内存中加载的那些驱动模块:lsmod 文件系统类型ext2(Extended file system) :适用于那些分区容量不是太大,更新也不频繁的情况, 例如 /boot 分区.ext3:是 ext2 的改进版本,其支持日志功能,

SSM框架基于JAVA的网络文件管理系统

今日思考,完成一个网络文件管理系统项目,需要实现哪些功能?此类项目常见描述如下:现代化的办公系统是帮助人们提高办公效率.规范各项操作的有效工具.基于学校内部局域网的办公环境,设计了B/s结构的网络文件管理系统,提供了常规的文件上传.下载.浏览.在线编辑等功能以及相应的后台管理服务.该系统为学校各部门和各项目组之间的文件往来提供了科学可靠的途径,提高了办事效率.由于使用了B/S结构,该系统在现今成熟的Web环境下可以得到很好的应用.同时,系统简单清晰的界面设计和功能导航使得系统的使用操作方便快捷:

基于SSM的超市进销存管理系统-java进销存管理

基于SSM的超市进销存管理系统-java进销存管理1.包含源程序,数据库脚本.代码和数据库脚本都有详细注释.2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善开发环境:Eclipse ,MYSQL,JDK1.7,Tomcat 7涉及技术点:MVC模式.SpringMvc.Mybatis.Spring.HTML.JavaScript.CSS.JQUERY.DWR.Ajax等系统采用Mybatis框架实现ORM对象关系映射,前台JSP实现,后台springMvc映射,使用Spring框架进行整

文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型

本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如数据结构,格式等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.适合网络传输,提供统一的方法来描述和交换应用程序的结构化数据. 2.CSV文档 CSV文档,以逗号分隔文档内容值,其文件以纯文本形式存储结构数据.CSV文

SpringMVC学习系列(12) 完结篇 之 基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现

到这里已经写到第12篇了,前11篇基本上把Spring MVC主要的内容都讲了,现在就直接上一个项目吧,希望能对有需要的朋友有一些帮助. 一.首先看一下项目结构: InfrastructureProjects:是抽取出的基础项目,主要封装了一些通用的操作. SpringMVC3Demo:就是管理系统所在的项目. WeiXinAPI:是之前做微信管理平台测试时封装一些操作,如果不需要把该项目移除即可. 注:项目的前端UI框架用的是国外的一个基于Bootstrap框架的开发的Demo,如不需要替换为

Lunix磁盘及文件管理系统

Linux磁盘及文件系统管理 CPU,Memory(RAM),I/O I/O:Disks,Ethtercard Disk:持久存储数据 接口类型: IDE(ata):并口,133MB/s SCSI:并口,Ultrascsl320,320MB/s SATA:串口,6gbps SAS:串口,6gbps USB:串口,480MB/s 并口:同一线缆可以接多块设备: IDE:俩个,主,从 SCSI: 宽带:16-1 窄带:8-1 iops:io per second 串口:一个 硬盘:机械硬盘,固态硬盘

[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)

[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date  周六 10 一月 2015 By 钟谢伟 Category website development Tags asp.net / mvc4 相关资源 ibatis manual pro git 廖雪峰的官方网站 BookMS-V1.0 上一篇链接 任务简介 开发工具:VS2010 项目框架:MVC4 浏览器:Chrome 数据库ORM框架:iBatis.net 数据库:mysql 后端开

分享基于EF+MVC+Bootstrap的通用后台管理系统及架构(转)

http://www.cnblogs.com/guozili/p/3496265.html 基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级的缓存模块.日志模块.上传缩略图模块.通用配置及服务调用, 提供了OA.CRM.CMS的原型实例,适合快速构建中小型互联网及行业Web系统,且能作为代码实践及参考,欢迎提出意见. Demo预览 点击在线预览 admin/111111 请勿删数据 Framework 业务无关的底层通用机制及功能 Model基类:提供数据传输和底层的最基本的

基于Servlet+JDBC+Bootstrap+MySQL+AJAX权限管理系统项目实战教程

项目简介 权限系统一直以来是我们应用系统不可缺少的一个部分,若每个应用系统都重新对系统的权限进行设计,以满足不同系统用户的需求,将会浪费我们不少宝贵时间,所以花时间来设计一个相对通用的权限系统是很有意义的.     本系统的设计目标是对应用系统的所有资源进行权限控制,比如应用系统的功能菜单.各个界面等进行权限的操控.技术介绍 · Servlet3.0 Servlet 3.0 作为JavaEE6 规范体系中一员,随着JavaEE6规范一起发布.该版本在前一版本(Servlet2.5)的基础上提供了