OS_MEM *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)
{
#if OS_CRITICAL_METHOD ==3 //分配CPU状态存储寄存器
OS_CPU_SR cpu_sr;
#endif
OS_MEM *pmem;
INT8U *pblk;
Void **plink
INT32U i
#if OS_ARG_CHK_EN>0
If(addr == (void *)0){
*err = OS_MEM_INVALID_ADDR;
return((OS_MEM *)0);
}
If (nblks<2) { //至少要有两个存块
*err = OS_MEM_INVALID_BLKS;
return((OS_MEM *)0);
}
If(blksize < sizeof (void *)){ //必须包含至少一个指针空间
*err = OS_MEM_INVALID_SIZE;
return((OS_MEM *)0);
}
#endif
OS_ENTER_CRITICAL();
pmem = OSMemFreeList; //获取下一个空闲内存分区
If (OSMemFreeList != (OS_MEM *)0){ //判断空闲内存分区池是否为空
OSMemFreeList = (OS_MEM *)OSMemFreeList -> OSMemFreeList;
}
OS_EXIT_CRITICAL();
If(pmem == = (OS_MEM *)0)){ //判断如果已有一个内存分区
*err = OS_MEM_INVALID_PART;
return((OS_MEM *)0);
}
Plink = (void **)addr; //所申请内存起始地址转化为指针
pblk = (INT8U *)addr + blksize; //所申请内存的第二个Block起始地址
for (i = 0 ;i<(nblks - 1); i++){ //依次申请nblks个Block地址,链接成单向链表
*plink = (void *)pblk; //给plink指针赋值,使plink指针指向下一个Block地址
plink = (void **)pblk; //更新指针plink,值为下一Block首地址强制转换成的指针
pblk = pblk + blksize; //更新指针pblk,指向下一个Block首地址
}
*plink =(void *)0;
pmem ->OSMemAddr =addr; //存储内存分区的起始位置
pmem ->OSMemFreeList =addr; //初始化指针指向空闲块
pmem ->OSMemNFree =nblks; //存储空闲块
pmem ->OSMemNBlks =nblks; //块个数
pmem ->OSMemNBlkSize =nblksize; //存储每个内存块的块大小
*err =OS_NO_ERR;
return (pmem);
}
{
#if OS_CRITICAL_METHOD ==3 //分配CPU状态存储寄存器
OS_CPU_SR cpu_sr;
#endif
OS_MEM *pmem;
INT8U *pblk;
Void **plink
INT32U i
#if OS_ARG_CHK_EN>0
If(addr == (void *)0){
*err = OS_MEM_INVALID_ADDR;
return((OS_MEM *)0);
}
If (nblks<2) { //至少要有两个存块
*err = OS_MEM_INVALID_BLKS;
return((OS_MEM *)0);
}
If(blksize < sizeof (void *)){ //必须包含至少一个指针空间
*err = OS_MEM_INVALID_SIZE;
return((OS_MEM *)0);
}
#endif
OS_ENTER_CRITICAL();
pmem = OSMemFreeList; //获取下一个空闲内存分区
If (OSMemFreeList != (OS_MEM *)0){ //判断空闲内存分区池是否为空
OSMemFreeList = (OS_MEM *)OSMemFreeList -> OSMemFreeList;
}
OS_EXIT_CRITICAL();
If(pmem == = (OS_MEM *)0)){ //判断如果已有一个内存分区
*err = OS_MEM_INVALID_PART;
return((OS_MEM *)0);
}
Plink = (void **)addr; //所申请内存起始地址转化为指针
pblk = (INT8U *)addr + blksize; //所申请内存的第二个Block起始地址
for (i = 0 ;i<(nblks - 1); i++){ //依次申请nblks个Block地址,链接成单向链表
*plink = (void *)pblk; //给plink指针赋值,使plink指针指向下一个Block地址
plink = (void **)pblk; //更新指针plink,值为下一Block首地址强制转换成的指针
pblk = pblk + blksize; //更新指针pblk,指向下一个Block首地址
}
*plink =(void *)0;
pmem ->OSMemAddr =addr; //存储内存分区的起始位置
pmem ->OSMemFreeList =addr; //初始化指针指向空闲块
pmem ->OSMemNFree =nblks; //存储空闲块
pmem ->OSMemNBlks =nblks; //块个数
pmem ->OSMemNBlkSize =nblksize; //存储每个内存块的块大小
*err =OS_NO_ERR;
return (pmem);
}