Arm 更改链接器脚本文件以将数据存储到DTCM RAM后出现STM32H7问题

Arm 更改链接器脚本文件以将数据存储到DTCM RAM后出现STM32H7问题,arm,ram,linker-scripts,mcu,stm32h7,Arm,Ram,Linker Scripts,Mcu,Stm32h7,我使用的是STM32H755ZI单片机。该MCU具有1MB RAM,其中512KB可直接由M7内核访问。我必须存储45000个浮动样本,其大小约为180KB 我的第一个问题是,在存储了大约12000个样本后,我的程序崩溃了。。。。 当我只存储30000个样本时,程序工作正常 第一个问题:原因是什么 我决定在RAM中存储两个阵列,在DTCMRAM中存储第三个阵列。每个阵列的大小约为60KB,DTCM RAM的大小为128KB。我应该更改链接器脚本文件 以下是我定义数组的方式: 将局部变量作为主函数

我使用的是STM32H755ZI单片机。该MCU具有1MB RAM,其中512KB可直接由M7内核访问。我必须存储45000个浮动样本,其大小约为180KB

我的第一个问题是,在存储了大约12000个样本后,我的程序崩溃了。。。。 当我只存储30000个样本时,程序工作正常

第一个问题:原因是什么

我决定在RAM中存储两个阵列,在DTCMRAM中存储第三个阵列。每个阵列的大小约为60KB,DTCM RAM的大小为128KB。我应该更改链接器脚本文件

以下是我定义数组的方式:

将局部变量作为主函数: 浮点数据集[12000]={0}; 浮点数据集Y[12000]={0}

作为全局变量: 属性(((.dtcmram)部分)浮点数据集[12000]

这是我使用的内存映射文件MCU:

以下是默认链接器脚本:

/*
******************************************************************************
**
**  File        : LinkerScript.ld
**
**
**  Abstract    : Linker script for STM32H7 series
**                256Kbytes RAM_EXEC and 256Kbytes 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
**
** Copyright (c) 2019 STMicroelectronics.
** All rights reserved.
**
** This software component is licensed by ST under BSD 3-Clause license,
** the "License"; You may not use this file except in compliance with the
** License. You may obtain a copy of the License at:
**                        opensource.org/licenses/BSD-3-Clause
**
****************************************************************************
*/

/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack */
_estack = 0x24080000;    /* 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
{
RAM_EXEC (rx)      : ORIGIN = 0x24000000, LENGTH = 256K
RAM (xrw)      : ORIGIN = 0x24040000, LENGTH = 256K
}

/* Define output sections */
SECTIONS
{
  /* The startup code goes first into RAM_EXEC */
  .isr_vector :
  {
    . = ALIGN(4);
    KEEP(*(.isr_vector)) /* Startup code */
    . = ALIGN(4);
  } >RAM_EXEC

  /* The program code and other data goes into RAM_EXEC */
  .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 */
  } >RAM_EXEC

  /* Constant data goes into RAM_EXEC */
  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >RAM_EXEC

  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM_EXEC
  .ARM : {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
  } >RAM_EXEC

  .preinit_array     :
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } >RAM_EXEC
  .init_array :
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } >RAM_EXEC
  .fini_array :
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >RAM_EXEC

  /* 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 */
  } >RAM AT> RAM_EXEC

  
  /* 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;
  } >RAM

  /* 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);
  } >RAM

  

  /* Remove information from the standard libraries */
  /DISCARD/ :
  {
    libc.a ( * )
    libm.a ( * )
    libgcc.a ( * )
  }

  .ARM.attributes 0 : { *(.ARM.attributes) }
}



The changed linker script file is presented as follows:
enter code here
    
    /*
    ******************************************************************************
    **
    ** File    : LinkerScript.ld
    **
    **
    ** Abstract  : Linker script for STM32H7 series
    **        256Kbytes RAM_EXEC and 256Kbytes 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
    **
    ** Copyright (c) 2019 STMicroelectronics.
    ** All rights reserved.
    **
    ** This software component is licensed by ST under BSD 3-Clause license,
    ** the "License"; You may not use this file except in compliance with the
    ** License. You may obtain a copy of the License at:
    **            opensource.org/licenses/BSD-3-Clause
    **
    ****************************************************************************
    */
     
    /* Entry Point */
    ENTRY(Reset_Handler)
     
    /* Highest address of the user mode stack */
    _estack = 0x24080000;  /* 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_Heap_Size = 0x200 ;*/
    _Min_Stack_Size = 0x400 ; /* required amount of stack */      /* _Min_Stack_Size = 0x400 */
     
    
        /* Specify the memory areas */
        MEMORY
        {
        RAM_DTCM (rw)   : ORIGIN = 0x20000000, LENGTH = 128K 
        RAM_EXEC (rx)   : ORIGIN = 0x24000000, LENGTH = 256K
        RAM (xrw)   : ORIGIN = 0x24040000, LENGTH = 256K
        }
         
        /* Define output sections */
    
    SECTIONS
    {
     /* The startup code goes first into RAM_EXEC */
     .isr_vector :
     {
      . = ALIGN(4);
      KEEP(*(.isr_vector)) /* Startup code */
      . = ALIGN(4);
     } >RAM_EXEC
     
     .dtcm (NOLOAD) :
     {
       *(.dtcmram)
       *(.dtcmram*)
     } >RAM_DTCM
     
     /* The program code and other data goes into RAM_EXEC */
     .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 */
     } >RAM_EXEC
     
     /* Constant data goes into RAM_EXEC */
     .rodata :
     {
      . = ALIGN(4);
      *(.rodata)     /* .rodata sections (constants, strings, etc.) */
      *(.rodata*)    /* .rodata* sections (constants, strings, etc.) */
      . = ALIGN(4);
     } >RAM_EXEC
     
     .ARM.extab  : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM_EXEC
     .ARM : {
      __exidx_start = .;
      *(.ARM.exidx*)
      __exidx_end = .;
     } >RAM_EXEC
     
     .preinit_array   :
     {
      PROVIDE_HIDDEN (__preinit_array_start = .);
      KEEP (*(.preinit_array*))
      PROVIDE_HIDDEN (__preinit_array_end = .);
     } >RAM_EXEC
     .init_array :
     {
      PROVIDE_HIDDEN (__init_array_start = .);
      KEEP (*(SORT(.init_array.*)))
      KEEP (*(.init_array*))
      PROVIDE_HIDDEN (__init_array_end = .);
     } >RAM_EXEC
     .fini_array :
     {
      PROVIDE_HIDDEN (__fini_array_start = .);
      KEEP (*(SORT(.fini_array.*)))
      KEEP (*(.fini_array*))
      PROVIDE_HIDDEN (__fini_array_end = .);
     } >RAM_EXEC
     
     /* 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 */
     } >RAM AT> RAM_EXEC
     
      
     /* 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;
     } >RAM
     
     /* 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);
     } >RAM
     
     
     /* Remove information from the standard libraries */
     /DISCARD/ :
     {
      libc.a ( * )
      libm.a ( * )
      libgcc.a ( * )
     }
     
     .ARM.attributes 0 : { *(.ARM.attributes) }
    }
我检查了DTCMRAM的地址,它从0x20000000开始。现在,在这些更改之后,程序的性能变得更差,在将3640个样本存储到RAM之后,程序停止工作。。。。它坠毁了。。。。 另一件我觉得奇怪的事情是构建分析器显示128KB的ram量。。。。也许如果我找到一种增加它的方法,它可以解决我的问题而不使用DTCM RAM。。。有人知道这个问题吗?

如何将链接器脚本文件更改为以使用DTCM RAM? 是否有其他方法可以解决上述问题,即存储450000个样本

对于上述问题,我将不胜感激并提供帮助或反馈。
提前谢谢。

问题出在其他地方。简单使用标准链接器脚本,一切都会正常工作。我也这么认为,因为使用默认链接器脚本,我认为我的问题是,我只能使用M7 Core访问128KB的Ram(基于我在Build analyzer和STM32H755ZITX_FLASH.ld文件中看到的内容)。当我定义全局变量(三个浮点数组,每个数组有15000个元素)时,我得到RAM溢出错误,当我在主内存中定义它们时,RAM溢出错误消失,但在RAM中存储12450个样本后,程序崩溃并得到硬错误。如果我能找到一个方法,让我明白如何使用SARAM的其他更大的模块,问题就会解决。你知道吗?)不,你错了。阅读参考手册。为此,请使用系统SRAM而不是TC存储器。