Skip to main content
Graduate
February 13, 2025
Solved

modify startup_stm32f769xx.s so that newly added memory range is initialized ?

  • February 13, 2025
  • 1 reply
  • 496 views

I'm working with the STM32F769 microcontroller and I've defined a new section in the linker script using instructions from https://www.openstm32.org/Using%2BCCM%2BMemory :

 

/* Emulated RAM in the JPEG peripheral */
HACK_RAM_JPEG_HUFFENC_AC0 (rwx): ORIGIN = 0x40024000, LENGTH = 352 /* JPEG->HUFFENC_AC0 */

.hackRamJpegHuffencAc0 :
{
 . = ALIGN(4);
 KEEP(*(.hackRamJpegHuffencAc0))
 *(.hackRamJpegHuffencAc0 .hackRamJpegHuffencAc0.*)
} >HACK_RAM_JPEG_HUFFENC_AC0

/* Used by the startup to initialize data */
_sidata_HACK_RAM_JPEG_HUFFENC_AC0 = LOADADDR(.data_HACK_RAM_JPEG_HUFFENC_AC0);

/* Initialized HACK_RAM_JPEG_HUFFENC section 
* 
* IMPORTANT NOTE! 
* If initialized variables will be placed in this section, 
* the startup code needs to be modified to copy the init-values. 
*/
.data_HACK_RAM_JPEG_HUFFENC_AC0 : 
{
 . = ALIGN(4);
 _sdata_HACK_RAM_JPEG_HUFFENC_AC0 = .; /* create a global symbol at data start */
 *(.data_HACK_RAM_JPEG_HUFFENC_AC0) /* .data sections */
 *(.data_HACK_RAM_JPEG_HUFFENC_AC0*) /* .data* sections */
 
 . = ALIGN(4);
 _edata_HACK_RAM_JPEG_HUFFENC_AC0 = .; /* define a global symbol at data end */
} >HACK_RAM_JPEG_HUFFENC_AC0 AT> FLASH

/* Uninitialized (bss-like) section in HACK_RAM_JPEG_HUFFENC_AC0 */
.bss_HACK_RAM_JPEG_HUFFENC_AC0 :
{
 . = ALIGN(4);
 _sbss_HACK_RAM_JPEG_HUFFENC_AC0 = .; /* Define the start of bss */
 *(.bss.HACK_RAM_JPEG_HUFFENC_AC0) /* Uninitialized section */
 *(.bss.HACK_RAM_JPEG_HUFFENC_AC0.*)
 . = ALIGN(4);
 _ebss_HACK_RAM_JPEG_HUFFENC_AC0 = .; /* Define the end of bss */
} >HACK_RAM_JPEG_HUFFENC_AC0

 

I have absolutely no knowledge of assembler programming and ChatGPT was just hallucinating when I asked him, so I don't know how to change the assembler code in startup_stm32f769xx.s. Unlike in the example (https://www.openstm32.org/Using%2BCCM%2BMemory ), I'm adding a section, not replacing a section. So, can somebody please help me to modify startup_stm32f769xx.s so that __HAL_RCC_JPEG_CLK_ENABLE() is called and then the HACK_RAM_JPEG_HUFFENC_AC0 area is initialized?

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

    I solved it by calling a regular C-function (placed inside a C-file) from the assembler code:

    .extern InitHackMemory /* Declare external C function */
    
    LoopFillZerobss:
     ldr r3, = _ebss
     cmp r2, r3
     bcc FillZerobss
    
    /* Call the clock system intitialization function.*/
     bl SystemInit 
    /* Call static constructors */
     bl __libc_init_array
    /* Call the external C function to initialize hack memory */
     bl InitHackMemory
    /* Call the application's entry point.*/
     bl main
     bx lr 
    .size Reset_Handler, .-Reset_Handler

     

    // External symbols from linker script
    extern uint32_t _sidata_HACK_RAM_JPEG_HUFFENC_AC0;
    extern uint32_t _sdata_HACK_RAM_JPEG_HUFFENC_AC0;
    extern uint32_t _edata_HACK_RAM_JPEG_HUFFENC_AC0;
    
    extern uint32_t _sbss_HACK_RAM_JPEG_HUFFENC_AC0;
    extern uint32_t _ebss_HACK_RAM_JPEG_HUFFENC_AC0;
    
    void InitHackMemory(void) {
     __HAL_RCC_JPEG_CLK_ENABLE();
     uint32_t *src=&_sidata_HACK_RAM_JPEG_HUFFENC_AC0;
     uint32_t *dst = &_sdata_HACK_RAM_JPEG_HUFFENC_AC0;
    
     // Copy initialized data from Flash to RAM
     while (dst < &_edata_HACK_RAM_JPEG_HUFFENC_AC0) {
     *dst++ = *src++;
     }
    
     // Zero initialize the .bss section
     while (dst < &_ebss_HACK_RAM_JPEG_HUFFENC_AC0) {
     *dst++ = 0;
     }
    }

     

    1 reply

    arnold_wAuthorAnswer
    Graduate
    February 13, 2025

    I solved it by calling a regular C-function (placed inside a C-file) from the assembler code:

    .extern InitHackMemory /* Declare external C function */
    
    LoopFillZerobss:
     ldr r3, = _ebss
     cmp r2, r3
     bcc FillZerobss
    
    /* Call the clock system intitialization function.*/
     bl SystemInit 
    /* Call static constructors */
     bl __libc_init_array
    /* Call the external C function to initialize hack memory */
     bl InitHackMemory
    /* Call the application's entry point.*/
     bl main
     bx lr 
    .size Reset_Handler, .-Reset_Handler

     

    // External symbols from linker script
    extern uint32_t _sidata_HACK_RAM_JPEG_HUFFENC_AC0;
    extern uint32_t _sdata_HACK_RAM_JPEG_HUFFENC_AC0;
    extern uint32_t _edata_HACK_RAM_JPEG_HUFFENC_AC0;
    
    extern uint32_t _sbss_HACK_RAM_JPEG_HUFFENC_AC0;
    extern uint32_t _ebss_HACK_RAM_JPEG_HUFFENC_AC0;
    
    void InitHackMemory(void) {
     __HAL_RCC_JPEG_CLK_ENABLE();
     uint32_t *src=&_sidata_HACK_RAM_JPEG_HUFFENC_AC0;
     uint32_t *dst = &_sdata_HACK_RAM_JPEG_HUFFENC_AC0;
    
     // Copy initialized data from Flash to RAM
     while (dst < &_edata_HACK_RAM_JPEG_HUFFENC_AC0) {
     *dst++ = *src++;
     }
    
     // Zero initialize the .bss section
     while (dst < &_ebss_HACK_RAM_JPEG_HUFFENC_AC0) {
     *dst++ = 0;
     }
    }