📄 flashbufoper.c
字号:
#include "FlashBufOper.h"
#include "stdio.h"
#include "alloc.h"
static TSectorOper s_TSectorOperQueue; //定义的的缓冲区结构
static INT8U byUsedBufNum; //记录申请的缓冲区个数
static BOOLEAN bBufSpaceExcessive; //记录是否缓冲区过大
/*******************************************************************************
函数名: ReFreshBuf
描 述: 更新缓冲区数据
输 入: pInput 更新数据存放地址
pFlashBuf 缓冲区地址
wAddOff 缓冲区内的偏移地址
wSize 更新个数
输 出: 无
返回值: 无
*******************************************************************************/
void ReFreshBuf(INT8U *pInput,INT8U *pFlashBuf,INT8U byAddOff,INT16U wSize)
{
INT16U index;
for(index = 0; index < wSize; index++)
{
*(pFlashBuf + byAddOff + index) = *(pInput + index);
}
}
/*******************************************************************************
函数名: FlashBufOper
描 述: 用户调用建立flash缓冲区,并更新缓冲区数据
输 入: wAddrOffset flash偏移地址,从串口解析得到
bySize 要写入flash数据个数
pbyInputCode 新数据存放地址
输 出: 无
返回值: BOOLEAN型,成功返回TRUE,错误返回FALSE
备注: 1.缓冲区从实际flash中映射建立,这里以256字节作为一个缓冲区单位大小
2.若申请动态内存建立的缓冲区过多,回调用户传入的满处理函数,若处理后缓冲
区空闲,则继续实现功能,否则返回FALSE
3.满处理函数可根据文件提供的接口函数实现,如ReFreshFlashMem更新flash,
FreeBufMem()释放缓冲区内存,IsBufSpaceTooMuch()察看缓冲区是否已满;
*******************************************************************************/
BOOLEAN FlashBufOper(INT32U dwAddrOffset, INT8U bySize, INT8U *pbyInputCode,BOOLEAN (*pfBufFullProcess)())
{
INT16U wOperSectorNum;
INT32U dwAddStart;
INT16U wReFreshNum;
INT8U byReFreshOffAdd;
INT8U byStructIndexNum;
INT8U index;
INT8U byNewSize;
wOperSectorNum = dwAddrOffset / FLASH_BUF_SIZE; //要操作flash中的序号
/*新方法*/
if(wOperSectorNum != (dwAddrOffset + bySize - 1) / FLASH_BUF_SIZE)
{
byNewSize = (wOperSectorNum + 1) * FLASH_BUF_SIZE - dwAddrOffset;
if(!FlashBufOper(dwAddrOffset,byNewSize,pbyInputCode,pfBufFullProcess))
{
return FALSE;
}
dwAddrOffset = dwAddrOffset + byNewSize;
if(!FlashBufOper(dwAddrOffset,bySize - byNewSize,pbyInputCode + byNewSize,pfBufFullProcess))
{
return FALSE;
}
}
else
{
for(index = 0;index < MAX_BUF_NUM;index++)
{
if(s_TSectorOperQueue.SequenceNum[index] == wOperSectorNum)
{
byStructIndexNum = index;
break;
}
}
if(index == MAX_BUF_NUM)
{
if(bBufSpaceExcessive == FALSE)
{
byStructIndexNum = byUsedBufNum;
s_TSectorOperQueue.SequenceNum[byStructIndexNum] = wOperSectorNum;
}
if(bBufSpaceExcessive == TRUE)
{
if(pfBufFullProcess != NULL)
{
(*pfBufFullProcess)();
if(bBufSpaceExcessive == TRUE)
{
return FALSE;
}
}
else
{
return FALSE;
}
}
}
switch (s_TSectorOperQueue.OperStyle[byStructIndexNum])
{
case SECTOR_OPER_NONE:
{
s_TSectorOperQueue.pSectorBuf[byStructIndexNum] = (INT8U *)calloc(FLASH_BUF_SIZE, 1);
byUsedBufNum++;
dwAddStart = dwAddrOffset / FLASH_BUF_SIZE * FLASH_BUF_SIZE;
FlashRead(dwAddStart,FLASH_BUF_SIZE,s_TSectorOperQueue.pSectorBuf[byStructIndexNum]);
/*更新缓冲区*/
byReFreshOffAdd = dwAddrOffset - dwAddStart;
wReFreshNum = bySize;
ReFreshBuf(pbyInputCode,s_TSectorOperQueue.pSectorBuf[byStructIndexNum],
byReFreshOffAdd,wReFreshNum);
s_TSectorOperQueue.OperStyle[byStructIndexNum] = SECTOR_OPER_READIN;
}
break;
case SECTOR_OPER_READIN:;
case SECTOR_OPER_READOUT:
{
/*更新缓冲区*/
byReFreshOffAdd = dwAddrOffset - dwAddrOffset / FLASH_BUF_SIZE * FLASH_BUF_SIZE;
wReFreshNum = bySize;
ReFreshBuf(pbyInputCode,s_TSectorOperQueue.pSectorBuf[byStructIndexNum],
byReFreshOffAdd,wReFreshNum);
s_TSectorOperQueue.OperStyle[byStructIndexNum] = SECTOR_OPER_READIN;
}
break;
}
}
/*若申请的内存空间过多,标志赋值,之后不可在申请新内存*/
if (byUsedBufNum >= MAX_BUF_NUM)
{
bBufSpaceExcessive = TRUE;
}
return TRUE;
}
/*******************************************************************************
函数名: IsBufSpaceTooMuch
描 述: 用户调用察看是否缓冲区过大
输 入: 无
输 出: 无
返回值: BOOLEAN型,若多大,返回TRUE;若没有过大,返回FALSE
*******************************************************************************/
BOOLEAN IsBufSpaceTooMuch()
{
return bBufSpaceExcessive;
}
/*******************************************************************************
函数名: FreeBufMem
描 述: 用户调用释放缓冲区内存
输 入: bySequenceNum 缓冲区序号,即0,1,2,。。。
输 出: 无
返回值: 无
*******************************************************************************/
void FreeBufMem(INT8U bySequenceNum)
{
if(s_TSectorOperQueue.pSectorBuf[bySequenceNum]!= NULL)
{
free(s_TSectorOperQueue.pSectorBuf[bySequenceNum]);
s_TSectorOperQueue.pSectorBuf[bySequenceNum] = NULL;
s_TSectorOperQueue.OperStyle[bySequenceNum] = SECTOR_OPER_NONE;
byUsedBufNum--;
}
if(byUsedBufNum < MAX_BUF_NUM)
{
bBufSpaceExcessive = FALSE;
}
}
/*******************************************************************************
函数名: TotalBufNum
描 述: 用户察看申请的缓冲区个数
输 入: 无
输 出: 无
返回值: INT8U型,为申请的缓冲区个数
*******************************************************************************/
INT8U TotalBufNum()
{
return byUsedBufNum;
}
/*******************************************************************************
函数名: ReFreshFlashMem
描 述: 用户调用得到新的flash数据
输 入: 无
输 出: pdwFlashStartAddr 缓冲区映射到flash起始地址
返回值: INT8S *型, 对应缓冲区的地址,大小由宏定义FLASH_BUF_SIZE
确定;若缓冲区内数据已全部读出,返回NULL
*******************************************************************************/
INT8S *ReFreshFlashMem(INT32U *pdwFlashStartAddr)
{
INT8U index;
INT8U temp;
INT8U bySequenceNum;
for(index = 0;index < MAX_BUF_NUM;index++)
{
if(s_TSectorOperQueue.OperStyle[index] == SECTOR_OPER_READIN)
{
bySequenceNum = s_TSectorOperQueue.SequenceNum[index];
temp = index;
break;
}
}
if(index != MAX_BUF_NUM)
{
for(index = index + 1;index < MAX_BUF_NUM;index++)
{
if(s_TSectorOperQueue.OperStyle[index] == SECTOR_OPER_READIN)
{
if(s_TSectorOperQueue.SequenceNum[index] < bySequenceNum)
{
bySequenceNum = s_TSectorOperQueue.SequenceNum[index];
temp = index;
}
}
}
*pdwFlashStartAddr = bySequenceNum * FLASH_BUF_SIZE;
s_TSectorOperQueue.OperStyle[temp] = SECTOR_OPER_READOUT;
return s_TSectorOperQueue.pSectorBuf[temp];
}
else
{
return NULL;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -