wuyage

KSDK2.0中配置heap大小

1
阅读(1642)

你的实际项目中可能需要使用malloc函数来分配指定size大小的内存空间,一般情况下工程会默认分配一个heap大小,通常是在.S 启动文件中,

Heap_Size       EQU     0x00000400

KSDK2.0 中heap大小不是在启动文件中,而是在分散加载文件中,以K64为例

4444444444.jpg

打开此文件,就可以找到它的定义的地方

#if (defined(__heap_size__))
  #define Heap_Size                    __heap_size__
#else
  #define Heap_Size                    0x0400
#endif


如何在工程中运用malloc函数呢?

1)要包含头文件

#include "stdlib.h"


2)可正常调用

    temp = (uint8_t *)malloc(0x200);
    if(temp== NULL)
    {
      PRINTF("malloc error\r\n");
    }
   strcpy(temp,"123456");   
   free(temp);
   temp=NULL;

malloc返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。


从网上摘来一段话,总结堆和栈的区别:


栈:存函数的临时变量,即局部变量,函数返回时随时有可能被其他函数栈用。所以栈是一种分时轮流使用的存储区, 编译器里定义的Stack_Size,是为了限定函数的局部数据活动的范围,操过这么范围有可以跑飞,也就是栈溢出; Stack_Size不影响Hex,更不影响Hex怎么运行的,只是在Debug调试时会提示错。栈溢出也有是超过了国界进行活动,只要老外没有意见,你可以接着玩,有老外不让你玩,你就的得死,或是大家都死(互相撕杀),有的人写单片机代码在函数里定义一个大数组 int buf[8192],栈要是小于8192是会死的很惨。


堆:存的是全局变量,这变量理论上是所有函数都可以访问的,全局变量有的有初始值,但这个值不是存在RAM里的,是存在Hex里,下载到Flash里,上电由代码(编译器生成的汇编代码)搬过去的。有的人很“霸道”,上电就霸占已一块很大的RAM(Heap_Size),作为己有(malloc_init),别人用只能通过他们管家借(malloc),用完还得换(free)。所以   一旦有“霸道”的人出现是编译器里必须定义Heap_Size,否则和他管家借也没有用。


 总之:堆和栈有存在RAM里,他两各分多少看函数需求,但是他两的总值不能超过单片机硬件的实际RAM尺寸,否则只能到海里玩(淹死了)或是自己打造船接着玩(外扩RAM)。


关于Heap_Size影响RAM大小,我也专门对比了下,当定义#define Heap_Size                    0x0400时,编译出来的大小显示:

Program Size: Code=12448 RO-data=1440 RW-data=44 ZI-data=2088  

当当定义#define Heap_Size                    0x0800时,编译出来的大小显示:

Program Size: Code=12448 RO-data=1440 RW-data=44 ZI-data=3112  


ZI-data的值正好增加了0x400 大小。