freertos内存pvPortMalloc 和 malloc 区别 ,以及全局变量占用情况
一、FREERTOS占用内存
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 * 1024 ) )
Program Size: Code=78364 RO-data=60184 RW-data=1064 ZI-data=48720
configTOTAL_HEAP_SIZE 是作为ZI-data被编译。
二、FREERTOS 的pvPortMalloc 和 <stdlib.h>中的malloc的区别
pvPortMalloc是从configTOTAL_HEAP_SIZE中申请内存,
malloc是直接从SRAM 堆 中申请内存,是和全局变量一个地位
实验证明如下:
当然xTaskCreate(uart_task,"uart_task",256,NULL,6,NULL); 函数也是从configTOTAL_HEAP_SIZE中申请内存,以及创建队列等freertos相关函数也是
三、全局变量的占用。
实验证明如下:
对照组:
/*********************************************************************************************************************************/
1.定义一个全局变量同时初始化,不管是否引用,则生成在RW-data段,对应map文件的 .data 段
从上图可以看到RW-data变化了4096个字节,不管是否被引用
/*********************************************************************************************************************************/
2.定义一个全局变量不初始化,且引用了,则生成在ZI-data段,对应map文件的 .bss 段
从上图可以看到ZI-data变化了4096个字节,条件是被引用了
/*********************************************************************************************************************************/
3.定义一个全局变量不初始化,从未引用,则不占用SRAM。在ZI-data 和 RW-data中的都不增加。
从上图可以看出,其大小和对照组是一样的。
/*********************************************************************************************************************************/
编译在哪个段应该是编译器决定的,但我相信大部分编译器都是这个规则。