gpt4 book ai didi

c - 在 arm7 问题 : malloc return NULL 中使用 gcc 实现 malloc

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

我正在我的固件中添加 malloc 支持,我想我遗漏了什么!

我为 arm7tdmi 处理器使用代码 sourcery g++ lite 库,我的代码基于此链接中的示例:http://e2e.ti.com/support/microcontrollers/stellaris_arm_cortex-m3_microcontroller/f/473/t/44452.aspx#539503

我添加了我的 _sbrk 版本:

char * _sbrk(int incr)
{
//extern char _end; /* Defined by the linker */
static char *heap_end;
char *prev_heap_end;
register char* stackPtr;

if (heap_end == 0)
{
// first allocation
heap_end =HEAP_END;
}

prev_heap_end = heap_end;

// get current stack pointer
asm ("mov %0, sp\n\t" : "=r" (stackPtr) );



if (heap_end + incr > stackPtr) {
return NULL;// error - no more memory
//write (1, "Heap and stack collision\n", 25);
//abort ();
}
heap_end += incr;
return (char*) prev_heap_end;
}

sbrk 使用的一些定义:

#define SDRAM_SIZE 16*1024*1024        
#define HEAP_BASE _ebss
#define HEAP_END ((_stext + SDRAM_SIZE) -1)
#define HEAP_SIZE HEAP_END - HEAP_BASE

(_ebss 和 _stext 来 self 的链接器文件)

这是我进行简单的 malloc/free 调用的主要部分:

void C_main ( void)
{
char * testmalloc=0;
/* Initialize "Heap Descriptor" pointer */
pHeapDescriptor = __rt_embeddedalloc_init ((void*)HEAP_BASE,HEAP_SIZE);
testmalloc = malloc(2048);
free(testmalloc);
}

我以单步模式运行这个程序。当我调用 malloc 时,它最终调用了我的 _sbrk 实现,返回值(prev_heap_end)有一个预期值,但是当程序返回到 main 时,testmalloc 值为 NULL(在 gcc 库的某个地方,prev_heap_end 丢失了)。

有人知道我做错了什么吗?

不知道这是否有帮助,但这是我的 gcc 编译参数:

arm-none-eabi-gcc  -march=armv4t -mcpu=arm7tdmi -dp -c 
-Wa,-adhlns="../../Base/Lib/Pa/main.o.lst" -fmessage-length=0
-fno-zero-initialized-in-bss -MMD -MP -MF"../../Base/Lib/Pa/main.d"
-MT"../../Base/Lib/Pa/main.d" -fpic -mlittle-endian -Wall -g3 -gdwarf-2
../../Base/Hardintrf/Mezzanine/main.c -o"../../Base/Lib/Pa/main.o"

在此先感谢您的帮助!

最佳答案

if (heap_end == 0)
{
// first allocation
heap_end = HEAP_END;
}

这应该是:

if (heap_end == 0)
{
// first allocation
heap_end = HEAP_BASE;
}

所以你不会在堆的末尾开始你的堆......你可能想为该变量想一个比 heap_end 更好的名字来首先避免这种混淆。

此外,您不需要使用 register 修饰符来使您的内联汇编正常工作。编译器足够聪明,可以为您完成这项工作。

关于c - 在 arm7 问题 : malloc return NULL 中使用 gcc 实现 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10080518/

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