iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >FreeRTOS动态内存分配怎么管理heap5
  • 778
分享到

FreeRTOS动态内存分配怎么管理heap5

2023-06-29 22:06:27 778人浏览 薄情痞子
摘要

今天小编给大家分享一下FreeRTOS动态内存分配怎么管理heap5的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。heap_

今天小编给大家分享一下FreeRTOS动态内存分配怎么管理heap5的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

heap_5.c

heap5与heap4分配释放算法完全相同,只是heap5支持管理多块不连续的内存,本质是将多块不连续内存用链表串成一整块内存,再用heap4算法来分配释放。若使用heap5则在涉及到分配释放的函数调用时要先调用vPortDefineHeapRegions把多块不连续内存串成一块初始化。

vPortDefineHeapRegions

此函数原型

void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ),

参数在portable.h中定义,如下

typedef struct HeapRegion{uint8_t *pucStartAddress;//指向内存块首地址size_t xSizeInBytes;//此内存块大小} HeapRegion_t;

比如有2块内存要用heap5管理,地址0x80000000,大小0x10000,地址0x90000000,大小0xa0000,则如下定义该结构体数组

 HeapRegion_t xHeapRegions[] = { { ( uint8_t * ) 0x80000000UL, 0x10000 }, { ( uint8_t * ) 0x90000000UL, 0xa0000 },  { NULL, 0 }  };

注意地址顺序要从小到大,最后要以{NULL,0}结尾(源码是以0做判断结束循环)
下面看初始化源码

void vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ){BlockLink_t *pxFirstFreeBlockInRegion = NULL, *pxPreviousFreeBlock;size_t xAlignedHeap;size_t xTotalRegionSize, xTotalHeapSize = 0;BaseType_t xDefinedRegions = 0;size_t xAddress;const HeapRegion_t *pxHeapRegion;configASSERT( pxEnd == NULL );pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] );while( pxHeapRegion->xSizeInBytes > 0 ){xTotalRegionSize = pxHeapRegion->xSizeInBytes;xAddress = ( size_t ) pxHeapRegion->pucStartAddress;if( ( xAddress & portBYTE_ALIGNMENT_MASK ) != 0 ){xAddress += ( portBYTE_ALIGNMENT - 1 );xAddress &= ~portBYTE_ALIGNMENT_MASK;xTotalRegionSize -= xAddress - ( size_t ) pxHeapRegion->pucStartAddress;}xAlignedHeap = xAddress;if( xDefinedRegions == 0 ){xStart.pxNextFreeBlock = ( BlockLink_t * ) xAlignedHeap;xStart.xBlockSize = ( size_t ) 0;}else{configASSERT( pxEnd != NULL );configASSERT( xAddress > ( size_t ) pxEnd );}pxPreviousFreeBlock = pxEnd;xAddress = xAlignedHeap + xTotalRegionSize;xAddress -= xHeapStructSize;xAddress &= ~portBYTE_ALIGNMENT_MASK;pxEnd = ( BlockLink_t * ) xAddress;pxEnd->xBlockSize = 0;pxEnd->pxNextFreeBlock = NULL;pxFirstFreeBlockInRegion = ( BlockLink_t * ) xAlignedHeap;pxFirstFreeBlockInRegion->xBlockSize = xAddress - ( size_t ) pxFirstFreeBlockInRegion;pxFirstFreeBlockInRegion->pxNextFreeBlock = pxEnd;if( pxPreviousFreeBlock != NULL ){pxPreviousFreeBlock->pxNextFreeBlock = pxFirstFreeBlockInRegion;}xTotalHeapSize += pxFirstFreeBlockInRegion->xBlockSize;//下一块xDefinedRegions++;pxHeapRegion = &( pxHeapRegions[ xDefinedRegions ] );}xMinimumEverFreeBytesRemaining = xTotalHeapSize;xFreeBytesRemaining = xTotalHeapSize;configASSERT( xTotalHeapSize );xBlockAllocatedBit = ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 );}

常见问题

比如有多块内存,一块是内部ram,其他是外部ram,外部的地址能写死确定,但是内部的会随着程序开发不停改变,怎么确定呢,下面是官网给的例子

#define RAM2_START_ADDRESS ( ( uint8_t * ) 0x00020000 )#define RAM2_SIZE ( 32 * 1024 )#define RAM3_START_ADDRESS ( ( uint8_t * ) 0x00030000 )#define RAM3_SIZE ( 32 * 1024 )#define RAM1_HEAP_SIZE ( 30 * 1024 )static uint8_t ucHeap[ RAM1_HEAP_SIZE ];const HeapRegion_t xHeapRegions[] ={    { ucHeap, RAM1_HEAP_SIZE },    { RAM2_START_ADDRESS, RAM2_SIZE },    { RAM3_START_ADDRESS, RAM3_SIZE },    { NULL, 0 } };

这样就不用老是修改第一块的起始地址。

以上就是“FreeRTOS动态内存分配怎么管理heap5”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: FreeRTOS动态内存分配怎么管理heap5

本文链接: https://www.lsjlt.com/news/326540.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • FreeRTOS动态内存分配怎么管理heap5
    今天小编给大家分享一下FreeRTOS动态内存分配怎么管理heap5的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。heap_...
    99+
    2023-06-29
  • FreeRTOS动态内存分配管理heap_1示例
    目录动态内存管理heap_1.c 内存堆管理实际可用数组字节数分配释放还剩空闲字节数动态内存管理 FreeRTOS提供5种动态内存管理策略,分别为heap_1到heap_5,源码在F...
    99+
    2024-04-02
  • FreeRTOS动态内存分配管理heap_4示例
    目录heap_4.c 内存堆管理数据结构如下分配内存堆初始化把新构造的结构体插入空闲链表释放还剩空闲字节数历史剩余最小字节数适用范围、特点heap_4.c 内存堆管理 heap_4也...
    99+
    2024-04-02
  • FreeRTOS动态内存分配管理heap_5示例
    目录heap_5.cvPortDefineHeapRegions常见问题heap_5.c heap5与heap4分配释放算法完全相同,只是heap5支持管理多块不连续的内存,本质是将...
    99+
    2024-04-02
  • FreeRTOS动态内存分配管理heap_2示例
    目录heap_2.c内存堆管理分配初始化内存堆把新构造的结构体插入空闲链表释放还剩空闲字节数适用范围、特点heap_2.c 内存堆管理 heap_2和heap_1一样是开辟一个大数组...
    99+
    2024-04-02
  • FreeRTOS动态内存分配管理示例分析
    本篇内容主要讲解“FreeRTOS动态内存分配管理示例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“FreeRTOS动态内存分配管理示例分析”吧!动态内存管理FreeRTOS提供5种动态内存...
    99+
    2023-06-29
  • 动态内存管理
    动态内存管理 一.为什么要有动态内存二.malloc和free二.calloc三.realloc 一.为什么要有动态内存 开辟空间的方式有很多种,像是我们经常使用的整形,数组之类的...
    99+
    2023-09-04
    c++ 数据结构 java
  • 怎么在C++中动态内存分配
    今天就跟大家聊聊有关怎么在C++中动态内存分配,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。按需分配,根据需要分配内存,不浪费。内存拷贝函数void* memcpy(void* de...
    99+
    2023-06-14
  • C语言的动态内存分配及动态内存分配函数详解
    目录mallocmalloc的使用:freecalloccalloc的使用:reallocrealloc的使用改进:realloc的另一种用法:常见的动态内存错误对空指针的解引用操作...
    99+
    2024-04-02
  • Go内存分配管理
    目录一、问题引入二、几个基本概念1.RSS,VSS解释三、Go内存管理机制1.Go runtime内存延迟归还2.强制归还内存一、问题引入 现象:在实际工作项目中,golang项目经...
    99+
    2024-04-02
  • FreeRTOS实时操作系统的内存管理分析
    目录前言1.heap_1.c功能简介:2.heap_2.c功能简介:3.heap_3.c功能简介:4.heap_4.c功能简介:5.heap_5.c(V8.1.0新增)前言 本文介绍...
    99+
    2024-04-02
  • C++动态内存管理详解
    目录1.C/C++程序地址空间2.C语言动态内存管理(1)malloc(2)calloc(3)realloc(4)free3.C++动态内存管理(1)C++为什么要设计一套自己专属的...
    99+
    2024-04-02
  • FreeRTOS实时操作系统的内存怎么管理
    这篇“FreeRTOS实时操作系统的内存怎么管理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“FreeRTOS实时操作系统的...
    99+
    2023-06-29
  • C语言动态内存分配怎么使用
    这篇文章主要介绍了C语言动态内存分配怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存分配怎么使用文章都会有所收获,下面我们一起来看看吧。一、动态内存分配的意义C语言中的一切操作都是基于内存的...
    99+
    2023-06-30
  • C语言动态内存管理分析总结
    目录什么是动态内存分配动态内存函数的介绍freemalloccallocrealloc动态内存管理中常见的错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用f...
    99+
    2024-04-02
  • C++继承和动态内存分配
    目录1.简介2.派生类不用new3.派生类使用new文章转自微信 公众号:Coder梁(ID:Coder_LT) 1.简介 这里面有一个问题,当我们的基类使用动态内存分配,并且重新定...
    99+
    2024-04-02
  • C语言中动态内存管理实例分析
    今天小编给大家分享一下C语言中动态内存管理实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.动态内存开辟的原因常见的...
    99+
    2023-07-02
  • C++ 内存管理:自定义内存分配器
    c++++ 中的自定义内存分配器可让开发者根据需求调整内存分配行为,创建自定义分配器需要继承 std::allocator 并重写 allocate() 和 deallocate() 函...
    99+
    2024-05-03
    c++ 内存管理
  • 如何在c++中分配动态内存
    今天就跟大家聊聊有关如何在c++中分配动态内存,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。动态申请内存操作符 newnew 类型名T(初始化参数列表)功能:在程...
    99+
    2023-06-06
  • C++动态内存管理详情解说
    目录写在前面C/C++ 内存分布C语言内存管理方式C++内存管理方式C++为何增加了new 和 deletenew 一个对象new 一个数组deletemalloc &am...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作