Difference between revisions of "How to place variables in Flash"
Line 25: | Line 25: | ||
However, this implementation brings a potential problem with it. |
However, this implementation brings a potential problem with it. |
||
− | Variable FW_Valid could be removed by optimization, because we comparing two constant. |
+ | Variable FW_Valid could be removed by optimization, because we are comparing two constant variables. |
A solution for that is to tell the compiler that the variable is changed outside of the application (''volatile''). |
A solution for that is to tell the compiler that the variable is changed outside of the application (''volatile''). |
Latest revision as of 12:35, 3 January 2024
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.
Contents
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;
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 are comparing two constant variables.
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 };