[其他ST产品] FreeRTOS(基于STM32)——内存管理

[复制链接]
689|14
 楼主| qn7a12 发表于 2022-12-31 22:03 | 显示全部楼层 |阅读模式
内存管理的简介:

FreeRTOS基本不使用静态内存分配的方法,在FreeRTOS的应用中,一般不用C语言提供的mallo()和free()函数,选择执行效率更高的FreeRTOS中特有的内存管理方法,下面重点介绍heap_1和heap_4内存管理方法,在使用内存管理的时候,我们并不是调用API函数,而是使用FreeRTOS已经提供的heap_x.c文件

3608663b0414a0a7e6.png


评论

———————————————— 版权声明:本文为CSDN博主「Vizio_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_50932441/article/details/127830352  发表于 2022-12-31 22:04
 楼主| qn7a12 发表于 2022-12-31 22:07 | 显示全部楼层
当有任务申请过较小的内存执行完毕并释放了这些小块内存,但是其他任务又无法使用这些小块内存,这些已释放的内存小块空间就会变成内存碎片,如果不及时解决这些问题,内存就会越来越少,导致系统崩溃,FreeRTOS中提供了第四种分配内存的方法,将所有的内存碎片连接起来形成一个大的内存空间,以便于下次使用。
 楼主| qn7a12 发表于 2022-12-31 22:08 | 显示全部楼层
五种内存的分配方法:

heap_1内存分配方法:
616663b0424e27a75.png
 楼主| qn7a12 发表于 2022-12-31 22:09 | 显示全部楼层
内存申请函数:pvRortMalloc()
2225463b0428f150ae.png
 楼主| qn7a12 发表于 2022-12-31 22:11 | 显示全部楼层
要进行八字节内存空间对齐的处理,否则会影响系统性能
 楼主| qn7a12 发表于 2022-12-31 22:12 | 显示全部楼层
内存释放函数:pvFree()  由于第一中内存管理方法不存在释放要求,所以内存释放函数没有执行操作
 楼主| qn7a12 发表于 2022-12-31 22:13 | 显示全部楼层
heap_2内存分配方法:
789363b0435192afc.png
 楼主| qn7a12 发表于 2022-12-31 22:13 | 显示全部楼层
第二种内存管理方法可以使用在需要重复创建和删除的应用,但是会存在内存碎片的问题,适用于几乎所有任务需要的内存大小都差不多的情况。
 楼主| qn7a12 发表于 2022-12-31 22:15 | 显示全部楼层
内存块
5186663b043ed46af6.png

7185463b043f51ff03.png
 楼主| qn7a12 发表于 2022-12-31 22:16 | 显示全部楼层
heap_3内存分配方法:

只是简单封装了标准C库中的malloc()和free()函数,可以满足常用编译器,封装后的函数具有保护功能

8911263b044092a1c8.png
 楼主| qn7a12 发表于 2022-12-31 22:16 | 显示全部楼层
heap_4内存分配方法:
8529363b0444421864.png
可以分配,删除,回收内存空间,解决了内存碎片的问题
 楼主| qn7a12 发表于 2022-12-31 22:17 | 显示全部楼层
heap_5内存分配方法:

若使用heap_5,在调用API函数之前需要调用vPortDefineHeapRegions()来对内存堆做初始化处理,在内存堆未处理完成之前,不允许调用分配内存函数,允许跨越多个不连续的内存段,之前内存分配方法只允许一个内存堆,而heap_5具有多个内存堆,同样支持内存碎片的回收
4042263b04477926cd.png
 楼主| qn7a12 发表于 2022-12-31 22:17 | 显示全部楼层
Bowclad 发表于 2023-1-1 16:09 | 显示全部楼层
怎么封装的malloc和free啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

542

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部