⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flashbufoper.c

📁 FlashROM的存储控件操作源代码
💻 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 + -