扩大 'zoul' 的堆大小

Enlarge heap size for 'zoul'

我需要在我的 Zoul 项目中使用一个库,它广泛使用 malloc 机制来分配动态内存。

问题是当这个库调用 malloc 时 returns NULL 因为堆中没有足够的内存。

我试过这个简单的函数来查看我在程序开始时有多少内存:

size_t heap_size(){
    uint8_t* p = NULL;
    size_t size = 0;

    while((p = malloc(sizeof(uint8_t))) != NULL)
        size++;

    return size;
}

这给我一个只有 92 字节的堆。

在设备的输出中我可以看到它有一个 32 KiB 的 SRAM。有没有办法扩大专用于堆的部分?

没有这种方法。如果您查看 Zoul 的 CPU (CC2538) 的 linker script,您可以看到这些相关的定义:

.bss :
{
    _bss = .;
    *(.bss*)
    *(COMMON)
    _ebss = .;
} > FRSRAM

...

_heap = .;
_eheap = ORIGIN(FRSRAM) + LENGTH(FRSRAM);

因此,堆位于 .bss 段之后,并可能一直持续到内存结束。您可以做的最好的事情是使用一些 Contiki memory usage reduction techniques 来减少 .data.bss 段的大小,并以这种方式为堆获得更多 space。

更重要的是,malloc() 未被 Contiki 操作系统使用,不鼓励用户应用程序使用。建议您在没有动态内存分配的情况下重写代码,或者寻找其他硬件,最好使用 MPU。

避免使用 malloc 和朋友是有充分理由的。堆和堆栈区域共享相同的内存 space,当一个向下增长时,另一个向上增长(它们 "meet in the middle")。当它们开始重叠时,坏事就会开始发生。 malloc'ing 尽可能多的内存会带来麻烦 - 稍后堆栈可能会增长并损坏您的 malloc'ed 内存。