扩大 '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 内存。
我需要在我的 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 内存。