TOUCH日志系统V1.0

本文介绍了一种用于嵌入式系统的日志记录机制,通过快速写入和越界处理策略,确保了日志的高效存储和读取。文章详细描述了日志初始化过程、擦写次数管理和存储位置更新等关键环节。

不是 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();    
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值