为什么malloc仅在cortex-m3闪烁后立即工作?
我试图使用运行在cortex-m3(裸机)上的newlib的malloc动态分配内存,但遇到了一个令人困惑的问题。闪烁设备后,malloc和free立即按预期工作。但是,一旦我重置设备,malloc只返回NULL。除了malloc,其他一切都正常。有什么线索可以说明这种行为的原因吗 以下是我的链接器脚本:为什么malloc仅在cortex-m3闪烁后立即工作?,malloc,heap,cortex-m3,newlib,Malloc,Heap,Cortex M3,Newlib,我试图使用运行在cortex-m3(裸机)上的newlib的malloc动态分配内存,但遇到了一个令人困惑的问题。闪烁设备后,malloc和free立即按预期工作。但是,一旦我重置设备,malloc只返回NULL。除了malloc,其他一切都正常。有什么线索可以说明这种行为的原因吗 以下是我的链接器脚本: MEMORY { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K SRAM (rwx) : ORIGIN = 0x1000000
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开始分配。我不太确定它在您的Cortext-M3上是如何工作的,但不久前我确实在RX62N上遇到了一些内存管理问题。最后,我决定通过创建一个大堆来进行自己的内存管理,然后通过自己的API函数分配内存。我使用了一个简单的链表来进行内存管理。这样,我可以保证每次在我的板和代码上都能正常工作:)
希望有帮助:)干杯 堆栈的地址必须高于堆的地址 堆栈向下生长,堆向上生长。因此,将栈顶放在SRAM中的最后一个地址上 堆从“\u end”标签开始,并在堆栈底部结束,因此请尝试将“\u end”标签放在“\u ebss”标签的后面 例如 重置后,“mallinfo()”返回什么?
/* .bss section which is used for uninitialized data */
.bss (NOLOAD) :
{
_bss = . ;
*(.bss .bss.*)
*(.gnu.linkonce.b*)
*(COMMON)
. = ALIGN(4);
_ebss = . ;
**_end = . ;**
} > SRAM