电子产业一站式赋能平台

PCB联盟网

搜索
查看: 22|回复: 0
收起左侧

分享一款EEPROM简易类文件的数据读写库

[复制链接]

585

主题

585

帖子

7218

积分

高级会员

Rank: 5Rank: 5

积分
7218
发表于 昨天 11:45 | 显示全部楼层 |阅读模式
关注+星标公众,不错过精彩内容
作者 | zzao
来源 | Gitee

虽然 EEPROM 相对 Flash 读写速度更慢,但 EEPROM 一些独有特性是 Flash 无法实现的,比如字节读写操作。
所以,EEPROM至今依然应用在很多电子设备上,而且市场还不小。
这里就给大家分享一款EEPROM轻量级的简易类文件的数据读写库:eepromfs
关于eepromfs
eepromfs,基于EEPROM的简易类文件的数据读写库,方便做动态功能增减时参数管理。

增减参数块类似增减文件,不会对已有数据存储带来影响。EEPROM硬件资源充裕的情况下使用。

开源地址:https://gitee.com/wtau_zaozao/eepromfs

drv5cnih5kx64020359945.png

drv5cnih5kx64020359945.png


使用说明和软件架构
开源库使用说明:
基于 Arm 处理器,EEPROM存储,比如24C256、24c512之类的相对较大一点容量的EEPROM存储芯片。

软件架构:
EPPROM存储区开头存储eepromfs管理相关信息,采用链表方式串联每一个文件,每个文件建立的时候指定名称和大小,新增加的文件自动追加在链表末尾。
  • typedef struct deepromfs_s{    eeprom_handle_t *handle;        la_t startAddr1;    efs_size_t size1;        la_t startAddr2;    efs_size_t size2;}deepromfs_t;static deepromfs_t deepromfs;
  • eepromfs_result_t deepromfs_init(eeprom_handle_t *handle,la_t startAddr,efs_size_t size){    eepromfs_result_t eepromfs_result1;    eepromfs_result_t eepromfs_result2;
        //初始化    deepromfs.handle=handle;    deepromfs.startAddr1=startAddr;    deepromfs.size1=size/2;    deepromfs.startAddr2=deepromfs.startAddr1+deepromfs.size1;    deepromfs.size2=size/2;
        eepromfs_result1=eepromfs_init(deepromfs.handle,deepromfs.startAddr1);    eepromfs_result2=eepromfs_init(deepromfs.handle,deepromfs.startAddr2);    if((eepromfs_result1==EFR_OK)&&(eepromfs_result2==EFR_OK))    {        return EFR_OK;    }    else if((eepromfs_result1==EFR_OK)&&(eepromfs_result2!=EFR_OK))    {        //拷贝分区1数据到分区2        eepromfs_copy(deepromfs.handle,deepromfs.startAddr2,deepromfs.startAddr1,deepromfs.size1);        return EFR_OK;    }    else if((eepromfs_result1!=EFR_OK)&&(eepromfs_result2==EFR_OK))    {        //拷贝分区2数据到分区1        eepromfs_copy(deepromfs.handle,deepromfs.startAddr1,deepromfs.startAddr2,deepromfs.size2);        return EFR_OK;    }    else if((eepromfs_result1==EFR_CRC_INFO_ERR)&&(eepromfs_result2==EFR_CRC_INFO_ERR))    {        return EFR_CRC_INFO_ERR;    }    return EFR_ERR;}eepromfs_result_t deepromfs_format_quick(void){    eepromfs_result_t eepromfs_result;        eepromfs_result=eepromfs_init(deepromfs.handle,deepromfs.startAddr1);    if(eepromfs_result!=EFR_OK)    {        return eepromfs_result;    }        if(eepromfs_format_quick()!=EFR_OK)    {        return eepromfs_result;    }
        eepromfs_result=eepromfs_init(deepromfs.handle,deepromfs.startAddr2);    if(eepromfs_result!=EFR_OK)    {        return eepromfs_result;    }        eepromfs_result=eepromfs_format_quick();    if(eepromfs_result!=EFR_OK)    {        return eepromfs_result;    }        return EFR_OK;}
    提供各类格式化、读、写、删除的函数接口,方便用户直接调用:
  • eepromfs_result_t eepromfs_init(eeprom_handle_t *handle,la_t startAddr);eepromfs_result_t eepromfs_format_quick(void);//格式化不改变大小eepromfs_result_t eepromfs_format_full(la_t startAddr,efs_size_t size);//格式化并重新指定大小
    eepromfs_result_t eepromfs_new(file_handle_t *fh,const char* filename,efs_size_t fileSize);eepromfs_result_t eepromfs_open(file_handle_t *fh,const char* filename);eepromfs_result_t eepromfs_close(file_handle_t* fh);eepromfs_result_t eepromfs_write(file_handle_t* fh, const fdata_t* data, efs_size_t size);eepromfs_result_t eepromfs_offsetWrite(file_handle_t* fh,la_t offSet,const fdata_t* data, efs_size_t size);eepromfs_result_t eepromfs_read(file_handle_t* fh, fdata_t* buf,efs_size_t bufLen,efs_size_t *pFilesize);eepromfs_result_t eepromfs_delete(const char* filename);eepromfs_result_t eepromfs_copy(eeprom_handle_t *handle,la_t destAddr,la_t srcAddr,efs_size_t size);
    总体而言,这个库相对比较轻量级,普通ARM 单片机运行完全没有压力,具体源码,可以参看:https://gitee.com/wtau_zaozao/eepromfs
    ------------ END ------------

    ●专栏《嵌入式工具
    ●专栏《嵌入式开发》
    ●专栏《Keil教程》
    ●嵌入式专栏精选教程

    关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
    点击“阅读原文”查看更多分享。
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表