STM32/STM8技术论坛
直播中

刘刚

8年用户 1120经验值
私信 关注
[问答]

怎么才能实现eclipse+jlink在RAM中调试代码?

使用eclipse+jlink下载到flash中调试STM32g0已经可以,现在想把代码放到RAM中调试,改了3个地方,但失败了,请问有研究过的小伙伴吗?网上资料都查不到
1、定义VECT_TAB_SRAM宏定义
2、修改脚本文件,代码都映射到RAM中
3、修改Debug配置选项

如果只把某个函数定义到RAM中运行该怎么改?


  • /* Entry Point */
  • ENTRY(Reset_Handler)

  • /* Highest address of the user mode stack */
  • _estack = 0x20009000;    /* 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 (xrw)      : ORIGIN = 0x20004000, LENGTH = 20K
  • FLASH (rx)      : ORIGIN = 0x20000000, LENGTH = 16K
  • }

  • /* Define output sections */
  • SECTIONS
  • {
  •   /* The startup code goes first into FLASH */
  •   .isr_vector :
  •   {
  •     . = ALIGN(4);
  •     KEEP(*(.isr_vector)) /* Startup code */
  •     . = ALIGN(4);
  •   } >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 */
  •   } >FLASH

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

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

  •   .preinit_array     :
  •   {
  •     PROVIDE_HIDDEN (__preinit_array_start = .);
  •     KEEP (*(.preinit_array*))
  •     PROVIDE_HIDDEN (__preinit_array_end = .);
  •   } >FLASH
  •   .init_array :
  •   {
  •     PROVIDE_HIDDEN (__init_array_start = .);
  •     KEEP (*(SORT(.init_array.*)))
  •     KEEP (*(.init_array*))
  •     PROVIDE_HIDDEN (__init_array_end = .);
  •   } >FLASH
  •   .fini_array :
  •   {
  •     PROVIDE_HIDDEN (__fini_array_start = .);
  •     KEEP (*(SORT(.fini_array.*)))
  •     KEEP (*(.fini_array*))
  •     PROVIDE_HIDDEN (__fini_array_end = .);
  •   } >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 */
  •   } >RAM AT> 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;
  •   } >RAM

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



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

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


回帖(1)

王建

2024-3-8 15:39:08
使用函数属性(attribute):在函数定义时,可以使用__attribute__((section("RAM_SECTION")))将该函数放置在RAM的特定段中。例如:


  • void __attribute__((section("RAM_SECTION"))) my_function(void) {
  •   // 函数体
  • }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分