Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

ARM GCC force variable to be loaded in flash even if unused

I have a AES variable that would like to force-load it to specific address in the bootloader application (Cortex-M7 based app). ARM GCC 10.3.1 compiler. it will be used in the later stage, by the main app. It is considered UNUSED in the bootloader app.

Linker script memory definition

/* Specify the memory areas */
MEMORY
{
    FLASH_FSBL          (rx)    : ORIGIN = 0x08000000,  LENGTH = 126K
    FLASH_FSBL_AESKEY   (rx)    : ORIGIN = 0x0801F900,  LENGTH = 256
}

I defined my own region for AES key

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

    /* Section for AES key */
    .aes_key_sect :
    {
        PROVIDE(region_aes_key_start = .);
        KEEP (*(.aes_key_sect))
        PROVIDE(region_aes_key_end = .);
    } >FLASH_FSBL_AESKEY

In boot code, I have:

#define LOCATION_AES_KEY       __attribute__((section(".aes_key_sect")))

LOCATION_AES_KEY static uint8_t aeskey_const[] = {
#include "../../../aes256_key.txt"
};

When compiled, I see that it was not included in the build

      FLASH_FSBL:       24444 B       126 KB     18.95%
FLASH_FSBL_AESKEY:          0 GB         0 GB

The only way to do it so far, is to dummy-access it in the init function, like so:

void init() {
    const volatile uint8_t* k1 = aeskey_const;
    (void)*k1;
}

When compiled, I see it is part of build:

Memory region         Used Size  Region Size  %age Used
      FLASH_FSBL:       24452 B       126 KB     18.95%
FLASH_FSBL_AESKEY:          32 B         0 GB

is there no better way than this? if I change definition to const, there is no effect.

>Solution :

GCC provides special attributes not defined in the C standards, as you apparently know. One such attribute is "used" that tells the compiler the object is in fact needed and prevents it from removing it. The usage in your case would be :

__attribute__((__used__)) LOCATION_AES_KEY static uint8_t aeskey_const[] = {
#include "../../../aes256_key.txt"
};
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading