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 天前
c语言指的是什么意思
c语言·编译器·编程开发·集成开发环境·程序实例
傲世仙尊3 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
XiHongShi20163 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
牵猫散步的鱼儿3 天前
重载、重写(覆盖)、重定义区别
c语言
phltxy3 天前
C 语言指针:从内存地址到灵活的数据访问
c语言
优信电子3 天前
AIT1001 非接触式红外测温模块 STM32 驱动开发实战:从引脚到代码全解析
stm32·嵌入式·温度传感器·红外测温·非接触式测温·ait1001
phltxy3 天前
C 语言中的数据存储:从类型到二进制位
c语言
深圳老胡3 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
wuyk5553 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
wuminyu3 天前
HotSpot的轻量锁与膨胀后的ObjectMonitor状态重建原理
java·linux·c语言·jvm·c++