title: Are all RAM-sections used in this linkerscript of a STM32H743 microcontroller (Cortex-M7)?
body: <p>I know that the RAM-memory in the latest STM32 microcontrollers contains several sections with remarkable speed differences. That's why I'm trying to wrap my head around the linkerscripts for these devices (note: <code>arm-none-eabi-gcc</code> toolchain). Unfortunately, the linkerscript generated by CubeMX for the <b>STM32F767ZI</b> just ignores different sections within RAM:</p>
  
  <pre><code>/* Specify the memory areas */
  MEMORY
  {
    RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 512K
    FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 2048K
  }
  </code></pre>
  
  <p>&nbsp;<br>
  STMicroelectronics seems to have done some efforts to make the linkerscript for its newest <b>STM32H743ZI</b> a bit more sophisticated:</p>
  
  <pre><code>/* Specify the memory areas */
  MEMORY
  {
    DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
    RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
    RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K
    RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K
    ITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K
    FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 2048K
  }
  </code></pre>
  
  <p>However, when I look further in the linkerscript, it seems like they're stuffing everything in the <code>DTCMRAM</code>! All other sections are unused...</p>
  
  <p>This is the complete linkerscript:</p>
  
  <pre><code>/*
  *****************************************************************************
  **
  
  **  File        : LinkerScript.ld
  **
  **  Abstract    : Linker script for STM32H743ZITx Device with
  **                2048KByte FLASH, 1056KByte RAM
  **
  **                Set heap size, stack size and stack location according
  **                to application requirements.
  **
  **                Set memory bank area and size if external memory is used.
  **
  **  Target      : STMicroelectronics STM32
  **
  **
  **  Distribution: The file is distributed as is, without any warranty
  **                of any kind.
  **
  *****************************************************************************
  ** @attention
  **
  ** &lt;h2&gt;&lt;center&gt;&amp;copy; COPYRIGHT(c) 2014 Ac6&lt;/center&gt;&lt;/h2&gt;
  **
  ** Redistribution and use in source and binary forms, with or without modification,
  ** are permitted provided that the following conditions are met:
  **   1. Redistributions of source code must retain the above copyright notice,
  **      this list of conditions and the following disclaimer.
  **   2. Redistributions in binary form must reproduce the above copyright notice,
  **      this list of conditions and the following disclaimer in the documentation
  **      and/or other materials provided with the distribution.
  **   3. Neither the name of Ac6 nor the names of its contributors
  **      may be used to endorse or promote products derived from this software
  **      without specific prior written permission.
  **
  ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  **
  *****************************************************************************
  */
  
  /* Entry Point */
  ENTRY(Reset_Handler)
  
  /* Highest address of the user mode stack */
  _estack = 0x20020000;    /* end of RAM */
  /* Generate a link error if heap and stack don't fit into RAM */
  _Min_Heap_Size = 0x200;      /* required amount of heap  */
  _Min_Stack_Size = 0x400; /* required amount of stack */
  
  /* Specify the memory areas */
  MEMORY
  {
  DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
  RAM_D1 (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
  RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K
  RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K
  ITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K
  FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 2048K
  }
  
  /* Define output sections */
  SECTIONS
  {
    /* The startup code goes first into FLASH */
    .isr_vector :
    {
      . = ALIGN(4);
      KEEP(*(.isr_vector)) /* Startup code */
      . = ALIGN(4);
    } &gt;FLASH
  
    /* The program code and other data goes into FLASH */
    .text :
    {
      . = ALIGN(4);
      *(.text)           /* .text sections (code) */
      *(.text*)          /* .text* sections (code) */
      *(.glue_7)         /* glue arm to thumb code */
      *(.glue_7t)        /* glue thumb to arm code */
      *(.eh_frame)
  
      KEEP (*(.init))
      KEEP (*(.fini))
  
      . = ALIGN(4);
      _etext = .;        /* define a global symbols at end of code */
    } &gt;FLASH
  
    /* Constant data goes into FLASH */
    .rodata :
    {
      . = ALIGN(4);
      *(.rodata)         /* .rodata sections (constants, strings, etc.) */
      *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
      . = ALIGN(4);
    } &gt;FLASH
  
    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } &gt;FLASH
    .ARM : {
      __exidx_start = .;
      *(.ARM.exidx*)
      __exidx_end = .;
    } &gt;FLASH
  
    .preinit_array     :
    {
      PROVIDE_HIDDEN (__preinit_array_start = .);
      KEEP (*(.preinit_array*))
      PROVIDE_HIDDEN (__preinit_array_end = .);
    } &gt;FLASH
    .init_array :
    {
      PROVIDE_HIDDEN (__init_array_start = .);
      KEEP (*(SORT(.init_array.*)))
      KEEP (*(.init_array*))
      PROVIDE_HIDDEN (__init_array_end = .);
    } &gt;FLASH
    .fini_array :
    {
      PROVIDE_HIDDEN (__fini_array_start = .);
      KEEP (*(SORT(.fini_array.*)))
      KEEP (*(.fini_array*))
      PROVIDE_HIDDEN (__fini_array_end = .);
    } &gt;FLASH
  
    /* used by the startup to initialize data */
    _sidata = LOADADDR(.data);
  
    /* Initialized data sections goes into RAM, load LMA copy after code */
    .data : 
    {
      . = ALIGN(4);
      _sdata = .;        /* create a global symbol at data start */
      *(.data)           /* .data sections */
      *(.data*)          /* .data* sections */
  
      . = ALIGN(4);
      _edata = .;        /* define a global symbol at data end */
    } &gt;DTCMRAM AT&gt; FLASH
  
  
    /* Uninitialized data section */
    . = ALIGN(4);
    .bss :
    {
      /* This is used by the startup in order to initialize the .bss secion */
      _sbss = .;         /* define a global symbol at bss start */
      __bss_start__ = _sbss;
      *(.bss)
      *(.bss*)
      *(COMMON)
  
      . = ALIGN(4);
      _ebss = .;         /* define a global symbol at bss end */
      __bss_end__ = _ebss;
    } &gt;DTCMRAM
  
    /* 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;
      . = . + _Min_Stack_Size;
      . = ALIGN(8);
    } &gt;DTCMRAM
  
  
  
    /* Remove information from the standard libraries */
    /DISCARD/ :
    {
      libc.a ( * )
      libm.a ( * )
      libgcc.a ( * )
    }
  
    .ARM.attributes 0 : { *(.ARM.attributes) }
  }
  </code></pre>
  
  <p>Does this mean that all other sections in RAM remain unused? Why on earth would they do that?</p>
  
  <hr>
  
  <p>If you can improve this linkerscript (and make the other RAM sections useful), please copy-paste your improvement in your answer. I would be very grateful. Please also specify how one can actually decide in the C-source code (or C++ source code) where certain data ends up in the RAM. That's still somewhat mysterious to me ^_^</p>