ucosii内存管理
1、OS_MemInit
初始化OSMemFreeList列表,将OSMemTbl数组链接成OS_MEM的链,即分成若干分区。后续OSMemCreate使用时从这个链中选取空闲分区free memorypartition。
pmem = OSMemFreeList;
2、OSMemCreate
源码较晦涩,跟踪一下会比较直观,利于理解。下图是调试图。
这里创建了两块内存,intBuffer1和IntBuffer2.
OSMemFreeList起始地址为0x2000452c,在创建完两个内存分区后,OSMemFreeList增加到0x2000455c,其中OSMemFreeList每个元素占用24字节。
而内存区,从0x200016F8开始,这里64字节一个block,可以看到,每个block的起始四字节是next block的地址。这也是OSMemCreate函数中那段代码的作用。
plink = (void **)addr; /* Createlinked list of free memory blocks */
pblk = (INT8U *)addr;
loops = nblks - 1u;
for (i = 0u; i < loops; i++) {
pblk += blksize; /* Pointto the FOLLOWING block */
*plink = (void *)pblk; /* Save pointerto NEXT block in CURRENT block */
plink = (void **)pblk; /* Position to NEXT block */
}
*plink = (void*)0; /* Lastmemory block points to NULL */
3、OSMemGet
pblk = pmem->OSMemFreeList; /* Yes, pointto next free memory block */
pmem->OSMemFreeList = *(void **)pblk; /* Adjust pointer to new free list */
pblk=0x200016B8
pmem->OSMemFreeList = *pblk = 0x200016F8 是0x200016B8内存储的数据,即0x200016F8,将free指针指向下一块内存
4、OSMemPut
与OSMemGet相反,这里是将pmem->freelist指针向前移,同时将本块前四字节置成刚才的pmem->freelist地址。
*(void **)pblk = pmem->OSMemFreeList; /* Insert released block into free blocklist */
pmem->OSMemFreeList =pblk;
总结,内存结构图: