2025-03-02 9:24 PM
Hi,
I have a touchGFX V4.23.2 project written with CubeIDE at least four IDE versions ago and have not had any upgrade problems until I upgraded from 1.17.0 to 1.18.0.
When I do a clean build I end up with memory link assignment errors:
When I do a build using 1.17.0 of the IDE i get an error free compilation and the project runs fine on the target.
I have checked that the build using 1.18.0 is using the correct linker script and that is OK.
I also checked the section attributes on the variable that go into the external ram and flash.
I note that a new version of gcc has been included, (Updated to GCC 13 as default toolchain) maybe there is a problem with that.
Any ideas on this?
My linker script is shown below.
/* Entry Point */
ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_sstack = ORIGIN(DTC_STACK);
_estack = ORIGIN(DTC_STACK) + LENGTH(DTC_STACK); /* end of "RAM" Ram type memory */
_Min_Heap_Size = 4k ; /* required amount of heap */
_Min_Stack_Size = 4k ; /* required amount of stack */
/* Memories definition */
MEMORY
{
ITCMRAM (xr) : ORIGIN = 0x00000000, LENGTH = 64K
DTC_STACK (xrw) : ORIGIN = 0x20000000, LENGTH = _Min_Heap_Size + _Min_Stack_Size
DTCM_MISC (xrw) : ORIGIN = 0x20002000, LENGTH = 120K
RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 256K
RAMFB (xrw) : ORIGIN = 0x24040000, LENGTH = 768K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
OSPI (xrw) : ORIGIN = 0x90000000, LENGTH = 63936K
OSPI_BACKUP1 (xrw) : ORIGIN = 0x93ff0000, LENGTH = 4k
OSPI_BACKUP2 (xrw) : ORIGIN = 0x93ff1000, LENGTH = 4K
D2SRAM1 (rw) : ORIGIN = 0x30000000, LENGTH = 32K
D2SRAM2 (rw) : ORIGIN = 0x30010000, LENGTH = 64K
SRD_SRAM (rwx) : ORIGIN = 0x38000000, LENGTH = 31k
BACKUP_SRAM (rw) : ORIGIN = 0x38800000, LENGTH = 4k
EXT_RAM_STATS_OUT (xrw) : ORIGIN = 0xD0000000, LENGTH = 16384K
}
/* Sections */
SECTIONS
{
/* The startup code into "FLASH" Rom type memory */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
/* The program code and other data into "FLASH" Rom type memory */
.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 into "FLASH" Rom type memory */
.rodata :
{
. = ALIGN(4);
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
. = ALIGN(4);
} >FLASH
.ARM.extab : {
. = ALIGN(4);
*(.ARM.extab* .gnu.linkonce.armextab.*)
. = ALIGN(4);
} >FLASH
.ARM : {
. = ALIGN(4);
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
. = ALIGN(4);
} >FLASH
.preinit_array :
{
. = ALIGN(4);
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
. = ALIGN(4);
} >FLASH
.init_array :
{
. = ALIGN(4);
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array*))
PROVIDE_HIDDEN (__init_array_end = .);
. = ALIGN(4);
} >FLASH
.fini_array :
{
. = ALIGN(4);
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT(.fini_array.*)))
KEEP (*(.fini_array*))
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
} >FLASH
/* Code into ITCMRAM */
_itcm_load_ = LOADADDR(.itcm);
.itcm :
{
. = ALIGN(4);
_itcm_start_ = .;
*(.isr_vector_itcm)
*(.ITCM_SECTION)
. = ALIGN(4);
_itcm_end_ = .;
} >ITCMRAM AT >FLASH
/* Used by the startup to initialize data */
_sidata = LOADADDR(.data);
/* Initialized data sections into "RAM" Ram type memory */
.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 into "RAM" Ram type memory */
. = ALIGN(4);
.bss :
{
/* This is used by the startup in order to initialize the .bss section */
_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" Ram type memory left */
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >DTC_STACK
/*
.heap : {
__heap_start__ = .;
end = __heap_start__;
_end = end;
__end = end;
. = . + _Min_Heap_Size;
KEEP(*(.heap))
__heap_end__ = .;
__HeapLimit = __heap_end__;
} > DTC_STACK
.stack : ALIGN(0x8) {
_stack = .;
__stack = .;
. = . + _Min_Stack_Size;
__StackTop = . ;
KEEP(*(.stack))
} > DTC_STACK
*/
.DTCM_MISC : {
. = ALIGN(4);
_sDTCM_MISC = .;
__sDTCM_MISC__ = _sDTCM_MISC;
*(.DTCM_MISC) /* All nominated variables */
. = ALIGN(4);
_eDTCM_MISC = .;
__eDTCM_MISC__ = _eDTCM_MISC;
} >DTCM_MISC
/* Backup Ram*/
.proxVars (NOLOAD) :
{
_bubss = .;
__bubss__start = _bubss;
*(.PROX_VARS_BACK)
. = ALIGN(4);
_ebubss = .;
__ebubss__ = _ebubss;
} >BACKUP_SRAM /* Battery Backed RAM */
/* I2C DMA Ram*/
.i2cDMA_Ram (NOLOAD) :
{
_bubss = .;
__bubss__start = _bubss;
*(.PROX_I2C_TX_BUFF)
*(.PROX_I2C_RX_BUFF)
*(.ADC1_DMA_BUFF)
*(.WI_FI_RX_Ram)
. = ALIGN(4);
_ebubss = .;
__ebubss__ = _ebubss;
} >D2SRAM1 /* BDomain 2 AHB RAM */
/* ADC2 Ram*/
.ADC2_DMA_BUFF :
{
_bubss = .;
__bubss__start = _bubss;
*(.ADC2_DMA_BUFF)
*(.WI_FI_TX_Ram)
*(.UART1_TX_DMA_RAM)
. = ALIGN(4);
_ebubss = .;
__ebubss__ = _ebubss;
} >D2SRAM2 /* BDomain 2 AHB RAM */
.RAM_D3_PLAY_BUFF (NOLOAD) : {
. = ALIGN(4);
_sRAM_D3_REC_BUFF3 = .;
. = ALIGN(4);
_eRAM_D3_REC_BUFF = .;
} >SRD_SRAM
.EXT_RAM_STATS_OUT (NOLOAD) : {
. = ALIGN(4);
_sEXT_RAM_STATS_OUT = .;
. = ALIGN(4);
_eEXT_RAM_STATS_OUT = .;
} >EXT_RAM_STATS_OUT
.OSPI_BACKUP_PARS1 (NOLOAD) :
{
_sOSPI_BACKUP_PARS1 = .;
__sOSPI_BACKUP_PARS1 = _sOSPI_BACKUP_PARS1;
* (.OSPI_BACKUP_PARS1)
. = ALIGN(4);
_eOSPI_BACKUP_PARS1 = .;
__eOSPI_BACKUP_PARS1 = _eOSPI_BACKUP_PARS1;
} >OSPI_BACKUP1
.OSPI_BACKUP_PARS2 (NOLOAD) :
{
_sOSPI_BACKUP_PARS2 = .;
__sOSPI_BACKUP_PARS2 = _sOSPI_BACKUP_PARS2;
* (.OSPI_BACKUP_PARS2)
. = ALIGN(4);
_eOSPI_BACKUP_PARS2 = .;
__eOSPI_BACKUP_PARS2 = _eOSPI_BACKUP_PARS2;
} >OSPI_BACKUP2
/* Remove information from the compiler libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
.ARM.attributes 0 : { *(.ARM.attributes) }
FramebufferSection :
{
*(TouchGFX_Framebuffer TouchGFX_Framebuffer.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >RAMFB
FontFlashSection :
{
*(FontFlashSection FontFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >OSPI
TextFlashSection :
{
*(TextFlashSection TextFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >OSPI
ExtFlashSection :
{
*(ExtFlashSection ExtFlashSection.*)
*(.gnu.linkonce.r.*)
. = ALIGN(0x4);
} >OSPI
}
2025-04-10 7:57 AM
Hello @Garnett.Robert
First let me thank you for posting.
I tested the linker file you shared and I got link error.
However, I made the test with the latest TouchGFX and it works fine. The bug in the linker file was fixed.
BR,
Semer.
To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.