/**** 模拟rom储存器 ****/
/*****************************************************************************************
rom储存器
文 件:rom.h
功 能: 实现ROM储存器
实现方式:在硬盘储存二进制文件。
编 者:张永辉 2013年4月17日 整理
*****************************************************************************************/
#ifndef __ROM_H_
#define __ROM_H_
#include "\embed\source\lib\basetype.h"
//****************************************************************************************
//参数配置
#define filename "\\embed\\vs2008\\dirvers\\prom.bin"
#define ROM_SIZE 1*(1024)*1024 //总容量 1M字节
//****************************************************************************************
//函数声明
void RomTest(void);
void RomInit(void);
u32 RomSizeGet(void);
u32 RomRead (unsigned int eeaddr,unsigned char* Buffer,unsigned int len);
u32 RomWrite(unsigned int eeaddr,unsigned char* Buffer,unsigned int len);
//****************************************************************************************
#endif
/*****************************************************************************************
rom模拟储存器
文 件:rom.c
功 能: 模拟ROM储存器
实现方式:在硬盘储存二进制文件。
*****************************************************************************************/
#include <windows.h>
#include <process.h>
#include "stdio.h"
#include "rom.h" //#include "\embed\vs2008\dirvers\rom.h"
/*****************************************************************************************
测试
*****************************************************************************************/
void RomTest(void)
{
char a[]="abc4567890";
char b[100];
RomInit();
RomWrite(0,a,10);
RomWrite(10,a,10);
RomRead(0,b,22);
}
/*****************************************************************************************
获取ROM大小
*****************************************************************************************/
u32 RomSizeGet(void)
{
return ROM_SIZE;
}
/*****************************************************************************************
rom读出数据
参数:eeaddr 0--INT_MAX
Buffer 装载数据指针
len 读出的长度
返回:成功读到的数目
*****************************************************************************************/
u32 RomRead(unsigned int eeaddr,unsigned char* Buffer,unsigned int len)
{
FILE *fp;
//读写打开,不存在则失败
fopen_s(&fp,filename,"rb+");
if(fp==NULL)
{
return 0;
}
//超出范围则
if(eeaddr>=ROM_SIZE)
{
return 0;
}
if((eeaddr + len) >= ROM_SIZE)
{
len = ROM_SIZE - eeaddr;
}
//设置位置fseek(文件,要到的文件位置,起始位置)
fseek(fp,eeaddr,0);
fread(Buffer,1,len,fp); //读出数据
fclose(fp);
return len;
}
/*****************************************************************************************
rom写入数据
参数:eeaddr 0--INT_MAX
Buffer 写入数据指针
len 要写入的长度
返回:成功写入的个数
*****************************************************************************************/
u32 RomWrite(unsigned int eeaddr,unsigned char* Buffer,unsigned int len)
{
FILE *fp;
//读写打开,不存在则失败
fopen_s(&fp,filename,"rb+");
if(fp==NULL)
{
return 0;
}
if(eeaddr>=ROM_SIZE) //超出范围
{
return 0;
}
if((eeaddr + len) >= ROM_SIZE)
{
len = ROM_SIZE - eeaddr;
}
//设置位置fseek(文件,要到的文件位置,起始位置)
fseek(fp,eeaddr,0);
fwrite(Buffer,1,len,fp); //写入数据
fclose(fp);
return len;
}
/*****************************************************************************************
rom初始化
初 始 化:若文件存在并且大小与预期相符,则直接返回。
若文件不存在,或大小不相符则新建文件,并初始化其内容。
说 明:此函数总能执行成功。
*****************************************************************************************/
void RomInit(void)
{
FILE *fp;
u32 i;
char tmp[10];
fopen_s(&fp,filename,"rb"); //文件不存在,则打开失败
if(fp!=NULL)
{
//则判断文件大小
fseek (fp,0,SEEK_END);
i = ftell(fp);
if(i==ROM_SIZE)
{
//大小相符,直接返回。
fclose(fp);
return;
}
//大小不等则删除文件。然后创建并初始化文件
fclose(fp);
remove(filename);
}
Sleep(10);
//不存在文件则新建二进制文件
fopen_s(&fp,filename,"wb"); //打开失败原因之一是:文件路径写法有问题
if(fp==NULL)
{
return; //文件打开失败
}
//初始化1页的数据 全写入0XFF
tmp[0]=0xFF;
//写入N页
for(i=0;i<ROM_SIZE;i++)
{
fwrite(tmp,1,1,fp);
}
fclose(fp);
}