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;
相关推荐
多看多敲多思考3 小时前
华润微CS32ME10 MCU使用教程(2)---CS32ME10之UART串口模块使用
stm32·单片机·嵌入式硬件·mcu
代码中介商3 小时前
银行管理系统的业务血肉 —— 流程、状态机、输入校验与持久化(下篇)
c语言·算法
黑白园4 小时前
STM32系统时钟由72M修改为36M验证示例
stm32·单片机·嵌入式硬件
LCG元4 小时前
基于ARM7的LCD设计与实现:S3C4510B通用IO口控制液晶模块
stm32·单片机·嵌入式硬件
山后太阳4 小时前
Keil5(MDK-ARM)完整下载安装教程+入门教程:从零搭建STM32开发环境
arm开发·stm32·嵌入式硬件
爱编码的小八嘎5 小时前
C语言完美演绎9-12
c语言
Ww.xh5 小时前
STM32按键去抖动软件实现详解
stm32·单片机·嵌入式硬件
ghie90906 小时前
基于STM32的CAN通信完整例程(HAL库实现)
stm32·单片机·嵌入式硬件
lzj_pxxw6 小时前
W25Q64存储芯片 软件设计刚需常识
stm32·单片机·嵌入式硬件·mcu·学习
Navigator_Z7 小时前
LeetCode //C - 1031. Maximum Sum of Two Non-Overlapping Subarrays
c语言·算法·leetcode