不是 EasyFlash
是自己原创的
V1.0是简单的 它表达了自己的设计 但是它没有处理遗憾-----越界以后怎么办(flash写一遍完成以后怎么办)
它给的思路是: 快速写入-----我每次都已经给你准备好了id位置你直接去写入-----这个变量是cnt同时为了解决越界做了easer和他一样的变量 但是它会是5001这样
开始想象:
一块内存
从起始位置开始 一个一个结构体连续的去读
如果读出来的是全OXFF那么就是这个小块儿是空的(没有写入过 OR 写入过后面擦除了)
如果读出来有一个结构体 我就把结构体本身的ID读出来给我自己的i 迭代器
使用原理:
void journal_comp_init(void)
{
flash = &spiflash;
location_open_log_init();
}
主要去完成init 为了快速写入 所以需要拿到id
static uint32_t logEarseCnt = 0;
static uint32_t logEarsePos = 0;
//全部读出来 是全FF就不理会 不是的话就代表是一个日志
//读出来 给全局变量赋值
//openLogType 这是保存进去的每个单元
void location_open_log_init( void )
{
openLogType openLog;
logEarseCnt = 0;
logEarsePos =0;
flash->getlock();
for(int32_t i = 0 ; i < LOG_MAX ; i++)
{
memset(&openLog , 0x00 , sizeof(openLogType));
flash->read(OPEN_LOG_DATA_ADDRE+i*LOG_SIZE , (uint8_t *)&openLog , sizeof(openLogHeardType));
if(is_all0XFF(&openLog , sizeof(openLogHeardType)) != TRUE)
{
logEarseCnt = openLog.hdr.eraseCnt;
logEarsePos = openLog.hdr.cnt;
}
}
flash->setlock();
log(DEBUG,"当前存储日志的flash擦写次数 = %u,当前存储位置 POS=%d \n" , logEarseCnt,logEarsePos);
}
先 是写
static uint32_t logEarseCnt = 0;
static uint32_t logEarsePos = 0;
//封装一个写入API 返回值没有意义
int32_t journal_write(openLogType *openLog)
{
int32_t pos = 0;
location_journal_write_flash(logEarsePos , openLog);
return pos;
}
//真正写入
void location_journal_write_flash(uint32_t pos , openLogType *openLog)
{
uint32_t addr = 0 , page =0;
openLog->hdr.eraseCnt = ++logEarseCnt;
openLog->hdr.cnt = ++logEarsePos;
log(DEBUG,"在%d写入日志, 当前擦写次数=%d,下一次存储位置=%d\n" , pos , logEarseCnt ,logEarsePos);
addr = OPEN_LOG_DATA_ADDRE + pos*LOG_SIZE;
page = addr / FLASH_SPI_BLOCKSIZE;
flash->getlock();
flash->read( page*FLASH_SPI_BLOCKSIZE , fb , FLASH_SPI_BLOCKSIZE);
memcpy(fb + (pos*LOG_SIZE)%FLASH_SPI_BLOCKSIZE , (uint8_t *)openLog, LOG_SIZE);
flash->clearone(page*FLASH_SPI_BLOCKSIZE);
flash->write( page*FLASH_SPI_BLOCKSIZE, fb, FLASH_SPI_BLOCKSIZE);
flash->setlock();
}