Skip to main content
daguirrem
Associate
May 2, 2022
Solved

How to execute code from CCM Memory? [GCC, LD, Help]

  • May 2, 2022
  • 1 reply
  • 1917 views

Hello, i'm trying to execute a delay code from CCM memory but the MCU is frezing when enter to 'delay_ms' function. It is the first time that i try this and i don´t know if the linker file, and the startup file modifications are good implemented so i post there the modifications:

LD File:

/* Used by the startup to initialize ccm data */
 _siccmdata = LOADADDR(.ccmdata);
...
 /* Initialized data section into "CCM" Ram type memory */
 .ccmdata : 
 {
 . = ALIGN(4);
 _sccmdata = .; /* create a global symbol at data start */
 *(.ccmdata) /* .ccmdata sections */
 *(.ccmdata*) /* .ccmdata* sections */
 *(.ccmFunc) /* .ccmFunc sections */
 *(.ccmFunc*) /* .ccmFunc* sections */
 
 . = ALIGN(4);
 _eccmdata = .; /* define a global symbol at data end */
 } >CCMRAM AT> FLASH
 
 /* Uninitialized data section into "CCM" Ram type memory */
 . = ALIGN(4);
 .ccmbss :
 {
 _sccmbss = .; /* create a global symbol at ccmram start */
 *(.ccmbss)
 *(.ccmbss*)
 
 . = ALIGN(4);
 _eccmbss = .; /* create a global symbol at ccmram end */
 } >CCMRAM
...

Startup CCM Init:

...
FillZerobss:
 str r3, [r2]
 adds r2, r2, #4
 
LoopFillZerobss:
 cmp r2, r4
 bcc FillZerobss
 
/* CCM MODIFICATIONS */
/* Copy the data segment initializers from flash to SRAM */
 ldr r0, =_sccmdata
 ldr r1, =_eccmdata
 ldr r2, =_siccmdata
 movs r3, #0
 b LoopCopyCCMDataInit
 
CopyCCMDataInit:
 ldr r4, [r2, r3]
 str r4, [r0, r3]
 adds r3, r3, #4
 
LoopCopyCCMDataInit:
 adds r4, r0, r3
 cmp r4, r1
 bcc CopyCCMDataInit
 
/* Zero fill the ccmbss segment. */
 ldr r2, =_sccmbss
 ldr r4, =_eccmbss
 movs r3, #0
 b LoopFillZeroCCMbss
 
FillZeroCCMbss:
 str r3, [r2]
 adds r2, r2, #4
 
LoopFillZeroCCMbss:
 cmp r2, r4
 bcc FillZeroCCMbss
 
/* END CCM MODIFICATIONS */
/* Call static constructors */
 bl __libc_init_array
...

Delay function

__attribute__((optimize("-O0")))
__CCM_FUNC void delay_ms (uint16_t ms)
{
 do {
 int32_t cycles_to_ms = DELAY_CYCLES_MS;
 do {
 cycles_to_ms -= 12;
 } while (cycles_to_ms > 0);
 } while (--ms);
}

Where __CCM_FUNC macro expands to:

#define __CCM_FUNC __attribute__((section(".ccmFunc")))

Dump .elf file revelas that delay function is on CCM Memory (0x10000000):

...
__attribute__((optimize("-O0")))
__CCM_FUNC void delay_ms (uint16_t ms)
{
10000000:	 b480 	push	{r7}
10000002:	 b085 	sub	sp, #20
10000004:	 af00 	add	r7, sp, #0
10000006:	 4603 	mov	r3, r0
10000008:	 80fb 	strh	r3, [r7, #6]
...

Debugging stops when delay_ms executes and MCU freezes

0693W00000LzcCuQAJ.png

    This topic has been closed for replies.
    Best answer by daguirrem

    Short answer: CCM on STM32F4x is connected only to D-Bus, dont is posible execute code from CCM :expressionless_face:

    1 reply

    daguirrem
    daguirremAuthorBest answer
    Associate
    May 2, 2022

    Short answer: CCM on STM32F4x is connected only to D-Bus, dont is posible execute code from CCM :expressionless_face: