ARTICLE · 1093727
FreeRTOS 堆内存管理源码剖析
FreeRTOS 堆内存管理源码剖析
FreeRTOS 释放一块内存,空闲块数量反而变少了。这真不是 bug。
我拿 STM32 跑了趟实验:堆里先切出五块内存,再吃掉尾部。放掉第二、第四小块后,空闲总数涨了,但最大整块从 3680 跌到 32。这时候谁要申请 150 字节,哪怕总空闲够也照样失败——碎片把路堵死了。
真正绝的是第三步。夹在中间那块一释放,空闲块直接从 2 个变成 1 个。因为它压根没作为新块挂进链表,而是直接并进了左边、顺手吞了右边。三个孤岛瞬间粘成一个 176 字节的整块,刚才失败的申请立马成功。
这底气全靠 heap_4 的释放逻辑。它维护着一条按地址排好的空闲链表。释放时先查前邻,再查后邻,物理上挨着的当场合并。每次释放都在拼整块,堆就永远回得到起点。
说白了,它管的不只是“还回来多少”,更是“还能不能凑成一大块”。
原文FreeRTOS 堆内存管理源码剖析:释放一块内存,空闲块数量反而变少了?
作者提示: 个人观点,仅供参考
广东,1小时前,