cancel
Showing results for 
Search instead for 
Did you mean: 

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

daguirrem
Associate

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

1 ACCEPTED SOLUTION

Accepted Solutions
daguirrem
Associate

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

View solution in original post

1 REPLY 1
daguirrem
Associate

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