FreeRTOS heap4

Init:

c 复制代码
xStart.pxNextFreeBlock = ( void * ) uxStartAddress;
xStart.xBlockSize = ( size_t ) 0;

pxEnd= uxStartAddress + xTotalHeapSize - xHeapStructSize
pxEnd->xBlockSize = 0;
pxEnd->pxNextFreeBlock = NULL;

pxFirstFreeBlock = uxStartAddress;
pxFirstFreeBlock->xBlockSize = pxEnd - uxStartAddress;
pxFirstFreeBlock->pxNextFreeBlock = pxEnd;

malloc:

c 复制代码
xWantedSize += xHeapStructSize;
pxPreviousBlock = &xStart;
pxBlock = px First FreeBlock; //until first free block
pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; // pxblock 从freeblock list中剔除

pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );//新块位置
pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;//新块尺寸
pxNewBlockLink->pxNextFreeBlock = pxPreviousBlock->pxNextFreeBlock;//新块指向后方链表
pxPreviousBlock->pxNextFreeBlock = pxNewBlockLink;//新块被指向

pxBlock->xBlockSize = xWantedSize;//malloc之后的老块尺寸更新

heapALLOCATE_BLOCK( pxBlock );//标记为被使用

Free

c 复制代码
puc = ( uint8_t * ) pv; puc -= xHeapStructSize;
pxLink = ( void * ) puc;
heapFREE_BLOCK( pxLink );

//找到第一个freeblock, 记录在pxIterator 
for( pxIterator = &xStart; pxIterator->pxNextFreeBlock < pxBlockToInsert; pxIterator = pxIterator->pxNextFreeBlock ) 

向前合并

c 复制代码
puc = ( uint8_t * ) pxIterator;
if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert ) // 待freeblock 与 前一个freeblock相邻??
	pxIterator->xBlockSize += pxBlockToInsert->xBlockSize; //previous free block直接扩张
	pxBlockToInsert = pxIterator;//变更pxBlockToInsert ,可能还需要与后面的freeblock合并

向后合并

c 复制代码
puc = ( uint8_t * ) pxBlockToInsert;
if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) pxIterator->pxNextFreeBlock ) // 待freeblock 与 后一个freeblock相邻??
 	pxBlockToInsert->xBlockSize += pxIterator->pxNextFreeBlock->xBlockSize; //扩张
            	pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock->pxNextFreeBlock; 指向后面的后面
else
	pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; //不可以向后合并, 那么更新next指针

pxIterator->pxNextFreeBlock = pxBlockToInsert;
相关推荐
兆龙电子单片机设计2 小时前
【STM32项目开源】STM32单片机语音分类垃圾桶-蓝牙APP
stm32·单片机·嵌入式硬件·物联网·开源·自动化·毕业设计
2601_954526752 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
qq_448011162 小时前
C语言中的变量和函数的定义与声明
android·c语言·开发语言
零涂毕业设计3 小时前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
aaaameliaaa5 小时前
指针之总结
c语言·笔记·算法
agathakuan6 小时前
Wireshark 解密並導出TLS 1.2 / TLS 1.3 明文的方法(可控制 Client 端)
c语言·wireshark·ssl·openwrt
caimouse6 小时前
protoc-gen-c 支持 proto3 `optional` 关键字修改记录
c语言·学习
noipp6 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238566 小时前
C/C++每日一练6
c语言·c++·算法
wdfk_prog6 小时前
嵌入式面试真题第 13 题:单硬件 Timer 下的高精度多路软件定时器架构设计
c语言·开发语言·面试·职场和发展·嵌入式