OpenEdv-开源电子网

标题: FreeRTOS内存管理 heap2的疑问 [打印本页]

作者: a3748622    时间: 2018-8-2 16:40
标题: FreeRTOS内存管理 heap2的疑问
本帖最后由 a3748622 于 2018-8-2 16:42 编辑

今天看到heap2的内存管理代码

发现一个问题,程序如下


[mw_shl_code=applescript,true]if( ( xWantedSize > 0 ) && ( xWantedSize < configADJUSTED_HEAP_SIZE ) )
                {
                        //头结点开始遍历现存的结点,找到满足空闲内存大于或等于xWantedSize的结点
                        pxPreviousBlock = &xStart;
                        pxBlock = xStart.pxNextFreeBlock;
                        while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
                        {
                                pxPreviousBlock = pxBlock;
                                pxBlock = pxBlock->pxNextFreeBlock;
                        }[/mw_shl_code]


configADJUSTED_HEAP_SIZE是总的空闲内存的数量
xFreeBytesRemaining是剩余的空闲内存的数量

假设configADJUSTED_HEAP_SIZE = 10KB
                 xFreeBytesRemaining = 2KB

那我申请5KB内存,也就是xWantedSize = 5KB

程序不是进入以下死循环了吗?
[mw_shl_code=applescript,true]while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
                        {
                                pxPreviousBlock = pxBlock;
                                pxBlock = pxBlock->pxNextFreeBlock;
                        }[/mw_shl_code]


求大神解答


作者: lvehe    时间: 2018-8-2 16:40
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
{
        pxPreviousBlock = pxBlock;
        pxBlock = pxBlock->pxNextFreeBlock;
}
条件是:如果空闲块小于所需的大小 并且 下一个空闲块不为NULL
你只盯着( pxBlock->xBlockSize < xWantedSize )看,当然会认为永远困在死循环。
其实,因为没有合适的大小可以分配,( pxBlock->pxNextFreeBlock != NULL )实际上会在最后一个空闲块上变为FALSE,
即pxBlock->pxNextFreeBlock指向NULL。
在下一句if( pxBlock != &xEnd )判断中,由于pxBlock ==&xEnd,所以pvReturn仍为NULL,即pvPortMalloc最终返回NULL,没有成功分配内存。
作者: 正点原子    时间: 2018-8-3 01:59
帮顶
作者: a3748622    时间: 2018-8-3 09:22
lvehe 发表于 2018-8-2 16:40
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
{
        pxPrevio ...

明白了,谢了




欢迎光临 OpenEdv-开源电子网 (http://www.openedv.com:80/) Powered by Discuz! X3.4