1. 内存的概念与分类
在计算系统中,内存用于存储变量和中间数据。系统的内存可以分为两种:
- 内部存储空间(RAM):通常指随机存储器,数据存取速度快,可以随机访问,但掉电后数据会丢失。
- 外部存储空间:例如硬盘或闪存,数据即使在掉电后也能保存。
在嵌入式系统中,我们主要关注内部存储空间(RAM)的管理,这就是内存管理的核心内容。
2. FreeRTOS 内存管理的设计理念
FreeRTOS 操作系统将内核与内存管理功能分开,实现了灵活的内存管理方式。内核仅规定了必要的内存管理函数原型,而不限定具体的实现方式。FreeRTOS 提供了多种内存分配算法(策略),但它们共享统一的上层接口(API),从而允许开发者根据实际需求选择最合适的内存管理策略。
3. 动态内存分配 vs. 静态内存分配
- 静态内存分配:在编译时确定内存分配,适用于高可靠性系统,但内存利用效率较低。
- 动态内存分配:在运行时根据需要动态分配内存,适用于普通业务系统,内存利用效率高,但可能会导致碎片化问题。
嵌入式系统通常根据应用场景的特点选择内存分配方式。
4. 为什么不用 C 标准库的内存管理函数?
虽然在普通计算机系统中常用 malloc()
和 free()
进行动态内存分配,但在嵌入式实时操作系统中使用这些函数却可能带来以下问题:
- 小型嵌入式系统中 RAM 容量有限,
malloc()
和free()
可能不适用。 - 这些函数的实现通常占用较大的代码空间。
- 它们的执行时间不确定,无法保证实时性。
- 可能导致内存碎片的产生。
- 链接器配置复杂,可能覆盖其他变量的内存,增加调试难度。
因此,FreeRTOS 提供了专用的内存管理机制,以满足嵌入式实时系统对确定性和效率的要求。
5. FreeRTOS 的内存管理策略
FreeRTOS 的内存管理模块负责管理系统内存资源,涵盖内存的初始化、分配和释放。为了满足不同嵌入式系统的需求,FreeRTOS 提供了多种内存分配算法,每种算法适用于特定的应用场景。
FreeRTOS V9.0.0 提供了五种内存管理算法:
- heap_1.c:最简单的内存分配策略,不支持内存释放,适用于固定内存需求的系统。
- heap_2.c:允许内存释放,但可能产生碎片。
- heap_3.c :封装了标准的
malloc()
和free()
,适用于那些需要使用标准库的系统。 - heap_4.c:更复杂的内存分配策略,支持合并相邻的空闲内存块,减少碎片。
- heap_5.c:支持多块内存区域的分配,适用于需要灵活内存管理的系统。
这些内存管理算法的源文件位于 FreeRTOS\\\\Source\\\\portable\\\\MemMang
目录下,开发者可以根据需求选择适合的算法。
6. 总结
FreeRTOS 内存管理模块通过高效的内存分配与释放机制,最大化内存利用率,并减少内存碎片的产生。开发者可以根据应用需求选择合适的内存管理策略,从而确保嵌入式系统在运行过程中稳定高效。
欢迎指出博客中的错误,如果你觉得对你有用,记得点赞三连,有问题可留言,会及时回复