*err=OS_MEM_INVALID_SIZE;
return((OS_MEM*)0);
}
#endif
OS_ENTER_CRITICAL();
pmem=OSMemFreeList; /*Getnextfreememorypartition 得到下一个未使用的内存分区*/
if(OSMemFreeList!
=(OS_MEM*)0){ /*Seeifpooloffreepartitionswasempty 查看是否有未使用的分区空间是空的*/
OSMemFreeList=(OS_MEM*)OSMemFreeList->OSMemFreeList;
}
OS_EXIT_CRITICAL();
if(pmem==(OS_MEM*)0){ /*Seeifwehaveamemorypartition 查看是否我们有一个内存分区*/
*err=OS_MEM_INVALID_PART;
return((OS_MEM*)0);
}
plink=(void**)addr; /*Createlinkedlistoffreememoryblocks 创建未使用的内存块的可连接的列表*/
pblk =(INT8U*)addr+blksize;
for(i=0;i<(nblks-1);i++){
*plink=(void*)pblk;
plink =(void**)pblk;
pblk =pblk+blksize;
}
*plink =(void*)0; /*LastmemoryblockpointstoNULL 最后的内存块指针指向NULL*/
pmem->OSMemAddr =addr; /*Storestartaddressofmemorypartition 保存内存分区的起始地址*/
pmem->OSMemFreeList=addr; /*Initializepointertopooloffreeblocks 为未使用的内存块初始化指针*/
pmem->OSMemNFree =nblks; /*StorenumberoffreeblocksinMCB 在内存控制块中保存许多未使用的内存块*/
pmem->OSMemNBlks =nblks;
pmem->OSMemBlkSize =blksize; /*Storeblocksizeofeachmemoryblocks 保存每个内存块的块大小*/
*err =OS_NO_ERR;
return(pmem);
}
/*$PAGE*/
/*
*********************************************************************************************************
* 得到一个内存控制块
*
*说明 :
从分区中得到一个内存块
*
*参数 :
pmem 指针指向一个内存分区控制块
*
* err 指向一个变量包含一个错误信息,这个错误信息通过这个函数或其他来设计
*
* OS_NO_ERR 假如内存分区被正确的创建.
* OS_MEM_NO_FREE_BLKS假如没有更多的内存块被分配给调用者
* OS_MEM_INVALID_PMEM假如已经为'pmem'通过一个空指针
*
*返回值 :
一个指针指向一个内存控制块,假如没有察觉错误
* 一个指针指向空指针,假如有错误被察觉到
*********************************************************************************************************
*/
void *OSMemGet(OS_MEM*pmem,INT8U*err)
{
#ifOS_CRITICAL_METHOD==3 /*AllocatestorageforCPUstatusregister 为CPU状态寄存器分配存储空间 */
OS_CPU_SR cpu_sr;
#endif
void *pblk;
#ifOS_ARG_CHK_EN>0
if(pmem==(OS_MEM*)0){ /*Mustpointtoavalidmemorypartition 必须指向一个有效的内存分区 */
*err=OS_MEM_INVALID_PMEM;
return((OS_MEM*)0);
}
#endif
OS_ENTER_CRITICAL();
if(pmem->OSMemNFree>0){ /*Seeifthereareanyfreememoryblocks 查看是否有其他未使用的内存块*/
pblk =pmem->OSMemFreeList; /*Yes,pointtonextfreememoryblock 是的,指针指向下一个未使用的内存块*/
pmem->OSMemFreeList=*(void**)pblk; /* Adjustpointertonewfreelist 调整指针指向一个新的未使用的空间列表*/
pmem->OSMemNFree--; /* Onelessmemoryblockinthispartition 在这个分区中减少一个内存块*/
OS_EXIT_CRITICAL();
*err=OS_NO_ERR; /* Noerror 没有错误*/
return(pblk); /* Returnmemoryblocktocaller 返回内存控制块给调用者*/
}
OS_EXIT_CRITICAL();
*err=OS_MEM_NO_FREE_BLKS; /*No, Notifycallerofemptymemorypartition 告知调用者是空的内存分区*/
return((void*)0); /* ReturnNULLpointertocaller 返回NULL个调用者*/
}
/*$PAGE*/
/*
*********************************************************************************************************
* 释放一个内存块
*
*说明 :
返回一个内存块给分区
*
*参数 :
pmem 指针指向内存分区控制块
*
* pblk 指针指向被保留的内存块.
*
*返回值 :
OS_NO_ERR 假如内存块是被插入的分区
* OS_MEM_FULL 假如返回一个已经全部内存分区的内存块
* (你释放了更多你分配的内存块!
)
* OS_MEM_INVALID_PMEM 假如指针'pmem'指向NULL。
* OS_MEM_INVALID_PBLK 假如指向释放的内存块为空.
*********************************************************************************************************
*/
INT8U OSMemPut(OS_MEM *pmem,void*pblk)
{
#ifOS_CRITICAL_METHOD==3 /*AllocatestorageforCPUstatusregister 为CPU状态寄存器分配存储空间 */
OS_CPU_SR cpu_sr;
#endif
#ifOS_ARG_CHK_EN>0
if(pmem==(OS_MEM*)0){ /*Mustpointtoavalidmemorypartition 必须指向一个有效的内存分区 */
return(OS_MEM_INVALID_PMEM);
}
if(pblk==(void*)0){ /*Mustreleaseavalidblock 必须保留一个有效的内存块 */
return(OS_MEM_INVALID_PBLK);
}
#endif
OS_ENTER_CRITICAL();
if(pmem->OSMemNFree>=pmem->OSMemNBlks){ /*Makesureallblocksnotalreadyreturned 确认所有的内存块没有已经返回 */
OS_EXIT_CRITICAL();
return(OS_MEM_FULL);
}
*(void**)pblk =pmem->OSMemFreeList; /*Insertreleasedblockintofreeblocklist 将释放的内存块插入未使用的内存块表 */
pmem->OSMemFreeList=pblk;
pmem->OSMemNFree++; /*Onemorememoryblockinthispartition 在分区中增加一个内存块 */
OS_EXIT_CRITICAL();
return(OS_NO_ERR); /*Notifycallerthatmemoryblockwasreleased 告知调用者内存块被释放 */
}
/*$PAGE*/
/*
*********************************************************************************************************
* 查询内存分区
*
*说明:
这个函数被使用来查询在内存分区中已经使用的内存块数及尚未使用的内存数
*
*
*参数 :
pmem 指针指向一个内存分区控制块
*
* pdata 指针指向一个结构体,该结构体包含关于内存分区的信息
*
*返回值 :
OS_NO_ERR 假如没有错误发生.
* OS_MEM_INVALID_PMEM 假如指针'pmem'指向NULL。
* OS_MEM_INVALID_PDATA假如指向释放的内存块为空.
*********************************************************************************************************
*/
#ifOS_MEM_QUERY_EN>0
INT8U OSMemQuery(OS_MEM*pmem,OS_MEM_DATA*pdata)
{
#ifOS_CRITICAL_METHOD==3 /*AllocatestorageforCPUstatusregister 为CPU状态寄存器分配存储空间 */
OS_CPU_SR cpu_sr;
#endif
#ifOS_ARG_CHK_EN>0
if(pmem==(OS_MEM*)0){ /*Mustpointtoavalidmemorypartition 必须指向一个有效的内存分区 */
return(OS_MEM_INVALID_PMEM);
}
if(pdata==(OS_MEM_DATA*)0){ /*Mustreleaseavalidstorageareaforthedata 为这些数据必须释放一个有效的存储区域 */
return(OS_MEM_INVALID_PDATA);
}
#endif
OS_ENTER_CRITICAL();
pdata->OSAddr =pmem->OSMemAddr;
pdata->OSFreeList=pmem->OSMemFreeList;
pdata->OSBlkSize =pmem->OSMemBlkSize;
pdata->OSNBlks =pmem->OSMemNBlks;
pdata->OSNFree =pmem->OSMemNFree;
OS_EXIT_CRITICAL();
pdata->OSNUsed =pdata->OSNBlks-pdata->OSNFree;
return(OS_NO_ERR);
}
#endif /*OS_MEM_QUERY_EN */
/*$PAGE*/