1.4.8 静态和动态内存分配
优质
小牛编辑
132浏览
2023-12-01
在V9.0.0
版本之前为下列对象分配内存采用动态的方式,在之后的版本才允许应用程序开发者自己静态的分配内存;
- 任务
- 软件定时器
- 队列
- 事件组
- 二值信号量
- 计数信号量
- 递归信号量
- 互斥量
当然,具体使用静态分配还是动态分配由开发者自己决定。
动态分配
动态分配的好处在于使用灵活简单、同时潜在的可以降低内存占用。
- 更少的函数参数
- 内存分配使用RTOS提供的API自动分配
- 应用程序开发者不需要自己去考虑内存分配,只要内存足够
- 如果某个对象被删除,则它占用的那部分空间可以回收再利用
- RTOS的API函数提供堆内存的使用信息返回,方便优化堆内存大小
- 内存分配机制可以选择最适合应用程序的,例如
heap_1.c
适用于简单的和对内存安全有限制的应用,heap_4.c
用于碎片保护,heap_5.c
分散堆到多个RAM区域。
下列API用于动态内存分配,configSUPPORT_DYNAMIC_ALLOCATION
设置项需要设置为1,或者不定义。
- xTaskCreate()
- xQueueCreate()
- xTimerCreate()
- xEventGroupCreate()
- xSemaphoreCreateBinary()
- xSemaphoreCreateCounting()
- xSemaphoreCreateMutex()
- xSemaphoreCreateRecursiveMutex()
具体使用方法参考官方API参考手册
静态分配
静态内存分配的好处:
- RTOS 对象可以放置在内存中的特定位置
- 最大的内存使用在编译的时候就可以确定,而不是运行的时候
- 开发者不需要考虑内存分配失败的情况
- 允许不去动态分配内训,这样在使用RTOS上会简单点(尽管freeRTOS的内存分配机制以及可以克服大多数不利条件)
在configSUPPORT_STATIC_ALLOCATION
设置为1时,可以使用下列API函数实现静态内存分配,分配好的静态内存地址传递给API函数。使用方法可以参考StaticAllocation.c
- xTaskCreateStatic()
- xQueueCreateStatic()
- xTimerCreateStatic()
- xEventGroupCreateStatic()
- xSemaphoreCreateBinaryStatic()
- xSemaphoreCreateCountingStatic()
- xSemaphoreCreateMutexStatic()
- xSemaphoreCreateRecursiveMutexStatic()