gpt4 book ai didi

c - 扩大 'zoul' 的堆大小

转载 作者:太空宇宙 更新时间:2023-11-04 03:13:53 28 4
gpt4 key购买 nike

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

问题是当这个库调用 malloc 时它返回 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。有没有办法扩大专用于堆的部分?

最佳答案

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

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

...

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

因此,堆位于 .bss 段之后,并可能一直持续到内存结束。你能做的最好的事情就是使用一些 Contiki memory usage reduction techniques减少 .data.bss 段的大小,从而为堆获得更多空间。

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

避免使用 malloc 和 friends 是有充分理由的。堆和堆栈区域共享相同的内存空间,一个向下增长,另一个向上增长(它们“在中间相遇”)。当它们开始重叠时,坏事就会开始发生。 malloc 尽可能多的内存会带来麻烦 - 稍后堆栈可能会增长并损坏您的 malloc 内存。

关于c - 扩大 'zoul' 的堆大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53885652/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com