|
小弟初学ucos,如下为ucos内存管理单元中一个函数---创建动态内存分配区函数,后面的注释是小弟自己加的,有的地方理解不通,恳请大神能帮我把这段源码给重新注释下,万分感谢(最好能把我理解有问题的地方给修改下)~~~
OS_MEM *OSMemCreate (
/*创建动态内存分区*/
void *addr, /*内存分区的起始地址*/
INT32U nblks, /*内存分区中内存块的数目*/
INT32U blksize,/*内存块的大小*/
INT8U *err /*错误信息*/
)
{
OS_MEM *pmem;
INT8U *pblk;
void **plink;
INT32U i;
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0
if (err == (INT8U *)0) { /* Validate 'err'错误类型的指针不能为空*/
return ((OS_MEM *)0);
}
if (addr == (void *)0) { /* Must pass a valid address for the memory part.内存分区的起始地址必须有效*/
*err = OS_MEM_INVALID_ADDR;
return ((OS_MEM *)0);
}
if (nblks < 2) { /* Must have at least 2 blocks per partition至少需要2个内存控制块*/
*err = OS_MEM_INVALID_BLKS;
return ((OS_MEM *)0);
}
if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer至少要包含一个指针的内存空间*/
*err = OS_MEM_INVALID_SIZE;
return ((OS_MEM *)0);
}
#endif
OS_ENTER_CRITICAL();
pmem = OSMemFreeList; /*这里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; /* Create linked list of free memory blocks */
pblk = (INT8U *)((INT32U)addr + blksize); /*pblk是一个指针,该指针指向每个内存块的首地址*/
for (i = 0; i < (nblks - 1); i++)
{
*plink = (void *)pblk; /* Save pointer to NEXT block in CURRENT block */
plink = (void **)pblk; /* plink是内存块首地址的指针 */
pblk = (INT8U *)((INT32U)pblk + blksize); /* Point to the FOLLOWING block */
}
*plink = (void *)0; /* 最后一个内存块的指针域为空 */
pmem->OSMemAddr = addr; /* 内存分区的起始地址是addr */
pmem->OSMemFreeList = addr; /* 第一个内存控制块的起始地址也是addr */
pmem->OSMemNFree = nblks; /* 内存分区内当前可用内存块的数目 */
pmem->OSMemNBlks = nblks; /*内存区内总共有的内存块的数目*/
pmem->OSMemBlkSize = blksize; /* 每个内存块的大小*/
*err = OS_NO_ERR;
return (pmem);
}
|
|