vs2008\drivers\rom.h.c__EEPROM存储模拟器

/**** 模拟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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值