FreeRTOS动态内存分配管理示例分析
发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,本篇内容主要讲解"FreeRTOS动态内存分配管理示例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"FreeRTOS动态内存分配管理示例分析"吧!动态
千家信息网最后更新 2024年11月20日FreeRTOS动态内存分配管理示例分析
本篇内容主要讲解"FreeRTOS动态内存分配管理示例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"FreeRTOS动态内存分配管理示例分析"吧!
动态内存管理
FreeRTOS提供5种动态内存管理策略,分别为heap_1到heap_5,源码在FreeRTOS/Source/portable/MemMang下,本质是对一个或者多个大数组进行操作来对系统提供内存的申请、释放(有的策略没有)功能。下面先看看heap_1是怎么做的。
heap_1.c 内存堆管理
大数组在哪里
/* Allocate the memory for the heap. */#if( configAPPLICATION_ALLOCATED_HEAP == 1 )//这种情况是可以把待管理的数组分配在外部SRAM、SDRAM中 extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];#else//这种情况是把待管理的数组分配在内部RAM,由编译器决定地址 static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];#endif /* configAPPLICATION_ALLOCATED_HEAP */
可以看到这个局部静态全局大数组名字是ucHeap
,大小是configTOTAL_HEAP_SIZE,这个宏在FreeRTOSConfig.h
中定义
实际可用数组字节数
//因为需要字节对齐,所以实际能使用的内存字节数要减去portBYTE_ALIGNMENT/* A few bytes might be lost to byte aligning the heap start address. */#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;//实际管理的数组首地址 /* Ensure that blocks are always aligned to the required number of bytes. */ //如果不是1字节对齐则先需要portBYTE_ALIGNMENT字节对齐 #if( portBYTE_ALIGNMENT != 1 ) { if( xWantedSize & portBYTE_ALIGNMENT_MASK ) { /* Byte alignment required. */ //如果用户申请字节数不是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字节对齐 { /* Ensure the heap starts on a correctly aligned boundary. */ //假设&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 ) ) ); } /* Check there is enough room left for the allocation. */ //已经分配的字节数xNextFreeByte + 将要分配的字节数xWantedSize //要小于总共有的字节数configADJUSTED_HEAP_SIZE if( ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && //此条件是防止溢出,因为内存是地址是单调增长 ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ { /* Return the next free byte then increment the index past this block. */ //返回地址给用户 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 ){ /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the memory management pages of http://www.FreeRTOS.org for more information. */ ( void ) pv; /* Force an assert as it is invalid to call this function. */ configASSERT( pv == NULL );}
还剩空闲字节数
size_t xPortGetFreeHeapSize( void ){ return ( configADJUSTED_HEAP_SIZE - xNextFreeByte );}
适用范围、特点
适用于只需分配,不需释放场合,执行时间确定,不会产生碎片,但是内存利用率不高
到此,相信大家对"FreeRTOS动态内存分配管理示例分析"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
字节
内存
分配
管理
数组
动态
实际
函数
地址
示例
分析
用户
内容
情况
空闲
策略
钩子
学习
调度
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
对方服务器没有退回
java常用数据库
关于网络安全活动的心得体会
服务器安全国内外研究现状
南阳行业专业软件开发
国产电脑服务器放量
网络安全科普教育团日活动
sql数据库保存到指定的文件
福州市新华互联网科技学校专业
软件开发最想去哪个公司
软件开发能力测试题
焦作软件开发平均价格
国家网络安全产业园调研
ualcn数据库
昌平区管理软件开发口碑推荐
华勤应用软件开发
数据库设计的基础是
数据库追平
软件开发要什么语言
mc好玩的服务器跑酷有奖
服务器管理器窗口
数据库视图中数据的导出
智能数据网络技术
erp测试连不上数据库
vs在数据库上这程序
中国主要网络技术人物
国泰安数据库市场收益率在哪里找
河北盘古网络技术有限公司总部
济宁手机软件开发系统
海南华天科技软件开发公司