首要阐明一点,MicroBlaze C函数库支撑规范的内存办理函数,如malloc(),calloc(), free(),这些规范的C函数库界说在libc.a中。动态内存分配从内存的程序的堆(heap)中供给。所以堆的巨细会直接影响调用malloc内存分配的巨细。而堆的巨细(heap size)是不能在运转的时分添加,这样需要在程序编译的时分确认适宜的堆的巨细,在巨细能够EDK下generate linker script的时分,或许直接修正*.ld文件,例如:
_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x1000;
_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x1000;
假如调用malloc(int size)函数的时分呈现,malloc函数回来NULL,这就阐明内存分配失利,原因是:
恳求的内存的巨细或许超过了内存自身的巨细
恳求内存的巨细超过了heap_size的巨细
针对以上两个原因,能够这样做修正heap_size 和添加实践的物理内存。
这儿要提示一点:每次调用malloc,有必要检查一下回来值,以确保实践内存分配的恳求。
在实践中,自己经过malloc恳求一块近乎3MB内存空间用于存储图画数据,可是由于堆设置得太小了,回来值一向为NULL,内存分配失利。
调用malloc代码
void *zalloc(unsigned long size)
{
void *ret = malloc(size);
if (ret) memset(ret, 0, size);
return ret;
}