在arm7中用gcc实现malloc问题:malloc返回NULL

时间:2012-04-09 22:09:50

标签: c gcc malloc arm

我在我的固件中添加了malloc支持,我想我错过了什么!

我为arm7tdmi处理器使用代码源代码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来自我的链接器文件)

这是我主要做的一个简单的malloc /免费电话:

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"

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

这应该是:

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

所以你不要在堆的末尾开始堆...你可能想要为该变量设一个更好的名称然后heap_end以避免这种混乱。

此外,您无需使用注册修改器即可使内联汇编正常工作。编译器非常聪明,可以为您完成。