Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么malloc仅在cortex-m3闪烁后立即工作?_Malloc_Heap_Cortex M3_Newlib - Fatal编程技术网

为什么malloc仅在cortex-m3闪烁后立即工作?

为什么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

我试图使用运行在cortex-m3(裸机)上的newlib的malloc动态分配内存,但遇到了一个令人困惑的问题。闪烁设备后,malloc和free立即按预期工作。但是,一旦我重置设备,malloc只返回NULL。除了malloc,其他一切都正常。有什么线索可以说明这种行为的原因吗

以下是我的链接器脚本:

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