OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4572|回复: 3

FreeRTOS内存管理 heap2的疑问

[复制链接]

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-8-2 16:40:18 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 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]


求大神解答

最佳答案

查看完整内容[请看2#楼]

while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) { pxPreviousBlock = pxBlock; pxBlock = pxBlock->pxNextFreeBlock; } 条件是:如果空闲块小于所需的大小 并且 下一个空闲块不为NULL 你只盯着( pxBlock->xBlockSize < xWantedSize )看,当然会认为永远困在死循环。 其实,因为没有合适的大小可以分配,( pxBlock->pxNextFreeBlock != NULL )实际上会在最后一个空闲块上变为FA ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2076
金钱
2076
注册时间
2014-12-19
在线时间
709 小时
发表于 2018-8-2 16:40:19 | 显示全部楼层
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,没有成功分配内存。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-8-3 01:59:35 | 显示全部楼层
帮顶
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
 楼主| 发表于 2018-8-3 09:22:53 | 显示全部楼层
lvehe 发表于 2018-8-2 16:40
while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) )
{
        pxPrevio ...

明白了,谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 23:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表