ITCM有人用过吗?

[复制链接]
215|0
shuwei1984 发表于 2025-11-7 13:29 | 显示全部楼层 |阅读模式
tc, ig, ar, ID, DA, RA
本帖最后由 shuwei1984 于 2025-11-7 13:33 编辑

为什么我内存指定好了,LD文件也改好了,将一个函数改成ITCM方式,但用GNU GCC编译,一运行就无限重启.

MCU是  GD32H759



ld文件如下:


/* memory map */
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 3840K
  RAM (xrw)       : ORIGIN = 0x24000000, LENGTH = 512K
  AXIRAM (xrw)    : ORIGIN = 0x24080000, LENGTH = 192K
  ITCM (rwx)       : ORIGIN = 0x00000008, LENGTH = 64K
  DTCM (rw)       : ORIGIN = 0x20000000, LENGTH = 256K
  SRAM0 (xrw)      : ORIGIN = 0x30000000, LENGTH = 16K
  SRAM1 (xrw)      : ORIGIN = 0x30004000, LENGTH = 16K
}

ENTRY(Reset_Handler)

SECTIONS
{
  __stack_size = DEFINED(__stack_size) ? __stack_size : 2K;
  
/* ISR vectors */
  .vectors :
  {
    . = ALIGN(4);
    KEEP(*(.vectors))
    . = ALIGN(4);
    __Vectors_End = .;
    __Vectors_Size = __Vectors_End - __gVectors;
  } >FLASH

  .funcode :
  {
    . = ALIGN(4);
    _sfuncode = .;
    *(.funcode)
    *(.funcode*)
    . = ALIGN(4);
    _efuncode = .;
  } >ITCM AT> FLASH

  .text :
  {
    . = ALIGN(4);
    *(.text)
    *(.text*)
    *(.glue_7)
    *(.glue_7t)
    *(.eh_frame)

    KEEP (*(.init))
    KEEP (*(.fini))

    . = ALIGN(4);
    /* the symbol ‘_etext’ will be defined at the end of code section */
    _etext = .;
  } >FLASH

  .rodata :
  {
    . = ALIGN(4);
    *(.rodata)
    *(.rodata*)
    . = ALIGN(4);
  } >FLASH

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

  .ARM.attributes : { *(.ARM.attributes) } > 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 (*(.fini_array*))
    KEEP (*(SORT(.fini_array.*)))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } >FLASH

  .stack ORIGIN(DTCM):
  {
    PROVIDE( _heap_end = . );
    . = __stack_size;  
    PROVIDE( _sp = . );
  } >DTCM AT>DTCM

  /* provide some necessary symbols for startup file to initialize data */
  _sidata = LOADADDR(.data);
  .data :
  {
    . = ALIGN(4);
    /* the symbol ‘_sdata’ will be defined at the data section end start */
    _sdata = .;
    *(.data)
    *(.data*)
    . = ALIGN(4);
    /* the symbol ‘_edata’ will be defined at the data section end */
    _edata = .;
  } >DTCM AT> FLASH

  .userdata :
  {
    . = ALIGN(4);
    _suserdata = .;
    *(.userdata)
    *(.userdata*)
    . = ALIGN(4);
    _euserdata = .;
  } >RAM AT> FLASH

  .extdata :
  {
    . = ALIGN(4);
    _sextdata = .;
    *(.extdata)
    *(.extdata*)
    . = ALIGN(4);
    _eextdata = .;
  } >RAM AT> FLASH

  /*_sienetram = LOADADDR(.enetram);*/
  .enetram :
  {
    . = ALIGN(4);
    _senetram = .;
    /*__enetram_start__ = _senetram;*/
    *(.ARM.__at_0x3*)
    *(.ARM.__at_0x3)
    . = ALIGN(4);
    _eenetram = .;
    /*__enetram_end__ = _eenetram;*/
  } >SRAM0 AT>FLASH

  . = ALIGN(4);
  .bss :
  {
    /* the symbol ‘_sbss’ will be defined at the bss section start */
    _sbss = .;
    __bss_start__ = _sbss;
    *(.bss)
    *(.bss*)
    *(COMMON)
    . = ALIGN(4);
    /* the symbol ‘_ebss’ will be defined at the bss section end */
    _ebss = .;
    __bss_end__ = _ebss;
  } >DTCM

. = ALIGN(8);
  PROVIDE ( end = _ebss );
  PROVIDE ( _end = _ebss );


  /*栈放在DTCM的最后*/
  /*.stack ORIGIN(AXIRAM) + LENGTH(AXIRAM) - __stack_size :
  {
    PROVIDE( _heap_end = . );
    . = __stack_size;  
    PROVIDE( _sp = . );
  } >AXIRAM AT>AXIRAM*/
}

/* input sections */
GROUP(libgcc.a libc.a libm.a libnosys.a)





启用ITCM和DTCM的代码为:


int main(void)
{
#if defined (__GNUC__)
    // 设置ITCM和DTCM的大小
    ob_tcm_shared_ram_size_get(&ItcmShareSz, &DtcmShareSz);
    if(64 != ItcmShareSz)
    {
        fmc_unlock();
        ob_unlock();
        fmc_all_flags_clear();
        ob_tcm_shared_ram_config(OB_ITCM_SHARED_RAM_64KB, OB_DTCM_SHARED_RAM_256KB);
        ob_start();
        ob_lock();
        fmc_lock();
    }

#endif

    /* enable i-cache */
    SCB_EnableICache();




测试用的函数为:

__attribute__((long_call, section(".funcode"), noinline))
void Fun_ByteStringAddStr(void)
{





一使用这个方式就无限重启



还有什么地方需要设置的?

您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部