FreeRtos内存管理

FreeRTOS笔记(六):五种内存管理详解 不同的嵌入式系统对于内存分配和时间要求不同。FreeRTSO将内存分配作为移植层的一部分,这样FreeRTOS使用者就可以设用自己的合适的内存分配方法。 当内核需要分配内存时可以调用pvPortMalloc(),释放内存时使用pvPortFree()FreeRTOS提供了5种内存分配方法,以不同文件的形式存在,分别是heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c。这5个文件在FreeRTOS源码终,路径为FreRTOS->Source->portta 阅读详情

FreeRtos内存管理

标签(空格分隔): FreeRtos内存


FreeRtos的内存管理接口,都遵循POSIX接口标准.可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。该标准要求malloc分配的内存地址必须是对齐的地址.

FreeRtos 内存管理共4种方式,分别对应源码文件中的heap_1.c,heap_2.c,heap_3.c,heap_4.c.

FreeRtos内存管理方式 优点 缺点 备注
heap_1.c 只能malloc,不能free
heap_2.c 1.malloc速度快
1.容易出现内存碎片,如果不停的malloc小内存块,大内存块会被拆分为小的内存块,但是free的时候,并不会将小内存块合并,就会出现malloc大内存,无法分配成功的问题
2.free时,无法对该节点检查.free其他内存,或者free两次,无法检查
Free-list链表的节点是按照节点内存块大小排序的
heap_3.c 采用系统默认的malloc和free,只是添加了线程保护
heap_4.c 1.内存合并功能,不会出现内存碎片
2.添加节点保护,malloc时会在内存快上设定标志位,避免多次free和free其他内存引起的crash
1.malloc的时候有大小限制,因为malloc标志位是放在size的最高bit
2.malloc的时间比heap_2.c要慢
Free-list链表的节点是按照节点地址排序的,目的是方便内存合并

1 heap_1.c源码分析

这种方式比较简单,只支持用户malloc内存,不支持用户free.heap_1的内存池是用户自定义了一块数组,为了保证地址对齐,将该数组放在了结构体的第2个元素.

#全局数组ucHeap作为heap的内存词,这里为了保证heap起始地址是4字节对齐的,将ucHeap放在结构体里面保证地址对齐.
extern struct xRTOS_HEAP
{
    unsigned long ulDummy;
    unsigned char ucHeap[ configTOTAL_HEAP_SIZE ];
} xHeap;
void *pvPortMalloc( size_t xWantedSize )
{
void *pvReturn = NULL; 

    /* Ensure that blocks are always aligned to the required number of bytes. */
    #if portBYTE_ALIGNMENT != 1
        if( xWantedSize & portBYTE_ALIGNMENT_MASK )
        {
            /* Byte alignment required. */
            #保证malloc的长度是4字节对齐的,那下一次malloc的地址还是4字节对齐的
            xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
        }
    #endif

    vTaskSuspendAll();
    {
        /* Check there is enough room left for the allocation. */
        if( ( ( xNextFreeByte + xWantedSize ) < configTOTAL_HEAP_SIZE ) &&
            ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */
        {
            /* Return the next free byte then increment the index past this
            block. */
            pvReturn = &( xHeap.ucHeap[ xNextFreeByte ] );
            xNextFreeByte += xWantedSize;           
        }   
    }
    xTaskResumeAll();


    return pvReturn;
}

2 heap_2.c源码分析

heap_2的内存池也是一块用户自定义的静态数组,与heap_1的区别是,这块数组的初始化地址可能是非4字节对齐的.因此初始化的时候会取4字节对齐的地址开始作为整个内存池使用.
heap_2的核心思想是将空闲的内存,放到Free-List链表里面管理.Free-List链表里面的节点是按照该节点内存块大小排序存储的.每次malloc的时候,会从Free-List链表里面取出来可以满足malloc大小的节点使用,同时在malloc的时候,会对较大的节点进行拆分,将空闲区域按照区域大小排序插入到Free-List的列表里面.用户调用Free的时候,也是将某个节点插入到Free-List链表里面.

static void prvHeapInit( void )
{
BlockLink_t *pxFirstFreeBlock;
uint8_t *pucAlignedHeap;

    /* Ensure the heap starts on a correctly aligned boundary. */
    pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHea
头脑风暴—POSIX与FreeRTOS的联系 虽然本文不具有实际指导价值,但可以通过横向对比两个系统的异同点,相似之处加深我们对知识的理解。而且某些FreeRTOS变种(如FreeRTOS+POSIX)支持部分POSIX接口,允许开发者使用标准API(如pthread线程库)编写更便携的代码。学习POSIX接口的设计(如目录操作opendirreaddir),可为后续在FreeRTOS中实现类似功能提供参考。若项目需要从Linux迁移到FreeRTOS,了解POSIX接口的底层实现(如无缓冲I/O)有助于优化嵌入式场景下的性能。 阅读详情

相关推荐

FreeRTOS内存管理详解

Freertos内核源码解读之--------内存管理 内存管理 任务栈和系统栈的区别 FreeRTOS内存管理方法 FreeRTOS静态创建 一、内存管理 在c语言中定义了4个区:代码区、全局变量和静态变量区、动态变量区(即栈区)、动态存储区(即堆区)。 1&gt;栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。在STM32汇编代码中设置如下: Sta...

renqingxin2011的博客 8984

FreeRTOS源码阅读】<3> heap_x.c

heap_1 内存管理阅读 直接数组向后一直申请,不支持释放 heap_2 内存管理阅读 除了不合并空闲块以外,其他和heap_4一样 heap_3内存管理阅读 直接调用系统的malloc和free heap_4 内存管理阅读 在创建任务时,会给TCB申请内存空间、给任务的栈申请空间、给状态链表申请空间;在使用队列以及信号量时,会给队列申请空间。申请空间时会调用vPortMa...

nickatcsdn的博客 942

STM32 FreeRTOS内存管理简介

函数描述Malloc申请内存Free释放内存获取当前空闲内存的大小。

嵌入式心学修行者,以代码为器,以良知为核。探索嵌入式开发中的“知行合一”,在编译、调试、部署中事上磨练致心中之光,铸可靠之器。 1534

jansson+freertos遇到的问题

最近需要在stm32+freertos环境中,使用json格式组包通信,于是按照https://blog.csdn.net/yannanxiu/article/details/52712723 帖子中说的,使用了keil自带的jansson包,组包发送出现了一点问题,记录如下: 1.组包发送后,freertos死在taskSELECT_HIGHEST_PRIORITY_TASK(); 修改了...

张有本的专栏 2656

freeRTOS小内存堆算法深入讲解

1、内存堆算法简介 本文所介绍的内存堆管理是freeRTOS操作系统中的小内存管理算法,参考heap_4.c源文件。这个程序适用于小内存的CPU,比如像STM32F这样的只有几十-几百KB内存的处理器。整个内存堆的处理算法简洁,高效,现对其中的原理做详细的介绍。此算法和RT Thread操作系统的小内存管理算法是一样,可以参考这篇文章,只是代码实现的方式上有一些区别。 ...

fhqlongteng的博客 1903

FreeRTOS内存管理

在嵌入式系统中,内存的地址可能并不连续,这种场景下可以使用Heap_5。内存的动态管理是C程序的知识范畴,并不属于FreeRTOS的知识范畴,但是它跟 FreeRTOS关系是如此紧密,所以我们先对其进行了解。新设计中不再推荐使用Heap_2。使用内存的动态管理功能,简化了程序设计:不再需要小心翼翼地提前规划各类对象,简化API 函数的涉及,甚至可以减少内存的使用。跟 Heap_1、Heap_2 一样,Heap_4 也是使用大数组来分配内存。Heap_5 分配内存、释放内存的算法跟 Heap_4 是一样的。

2301_78772787的博客 1099

FreeRTOS内存管理

既分配又释放, heap_4在heap_2的基础上做了一些改进,heap_4合并相邻的空闲内存针对heap_2的缺点,如果我们再想分配120字节的空间,那就是可以的了,因为buf1的100字节和buf2的50字节合并起来了!

weixin_63135906的博客 2249

FreeRTOS内存管理 | FreeRTOS十五

FreeRTOS内存管理

qq_57663276的博客 1978

FreeRTOS-内存管理

FreeRTOS内存管理

weixin_43251807的博客 1132

FreeRTOS入门——内存管理

malloc:从堆里划出一块空间给程序使用free:使用完,将这块内存空间标记为“空闲”,可以再次使用可以从堆中分配一块内存空间用作栈。

weixin_54221545的博客 2290

FreeRTOSFreeRTOS内存管理的五种方式

内存管理 1. FreeRTOS为什么要实现自己的内存管理 内存的动态管理是C语言程序的知识范围,并不属于FreeRTOS的知识范畴,但是它跟FreeRTOS关系是如此紧密。 在C语言的库函数中,有mallc、free等函数,但是在FreeRTOS中,它们不适用: 不适合用在资源紧缺的嵌入式系统中 这些函数的实现过于复杂、占据的代码空间太大 并非线程安全的(thread-safe) 运行有不确定性:每次调用这些函数时花费的时间可能都不相同 内存碎片化 使用不同的编译器时,需要进行复杂的配置 有时候难以调试

Hanrui的博客 3923

FreeRTOS学习-内存管理

虽然从v9.0.0后,FreeRTOS开始支持内核对象的静态分配方式,因此,内存管理库可以被裁剪。但在大多数嵌入式应用中,堆的使用还是非常常见的。因此,还是有必要研究一下FreeRTOS内存管理。本文介绍了如何使用FreeRTOS内存管理接口,并分别介绍了FreeRTOS对他们的5种实现。

Duran.L的专栏 3188

FreeRTOS高级篇7---FreeRTOS内存管理分析

内存管理对应用程序和操作系统来说都非常重要。现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关。 FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的。这样做大有好处,可以增加系统的灵活性:不同的应用场合可以使用不同的内存分配实现,选择对自己更有利的内存管理策略。比如对于安全型的嵌入式系统,通常不允许动态...

朱工的专栏 6万+

FreeRTOS下的内存管理

堆本质是一块被管理的空闲区域块,在堆的基础上再为没个任务分配出任务控制块(TCB)和栈(Stack),其次是关于内存具体分配中FreeRTOS中用得最多是heap_4方法,其比较实用为。​ heap_4最初也是使用大数组来分配内存,但其还使用了首次适应算法(first fit),实现把相邻的内存合并为一更大内存,有效的缓解了内存碎片问题。: 即采用heap_4进行任务的内存分配时,选择第一次找到适应task需求的内存块,分配剩下的块中的空闲字节会留给后续的。进行内存管理目的在于高效的理由嵌入式内存空间。

ThegreatHaige的博客 727
上一篇: 程序员一生的职业策略
jndxcsc
博客等级 码龄14年 2粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值