How to place variables in Flash

From SEGGER Wiki
Revision as of 11:36, 23 September 2022 by Lucas (talk | contribs) (Created page with "Variables are usually placed in RAM and constant data is placed in Flash. However, there are some special situations where data in Flash is modified (i.e. making it a variabl...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Variables are usually placed in RAM and constant data is placed in Flash.

However, there are some special situations where data in Flash is modified (i.e. making it a variable) and the code needs to work on the possibly modified data.

This article describes how to place such a symbol using the SEGGER linker.

Requirements

  • Embedded Studio v6.34a or later

Example Situation

The following code will be executed by a bootloader.

const unsigned int ValidMarker = 0xA5A5A5A5;
const unsigned int FW_Valid;   values

int CheckFirmware() {
  if (FW_Valid == ValidMarker) {
    return 1;
  } else {
   return 0;
  }
}

However, this implementation brings a potential problem with it.

Variable FW_Valid could be removed by optimization, because we comparing two constant.

A solution for that is to tell the compiler that the variable is changed outside of the application (volatile).

volatile const unsigned int FW_Valid;

But volatile and const cannot be used together (const overrides volatile).

So we have to create a normal volatile variable:

volatile unsigned int FW_Valid;

The next Issue is that the created Variable is now placed in RAM. However we can place the variable explicitly in Flash with a linker script:

place in FLASH { symbol FW_Valid };

Now the variable also might be removed by optimization, because it is not directly written anywhere.

So we have to tell the linker to keep the variable:

keep { symbol FW_Valid };