2011-05-11 52 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