修改Link.ld文件引发的错误

尝试外扩SRAM,以下是我的ld代码,修改字段标红


ENTRY( _start )


__stack_size = 2048;


PROVIDE( _stack_size = __stack_size );



MEMORY

{

/* CH32V30x_D8C - CH32V305RB-CH32V305FB

   CH32V30x_D8 - CH32V303CB-CH32V303RB

*/

/*

FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K

*/

    

/* CH32V30x_D8C - CH32V307VC-CH32V307WC-CH32V307RC

   CH32V30x_D8 - CH32V303VC-CH32V303RC

   FLASH + RAM supports the following configuration

   FLASH-192K + RAM-128K

   FLASH-224K + RAM-96K

   FLASH-256K + RAM-64K  

   FLASH-288K + RAM-32K  

*/

FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K

SRAM (xrw) : ORIGIN = 0x60000000, LENGTH = 64K

}



SECTIONS

{


.init :

{

_sinit = .;

. = ALIGN(4);

KEEP(*(SORT_NONE(.init)))

. = ALIGN(4);

_einit = .;

} >FLASH AT>FLASH


  .vector :

  {

      *(.vector);

  . = ALIGN(64);

  } >FLASH AT>FLASH


.text :

{

. = ALIGN(4);

*(.text)

*(.text.*)

*(.rodata)

*(.rodata*)

*(.gnu.linkonce.t.*)

. = ALIGN(4);

} >FLASH AT>FLASH 


.fini :

{

KEEP(*(SORT_NONE(.fini)))

. = ALIGN(4);

} >FLASH AT>FLASH


PROVIDE( _etext = . );

PROVIDE( _eitcm = . );


.preinit_array  :

{

  PROVIDE_HIDDEN (__preinit_array_start = .);

  KEEP (*(.preinit_array))

  PROVIDE_HIDDEN (__preinit_array_end = .);

} >FLASH AT>FLASH 

.init_array     :

{

  PROVIDE_HIDDEN (__init_array_start = .);

  KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))

  KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))

  PROVIDE_HIDDEN (__init_array_end = .);

} >FLASH AT>FLASH 

.fini_array     :

{

  PROVIDE_HIDDEN (__fini_array_start = .);

  KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))

  KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))

  PROVIDE_HIDDEN (__fini_array_end = .);

} >FLASH AT>FLASH 

.ctors          :

{

  /* gcc uses crtbegin.o to find the start of

     the constructors, so we make sure it is

     first.  Because this is a wildcard, it

     doesn't matter if the user does not

     actually link against crtbegin.o; the

     linker won't look for a file to match a

     wildcard.  The wildcard also means that it

     doesn't matter which directory crtbegin.o

     is in.  */

  KEEP (*crtbegin.o(.ctors))

  KEEP (*crtbegin?.o(.ctors))

  /* We don't want to include the .ctor section from

     the crtend.o file until after the sorted ctors.

     The .ctor section from the crtend file contains the

     end of ctors marker and it must be last */

  KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))

  KEEP (*(SORT(.ctors.*)))

  KEEP (*(.ctors))

} >FLASH AT>FLASH 

.dtors          :

{

  KEEP (*crtbegin.o(.dtors))

  KEEP (*crtbegin?.o(.dtors))

  KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))

  KEEP (*(SORT(.dtors.*)))

  KEEP (*(.dtors))

} >FLASH AT>FLASH 


.dalign :

{

. = ALIGN(4);

PROVIDE(_data_vma = .);

} >RAM AT>FLASH


.dlalign :

{

. = ALIGN(4); 

PROVIDE(_data_lma = .);

} >FLASH AT>FLASH


.data :

{

    *(.gnu.linkonce.r.*)

    *(.data .data.*)

    *(.gnu.linkonce.d.*)

. = ALIGN(8);

    PROVIDE( __global_pointer$ = . + 0x800 );

    *(.sdata .sdata.*)

*(.sdata2.*)

    *(.gnu.linkonce.s.*)

    . = ALIGN(8);

    *(.srodata.cst16)

    *(.srodata.cst8)

    *(.srodata.cst4)

    *(.srodata.cst2)

    *(.srodata .srodata.*)

    . = ALIGN(4);

PROVIDE( _edata = .);

} >RAM AT>FLASH


.bss :

{

. = ALIGN(4);

PROVIDE( _sbss = .);

      *(.sbss*)

        *(.gnu.linkonce.sb.*)

*(.bss*)

      *(.gnu.linkonce.b.*)

*(COMMON*)

. = ALIGN(4);

PROVIDE( _ebss = .);

} >RAM AT>FLASH


PROVIDE( _end = _ebss);

PROVIDE( end = . );


    .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :

    {

        PROVIDE( _heap_end = . );    

        . = ALIGN(4);

        PROVIDE(_susrstack = . );

        . = . + __stack_size;

        PROVIDE( _eusrstack = .);

    } >RAM 


.sram :

{

. = ALIGN(4); 

ORIGIN(SRAM);

. = ALIGN(4); 

} >SRAM

}



我在程序里面定义

static lv_color_t buf_1[MY_DISP_HOR_RES * 10]   __attribute__((section(".sram")));


清除obj文件重新编译后出现如下错误

c:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/bin/ld.exe:C:\Users\wky\Desktop\CH32V307 硬件SPI_DMA LCD\CH32V307 硬件SPI_DMA LCD\Ld\Link.ld:1: syntax error

collect2.exe: error: ld returned 1 exit status

make: *** [makefile:114: CH32V307VCT6.elf] Error 1




我不明白是什么原因。

我解决了这个问题,下面代码为:

.sram :

{

. = ALIGN(4);

*(.sram);

. = ALIGN(4);

} >SRAM AT>FLASH


注意后面AT>FLASH,指的是程序运行的首地址(因为下载的代码都是从内部FLASH中运行)

1703313768101791.jpg

1703313768284366.jpg


定义的数组已经可以扩到80了

static lv_color_t buf_1[MY_DISP_HOR_RES * 80]  __attribute__((section(".sram")));


但现在FLASH的大小制约了这一数字,我尝试将数字提高,出现超出FLASH大小错误


我的FSMC的时钟只能设置120MHZ,144MHZ会出现SRAM打印错误。120MHZ比144MHZ屏幕刷新率会出现下降的情况,大概会有几帧的损失。将缓冲区放到外扩SRAM之后,屏幕刷新率下降了10FPS左右。


Snipaste_2023-12-23_14-50-45.jpg


.sram (NOLOAD) : 
{
. = ALIGN(4);
*(.sram);
. = ALIGN(4);
} >SRAM



谢谢兄弟


只有登录才能回复,可以选择微信账号登录