cancel
Showing results for 
Search instead for 
Did you mean: 

STM32 Editing Linker Script

Faisal129
Associate II

Hello everyone, I am using STM32F767ZI which in the reference manual has ITCM, DTCM, SRAM1 and SRAM2 
but in the linker script it is just RAM so I am trying to change it from: 

MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 512K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 2048K
}

 

To this: 

MEMORY
{
ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 16K
DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
RAM (xrw) : ORIGIN = 0x20020000, LENGTH = 368K
SRAM (xrw) : ORIGIN = 0x2007C000, LENGTH = 16K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 2048K
}

So I added in the sections this:

 

_sisram = LOADADDR(.sram);

.sram :
{
. = ALIGN(4);
_ssram = .; /* create a global symbol at data start */
*(.sram) /* .data sections */
*(.sram*) /* .data* sections */

. = ALIGN(4);

_esram = .; /* define a global symbol at data end */
} >SRAM AT> FLASH

_siitcm = LOADADDR(.itcm);

.itcm :
{
. = ALIGN(4);
_sitcm = .; /* create a global symbol at data start */
*(.itcm) /* .data sections */
*(.itcm*) /* .data* sections */

. = ALIGN(4);

_eitcm = .; /* define a global symbol at data end */
} >ITCMRAM AT> FLASH

_sidtcm = LOADADDR(.data);

.dtcm :
{
. = ALIGN(4);

_sdtcm = .; /* create a global symbol at data start */
*(.dtcm) /* .data sections */
*(.dtcm*) /* .data* sections */

. = ALIGN(4);

_edtcm = .; /* define a global symbol at data end */
} >DTCMRAM AT> FLASH

and then moved to the startup file

first I added the following:

.word _sisram
.word _ssram
.word _esram

.word _siitcm
.word _sitcm
.word _eitcm

.word _sidtcm
.word _sdtcm
.word _edtcm



and then the copy loop like this:

//SRAM
ldr r0, =_ssram
ldr r1, =_esram
ldr r2, =_sisram
movs r3, #0
b LoopCopySramInit

CopySramInit:
ldr r4, [r2, r3]
str r4, [r0, r3]
adds r3, r3, #4

LoopCopySramInit:
adds r4, r0, r3
cmp r4, r1
bcc CopySramInit

//ITCM
ldr r0, =_sitcm
ldr r1, =_eitcm
ldr r2, =_siitcm
movs r3, #0
b LoopCopyItcmInit

CopyItcmInit:
ldr r4, [r2, r3]
str r4, [r0, r3]
adds r3, r3, #4

LoopCopyItcmInit:
adds r4, r0, r3
cmp r4, r1
bcc CopyItcmInit

//DTCM
ldr r0, =_sdtcm
ldr r1, =_edtcm
ldr r2, =_sidtcm
movs r3, #0
b LoopCopyDtcmInit

CopyDtcmInit:
ldr r4, [r2, r3]
str r4, [r0, r3]
adds r3, r3, #4

LoopCopyDtcmInit:
adds r4, r0, r3
cmp r4, r1
bcc CopyDtcmInit

So I am basically copying what the mx did to the data section from flash to RAM, but when I run I get this error
undefined reference to `_ssram'
I tried to change it from .word to .extern but still the same error. 

what am I missing ? is there a better way to divided the RAM region to ITCM DTCM and RAM ? 
Thank you for your time.
 

 

6 REPLIES 6
gbm
Lead III

Have you actually declared the data?

My STM32 stuff on github - compact USB device stack and more: https://github.com/gbm-ii/gbmUSBdevice

yes using 

__attribute__(( section(".dtcm") )

 

Oh thank you for this it looks so much better now, sorry i am new here!

But you are complaining about the lack of _ssram related symbols.

My STM32 stuff on github - compact USB device stack and more: https://github.com/gbm-ii/gbmUSBdevice

I did it for all DTCM, ITCM and SRAM in the same way, I should have been more clear that the error is undefined reference to all of the following:

 _sisram
_ssram
_esram

_siitcm
_sitcm
_eitcm

_sidtcm
_sdtcm
_edtcm