2024-11-20 10:46 PM - last edited on 2024-11-21 03:36 AM by Andrew Neil
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.
2024-11-21 03:28 AM
Have you actually declared the data?
2024-11-21 03:38 AM
I formatted your post to improve legibility - see:
2024-11-21 08:47 AM
yes using
__attribute__(( section(".dtcm") )
2024-11-21 08:48 AM
Oh thank you for this it looks so much better now, sorry i am new here!
2024-11-21 11:23 PM
But you are complaining about the lack of _ssram related symbols.
2024-11-23 09:28 PM
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