编译工程后在OUTPUT打印中可以看到:
在这里插入图片描述
如何理解当期RAM的使用和分配情况呢?
在启动文件.s中可以看到,栈顶定义为_estack:
在这里插入图片描述

搜索连接脚本STM32G431XX_FLASH.ld,看到当前栈顶定义在最高地址:
在这里插入图片描述
RAM中其他内容分配情况:
在这里插入图片描述
RAM段包含了data,bss和预先分配的堆空间。由于定义了_estack被分配在内存的最高地址0x20005800,可在.map中查看:
在这里插入图片描述从新设计stack位置,将其放在heap之后,并在二者之间做一个缓冲区(定义顺序很重要!):

  /* User_heap_stack section, used to check that there is enough RAM left */
  ._user_heap_stack : 
  {
    . = ALIGN(8);
    PROVIDE ( end = . );
    PROVIDE ( _end = . );
    . = . + _Min_Heap_Size;
    . = ALIGN(8);
  } >RAM

  /* 缓冲区域(保护间隙) */
  .stack_buffer :
  {
    . = ALIGN(8);
    . = . + 0x100;      /* 256 字节缓冲,可根据需要调整 */
    . = ALIGN(8);
  } >RAM

  /* 栈区(紧跟在缓冲之后) */
  .stack :
  {
    . = ALIGN(8);
    __StackLimit = . ;        /* 栈底(低地址) */
    . = . + _Min_Stack_Size ;
    . = ALIGN(8);
    __StackTop = . ;          /* 栈顶(高地址) */
  } >RAM

重新定义_estack:

/* ============================================================ */
/* 在 SECTIONS 块之后,文件末尾定义 _estack                       */
/* ============================================================ */
 _estack = __StackTop;

再次编译可以看到输出:
在这里插入图片描述
此时stack已经分配在RAM中。再查看map文件:
在这里插入图片描述
在这里插入图片描述
新的内存结构分配完成。内存顶部0x20005800到栈顶0x200040e8还有约6k剩余空间。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐