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);
}