Я делаю изменения в двух файлах (для ARMCC)
В скрипте линкера размещаешь переменные BSS нужного тебе объектника в нужной области
LR_IROM1 FLASH_START FLASH_SIZE
{
...
RW_IRAM2 +0 UNINIT 256
{
LifeData.o (+BSS)
}
}
И объявляешь переменные так, чтобы они были BSS типа:
LifeData.c:
static LifeData lifeData1;
static uint32_t crc32Data1;
static LifeData lifeData2;
static uint32_t crc32Data2;
Можно сделать через секции, скрипт будет так выглядеть (это я взял код из Amazon FreeRTOS):
; Place variables in the section that should not be initialized during the
; device startup.
RW_IRAM1 +0 UNINIT
{
* (.noinit)
}
Исходник:
/** To create cross compiler compatible code, use the CY_NOINIT, CY_SECTION, CY_UNUSED, CY_ALIGN
* attributes at the first place of declaration/definition.
* For example: CY_NOINIT uint32_t noinitVar;
*/
#if (__ARMCC_VERSION >= 6010050)
#define CY_NOINIT __attribute__ ((section(".noinit")))
#else
#define CY_NOINIT __attribute__ ((section(".noinit"), zero_init))
#endif// (__ARMCC_VERSION >= 6010050)
(а это для GCC)
В скрипте линкера размещаешь придуманную тобой секцию .noInit в нужном ОЗУ:
.noInit (NOLOAD) : {
*(.noInit*)
} > SRAM1
В объявлении переменной в исходнике (у меня сразу после объявления структуры "x" идёт объявление переменной "notInitDataInSram1"):
static __attribute__((section(".noInit"))) struct x
{
uint32_t magicNumber;
uint32_t mode;
uint32_t flagHeaterWorking;
uint32_t periodWave_us;
} notInitDataInSram1;