FreeRTOS - 内存

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tq384998430/article/details/87966571

内存管理一般就是指动态内存分配和回收,Java、C#这样的语言有很“傻瓜式”的内存管理方式,无需手动分配内存并回收,但是对于C语言来说,分配内存就像进行整形数据转字符串操作一样,需要程序员“手动”进行转换,而不是简单的调用 “.toString()”。C语言库函数里面的内存分配和回收函数是 malloc() 和 free() ,但是这两个函数并不适合用于嵌入式系统中,原因如下:

1、在小型嵌入式系统中,由于资源有限,并不一定会支持这两个库函数。

2、这两个函数的实现相对较大,会占用较大的代码空间。

3、他们不是线程安全的函数。

4、这两个函数具有不确定性,函数的运行时间是不可预测的,每次调用的运行时间可能不相同。

5、他们容易产生内存碎片。

6、他们使得链接器配置变得负责。

不同的嵌入式系统拥有不同的内存管理需求,为了解决malloc() 和 free()函数的局限性,FreeRTOS拥有多种供选择的内存管理机制,并且内存管理处于可移植层,使得用户可以使用自己的内存算法。

FreeRTOS系统中,pvPortMalloc() 和 vPortFree() 函数用于代替 malloc() 和 free() 函数,并且函数原型都是兼容的。FreeRTOS提供了三种pvPortMalloc() 和 vPortFree() 函数的实现方式,分别定义在heap_1.c, heap_2.c, and heap_3.c三个源文件中。有的小型的嵌入式系统中,内存分配只会用在任务创建、队列创建、信号量创建,并且在任务调度器开始之前就已经分配好了内存,运行的时候不存在动态内存分配和释放,所以就不需要考虑内存碎片和运算时间的问题,所以就可以选择较为简单的、代码量较少的内存分配算法。

三种内存管理方案都有一个共同点,就是需要提前分配一个内存池作为堆空间,所有的内存分配和释放都是在这个内存池中进行的。内存池说白了就是一个数组,在FreeRTOS系统中使用 configTOTAL_HEAP_SIZE 来配置系统内存池的大小。

内存管理 heap_1.c 方案是一个最简单的内存分配机制的实现,只提供了pvPortMalloc(),没有提供vPortFree() 函数。如果应用中不存在任务、队列、信号量的删除的话,就适合这种方案。

内存管理 heap_2.c 方案在heap_1方案基础上增加了vPortFree() 函数,使得系统可以进行动态内存管理。但是这个方案存在内存碎片的问题,我们可以使每次的内存分配都是同样的大小,这样就可以很好的解决内存碎片问题。

内存管理 heap_3.c 方案其实是基于标准库中的malloc() 和 free()函数实现的,但是使用临时关闭调度器的方式将malloc() 和 free()函数修改成了线程安全类型的。

猜你喜欢

转载自blog.csdn.net/tq384998430/article/details/87966571
今日推荐