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中的都不增加。

从上图可以看出,其大小和对照组是一样的。

/*********************************************************************************************************************************/

编译在哪个段应该是编译器决定的,但我相信大部分编译器都是这个规则。

原文地址:https://www.cnblogs.com/ycpkbql/p/11457505.html