19_系统内存管理
系统内存管理
内存管理与程序好坏?
对于安全要求高的应用,尽可能不使用动态内存分配。
malloc()和free()
当RTOS内核需要RAM时,调用pvPortMalloc()函数来代替malloc()函数。当RAM要被释放时,调用vPortFree()函数来代替free()函数。
freeRTOS层使用c语言申请内存的方式申请一个很大的数组(此处configTOTAL-HEAP-SIZE的数值是15360),极端情况下,我们把可以申请到的所有空间全部申请下来。然后用户层调用的pvPortMalloc和vPortFree函数则是在此数组中操作,操作的函数原型自然是freeRTOS函数层中定义的。
FreeRTOS提供的五种内存分配方案
1
heap_1.c适合一些不会删除任务,队列以及信号量的任务,特别是一些比较简单的系统和一些对安全性要求比较高的系统。事实上,很多系统中只要创建了任务之后就会一直执行,不会删除任务。所以这个文件适用环境还是比较多的。2
heap_2.c能分配,能回收,但是回收时不考虑内存碎片的场所。适合一些申请和释放操作不是特别频繁,而且不会申请大数组的场所。
3
heap_3.c这种方法实际使用的还是c语言的malloc和free函数。与平台没有太大关系,线程保护。
4
heap_4.c内存分配和释放操作比较频繁的系统。例如要重复创建删除任务,队列,信号量等。
5
heap_5.c系统需要管理不连续的内存空间,例如接入外部ram的场所。
默认heap_4
printf("Heap size %d\n", xPortGetFreeHeapSize()); //获取剩余空间大小
uint8_t *buffer = pvPortMalloc(10); //申请空间
vPortFree(buffer); //释放空间