查找到合适的内存块之后, 就要决定是否对此内存块进行分割。如果内存块过大的话必然会造成内存的浪费。如果内存块的大小减去要申请的内存块的值大于OSALMEM_MIN_BLKSZ(4byre), 则分割此内存块。并初使化分割出来的内存分配控制块头。
内存的释放:void osal_mem_free( void *ptr ); ptr是指向内存块的指针。 在ptr 的前一个分配单元就是内存分配的控制头。所以内存分配控制头的地址等于ptr减去一个分配单元的长度。(千万不要把指向非osal_mem_alloc申请的内存块的指针赋给osal_mem_free, 它会产生意想不到的错误); 在内存释放函数中,它会调整固定长度分配区域的指针。(它的目的是使指针指向第一个可分配单元,但是在内存申请中没有对指针进行调整,所以它会始终指向的是固定分配的启始地址, 在释放内存函数中没有对可变区域的指针进行调)。
在内存管理中还提供了一些辅助函数, 它由一些宏来控制。
uint16 osal_heap_block_cnt( void );//它返回的是当前分配内存块的数量。
uint16 osal_heap_block_free( void )//它返回的是当前空闲的内存块的数量。
还有几个其它的函数, 不列举了。
总结:
在内存分配中它的得法并不是最好的, 在它的基础上我们可以做适当的调整。在内存分配的函数中我们可以对固定长度分配和不固定长度分配做一些调整。使ff1(指向固定分配区域的指针)始终指向第一个非使用状态的分配单元而不是要固定分配区域的开始处, ff2(非固定长度分配区域指针)也可以像ff1一样做出一些调整。 我们把ff1 和 ff2 都指向的是在它们区域中第一个可以分配的单元, 而不是它们区域的开始处。(还特别注意:千万不要把指向非osal_mem_alloc申请的内存块的指针赋给osal_mem_free, 它会产生意想不到的错误)。
Thanks moolight!!
本文是moolight(QQ :329836790)原创,转载必须保证文章的完整性并标明出处,请尊重作者,支持原创。