FreeRTOS笔记:堆内存管理

本文介绍了FreeRTOS的堆内存管理,包括内存分配接口和5种不同的实现:heap_1至heap_5。heap_1仅支持分配,heap_2采用最优适配算法但可能导致碎片,heap_3封装C库,heap_4使用最先适配并合并空闲块,heap_5适用于非连续内存区域。
摘要由CSDN通过智能技术生成

堆内存管理

FreeRTOS的内核对象全都采用运行时的动态内存分配。但不同设备内存的容量大小、地址映射、访问速度以及应用对实时性的要求都是不同的,因此FreeRTOS 把堆内存管理放在可移植层,且提供了5套不同的管理方案,位于MemMang/heap_n.c 其中n为1-5。用户也可按照接口自己实现堆内存管理。

接口

堆内存管理接口是一组函数声明,位于portable.h

void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION;
void vPortFree( void *pv ) PRIVILEGED_FUNCTION;

其中 PRIVILEGED_FUNCTION 宏提示这些是特权级函数,
pvPortMalloc 类似于C库中的malloc; vPortFree 类似于C库中的free。

实现

堆所使用的内存空间定义为一个 uint8_t 数组,configAPPLICATION_ALLOCATED_HEAP宏配置ucHeap所在位置,configTOTAL_HEAP_SIZE配置堆大小。如果configAPPLICATION_ALLOCATED_HEAP为1 ,则应用的某个c文件中必须定义ucHeap数组。

#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
    extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#else
    static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#endif /* configAPPLICATION_ALLOCATED_HEAP */

通过在应用中定义ucHeap,用户可以自定义堆的具体存放位置。如果使用的是gcc,可以指定一个ucHeap存放于一个段:

uint8_t ucHeap[ configTOTAL_HEAP_SIZE ] __attribute__ ( ( section( ".my_heap" ) ) );

其中,.my_heap可以在link srcipt中指定地址。对于一些具备高速内存和低速内存的设备,可以用这种方式指定堆位于高速内存来提高访问速度。如果configAPPLICATION_ALLOCATED_HEAP宏不为1,则堆的位置由链接器分配。

heap_1.c

heap_1是最基本的分配方案,只能分配而不能回收,pvPortMalloc的实现:
首先要计算分配内存大小的对齐大小,例如4 byte对齐,则实际分配大小为大于xWantedSize的最小的4的倍数。

if( xWantedSize & portBYTE_ALIGNMENT_MASK )
{
  /* Byte alignment required. */
  xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
}

然后需要挂起所有任务,放置分配过程被打断

vTaskSuspendAll();

空间使用用变量xNextFreeByte表示,xNextF

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值