广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >FreeRTOS动态内存分配管理heap_1示例
  • 171
分享到

FreeRTOS动态内存分配管理heap_1示例

2024-04-02 19:04:59 171人浏览 泡泡鱼
摘要

目录动态内存管理heap_1.c 内存堆管理实际可用数组字节数分配释放还剩空闲字节数动态内存管理 FreeRTOS提供5种动态内存管理策略,分别为heap_1到heap_5,源码在F

动态内存管理

FreeRTOS提供5种动态内存管理策略,分别为heap_1到heap_5,源码在FreeRTOS/Source/portable/MemMang下,本质是对一个或者多个大数组进行操作来对系统提供内存的申请、释放(有的策略没有)功能。下面先看看heap_1是怎么做的。

heap_1.c 内存堆管理

大数组在哪里


#if( configAPPLICATioN_ALLOCATED_HEAP == 1 )
//这种情况是可以把待管理的数组分配在外部SRAM、SDRAM中
	extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#else
//这种情况是把待管理的数组分配在内部RAM,由编译器决定地址
	static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#endif 

可以看到这个局部静态全局大数组名字是ucHeap,大小是configTOTAL_HEAP_SIZE,这个宏在FreeRTOSConfig.h中定义

实际可用数组字节数

//因为需要字节对齐,所以实际能使用的内存字节数要减去portBYTE_ALIGNMENT

#define configADJUSTED_HEAP_SIZE	( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )

portBYTE_ALIGNMENT 在portMacro.h中定义

#define portBYTE_ALIGNMENT8

已分配字节数

//已经分配了的字节数,也就是下一个空闲内存相对于首址(pucAlignedHeap)的偏移量
static size_t xNextFreeByte = ( size_t ) 0;

分配

void *pvPortMalloc( size_t xWantedSize )
{
void *pvReturn = NULL;//待返回给用户分配地址
static uint8_t *pucAlignedHeap = NULL;//实际管理的数组首地址
	
    //如果不是1字节对齐则先需要portBYTE_ALIGNMENT字节对齐
	#if( portBYTE_ALIGNMENT != 1 )
	{
		if( xWantedSize & portBYTE_ALIGNMENT_MASK )
		{			
		//如果用户申请字节数不是portBYTE_ALIGNMENT_MASK字节对齐的,先要调整到portBYTE_ALIGNMENT_MASK字节对齐
		//比如申请13字节,要求portBYTE_ALIGNMENT = 8,
		//则xWantedSize = 13+(8-(13&7))=13+(8-5)=16,
		//最终申请16字节
			xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
		}
	}
	#endif
//挂起调度器,防止函数重入
	vTaskSuspendAll();
	{
		if( pucAlignedHeap == NULL )
		//说明是第一次调用此函数需要对对内存堆初始化确保内存堆首址也是8字节对齐
		{
			
		    //假设&ucHeap是0x20000C64,
		    //则&ucHeap[ portBYTE_ALIGNMENT ]是 0x20000C64+7=0x20000C6B
		    //pucAlignedHeap = 0x20000C6B & (~0x00000007) = 0x20000C68
		    //pucAlignedHeap才是实际操作的堆首址
			pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
		}
		
		//已经分配的字节数xNextFreeByte + 将要分配的字节数xWantedSize
		//要小于总共有的字节数configADJUSTED_HEAP_SIZE
		if( ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) &&
		//此条件是防止溢出,因为内存是地址是单调增长
			( ( xNextFreeByte + xWantedSize ) > xNextFreeByte )	)
		{
			
			//返回地址给用户
			pvReturn = pucAlignedHeap + xNextFreeByte;
			//更新已经分配了的内存字节数
			xNextFreeByte += xWantedSize;
		}
		traceMALLOC( pvReturn, xWantedSize );
	}
	( void ) xTaskResumeAll();
//解挂调度器
//如果使能的内存申请失败的钩子函数当申请失败时会执行申请失败钩子函数
	#if( configUSE_MALLOC_FaiLED_HOOK == 1 )
	{
		if( pvReturn == NULL )
		{
			extern void vApplicationMallocFailedHook( void );
			vApplicationMallocFailedHook();
		}
	}
	#endif
	return pvReturn;
}

其中portBYTE_ALIGNMENT_MASK是根据portBYTE_ALIGNMENT定义,在portable.h中

#if portBYTE_ALIGNMENT == 8
	#define portBYTE_ALIGNMENT_MASK ( 0x0007 )
#endif

释放

可以看到heap_1是没有提供释放,是无法释放的

void vPortFree( void *pv )
{
	
	( void ) pv;
	
	configASSERT( pv == NULL );
}

还剩空闲字节数

size_t xPortGetFreeHeapSize( void )
{
	return ( configADJUSTED_HEAP_SIZE - xNextFreeByte );
}

适用范围、特点

适用于只需分配,不需释放场合,执行时间确定,不会产生碎片,但是内存利用率不高

以上就是FreeRTOS动态内存分配管理heap_1示例的详细内容,更多关于FreeRTOS动态内存分配管理的资料请关注编程网其它相关文章!

--结束END--

本文标题: FreeRTOS动态内存分配管理heap_1示例

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

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

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

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

下载Word文档
猜你喜欢
  • FreeRTOS动态内存分配管理heap_1示例
    目录动态内存管理heap_1.c 内存堆管理实际可用数组字节数分配释放还剩空闲字节数动态内存管理 FreeRTOS提供5种动态内存管理策略,分别为heap_1到heap_5,源码在F...
    99+
    2022-11-13
  • FreeRTOS动态内存分配管理heap_2示例
    目录heap_2.c内存堆管理分配初始化内存堆把新构造的结构体插入空闲链表释放还剩空闲字节数适用范围、特点heap_2.c 内存堆管理 heap_2和heap_1一样是开辟一个大数组...
    99+
    2022-11-13
  • FreeRTOS动态内存分配管理heap_4示例
    目录heap_4.c 内存堆管理数据结构如下分配内存堆初始化把新构造的结构体插入空闲链表释放还剩空闲字节数历史剩余最小字节数适用范围、特点heap_4.c 内存堆管理 heap_4也...
    99+
    2022-11-13
  • FreeRTOS动态内存分配管理heap_5示例
    目录heap_5.cvPortDefineHeapRegions常见问题heap_5.c heap5与heap4分配释放算法完全相同,只是heap5支持管理多块不连续的内存,本质是将...
    99+
    2022-11-13
  • FreeRTOS动态内存分配管理示例分析
    本篇内容主要讲解“FreeRTOS动态内存分配管理示例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“FreeRTOS动态内存分配管理示例分析”吧!动态内存管理FreeRTOS提供5种动态内存...
    99+
    2023-06-29
  • FreeRTOS动态内存分配怎么管理heap5
    今天小编给大家分享一下FreeRTOS动态内存分配怎么管理heap5的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。heap_...
    99+
    2023-06-29
  • FreeRTOS进阶内存管理示例完全解析
    目录前言1. heap_1.c1.1内存申请:pvPortMalloc() 函数源码为:1.2获取当前未分配的内存堆大小:xPortGetFreeHeapSize()1.3其它函数2...
    99+
    2022-11-13
  • C语言中动态内存管理的示例分析
    这篇文章主要介绍了C语言中动态内存管理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是动态内存分配我们都知道在C语言中,定义变量的时候,系统就会为这个变量分配内...
    99+
    2023-06-25
  • MySQL内存管理,内存分配器和操作系统的示例分析
    这篇文章主要介绍MySQL内存管理,内存分配器和操作系统的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!当用户使用任何软件(包括MySQL)碰到内存问题时,我们第一反应就是内...
    99+
    2022-10-18
  • C语言中动态内存管理实例分析
    今天小编给大家分享一下C语言中动态内存管理实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.动态内存开辟的原因常见的...
    99+
    2023-07-02
  • C语言编程C++动态内存分配示例讲解
    目录动态内存管理为什么存在动态内存分配动态内存函数的介绍malloc申请空间和free释放空间有借有还 free释放内存calloc申请内存realloc调整动态内存的大小reall...
    99+
    2022-11-12
  • C语言动态内存管理实例代码分析
    这篇文章主要介绍了C语言动态内存管理实例代码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言动态内存管理实例代码分析文章都会有所收获,下面我们一起来看看吧。1.动态内存开辟的原因常见的内存开辟方式int...
    99+
    2023-07-02
  • C/C++内存管理的示例分析
    这篇文章主要介绍了C/C++内存管理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。C/C++赋予程序员管理内存的自由,是C/C++语言特色,虽然这引入了复杂度和危险...
    99+
    2023-06-15
  • C++中内存管理的示例分析
    这篇文章将为大家详细讲解有关C++中内存管理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概述内存管理的原理庞大而复杂,然而这些都被操作系统进行了封装,并对外预留了API,这些api被c++调用...
    99+
    2023-06-25
  • JS中内存管理的示例分析
    这篇文章将为大家详细讲解有关JS中内存管理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言像C语言这样的底层语言一般都有底层的内存管理接口,比如 malloc...
    99+
    2022-10-19
  • Linux内存管理之内存回收的示例分析
    这篇文章主要介绍了Linux内存管理之内存回收的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.1 内存回收的目标不是所有的物理内存都可以参与回收的,比如要是把内核...
    99+
    2023-06-16
  • C语言中动态内存的示例分析
    这篇文章主要为大家展示了“C语言中动态内存的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中动态内存的示例分析”这篇文章吧。1.关于动态内存的函数1.1 malloc和free函数...
    99+
    2023-06-29
  • C语言中的动态内存分配实例分析
    本篇内容主要讲解“C语言中的动态内存分配实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言中的动态内存分配实例分析”吧!什么是动态内存分配我们目前已经知道的内存开辟的方式有:int&n...
    99+
    2023-07-02
  • JVM内存管理深入垃圾收集器与内存分配策略的示例分析
    这篇文章给大家介绍JVM内存管理深入垃圾收集器与内存分配策略的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出...
    99+
    2023-06-17
  • C语言动态内存的分配实例详解
    目录前言动态内存分配的定义动态内存的优势<1>  可以控制内存的大小<2> 可以多次利用这部分空间<3>不占用栈区的内存malloc c...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作