虽然 EEPROM 相对 Flash 读写速度更慢,但 EEPROM 一些独有特性是 Flash 无法实现的,比如字节读写操作。
所以,EEPROM至今依然应用在很多电子设备上,而且市场还不小。 这里就给大家分享一款EEPROM轻量级的简易类文件的数据读写库:EEPROMFS
1 关于EEPROMFS
EEPROMFS,基于EEPROM的简易类文件的数据读写库,方便做动态功能增减时参数管理。 增减参数块类似增减文件,不会对已有数据存储带来影响。EEPROM硬件资源充裕的情况下使用。 开源地址: https://gitee.com/wtau_zaozao/eepromfs
2 使用说明和软件架构 开源库使用说明: 基于 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
全部0条评论
快来发表一下你的评论吧 !