2011-05-11 50 views
3

我想动态分配使用newlib的malloc运行在cortex-m3(裸机)上的内存,我遇到了一个令人困惑的问题。闪烁设备后,马上和释放两个按预期工作。但是,一旦我重置设备malloc只返回NULL。除了malloc以外的其他所有工作。有什么可能会导致这种行为的提示?为什么malloc只能在闪烁cortex-m3后立即运行?

这里是我的链接脚本:

MEMORY 
{ 
    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K 
    SRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 32K 
} 

/* Section Definitions */ 
SECTIONS 
{ 
    .text : 
    { 
    KEEP(*(.isr_vector .isr_vector.*)) 
    *(.text .text.*) 
    *(.gnu.linkonce.t.*) 
    *(.glue_7) 
    *(.glue_7t) 
    *(.gcc_except_table) 
    *(.rodata .rodata*) 
    *(.gnu.linkonce.r.*) 
    _etext = .; 
    } > FLASH 

    __exidx_start = .; 
    .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } > FLASH 
    __exidx_end = .; 

    /*.data : AT (_etext)*/ 
    .data : AT (__exidx_end) 
    { 
    _data = .; 
    *(vtable vtable.*) 
    *(.data .data.*) 
    *(.gnu.linkonce.d*) 
    . = ALIGN(4); 
    _edata = . ; 
    } > SRAM 

    /* .bss section which is used for uninitialized data */ 
    .bss (NOLOAD) : 
    { 
    _bss = . ; 
    *(.bss .bss.*) 
    *(.gnu.linkonce.b*) 
    *(COMMON) 
    . = ALIGN(4); 
    _ebss = . ; 
    } > SRAM 

    .stackarea (NOLOAD) : 
    { 
    . = ALIGN(8); 
    *(.stackarea .stackarea.*) 
    . = ALIGN(8); 
    } > SRAM 

    . = ALIGN(4); 
    _end = . ; 
    PROVIDE (end = .); 

} 

这是从我的记忆地图:

.stackarea  0x10000d3c  0x4 
       0x10000d40    . = ALIGN (0x8) 
*fill*   0x10000d3c  0x4 00 
*(.stackarea .stackarea.*) 
       0x10000d40    . = ALIGN (0x8) 
       0x10000d40    . = ALIGN (0x4) 
       0x10000d40    _end = . 
       0x10000d40    PROVIDE (end, .) 

当malloc的成功,它开始于0x10000d48分配。

+0

'mallinfo()'在重置后返回什么? – AShelly 2011-05-13 03:14:17

回答

1

我不太确定它在Cortext-M3上的工作原理,但是我确实在RX62N上有一些内存管理问题。最后,我决定通过创建一个大堆来做我自己的内存管理,然后通过我自己的API函数分配内存。我用一个简单的链表来做内存管理。这样,我可以保证,它将工作,每次在我的主板和代码:)

希望它有助于:)干杯!

1

堆栈必须位于高于堆的地址处。

堆栈向下堆积并向上堆积。因此,将堆栈顶部放在SRAM的最后一个地址中 堆开始于“_end”标签并结束于堆栈底部,因此请尝试在“_ebss”标签后面加上“_end”标签。

例如。

/* .bss section which is used for uninitialized data */ 
    .bss (NOLOAD) : 
    { 
    _bss = . ; 
    *(.bss .bss.*) 
    *(.gnu.linkonce.b*) 
    *(COMMON) 
    . = ALIGN(4); 
    _ebss = . ; 
    **_end = . ;** 
    } > SRAM