Я пытаюсь (и не могу) заставить компоновщик ARMCC поместить переменные в область ОЗУ, которая НЕ инициализирована (потому что они нужны мне для выживания после сброса).Регион, который я создал в файле scatter-link, указывает UNINIT
, и в моем вызове __attribute__
я указываю, что это zero_init
RAM (в противном случае я знаю, что компоновщик ARM считает, что это Data
RAM и обнуляет его, независимо от того, что вы говорите).Для моего тестового кода ниже файл .map
показывает, что компоновщик равен , помещая мою тестовую переменную в правильную область:
Execution Region RW_IRAM1 (Base: 0x200032ac, Size: 0x00000004, Max: 0x00000400, ABSOLUTE, UNINIT)
Base Addr Size Type Attr Idx E Section Name Object
0x200032ac 0x00000004 Zero RW 8 .bss.noinit main.o
Еще с этим тестовым кодом:
#include "mbed.h"
// An unsigned int in an uninitialised RAM area
__attribute__ ((section(".bss.noinit"), zero_init))
unsigned int gRetained;
// Entry point
int main()
{
printf("Retained RAM variable is %d.\n", gRetained);
gRetained++;
printf("Retained RAM variable incremented to %d.\n", gRetained);
printf("Resetting...\n");
wait_ms(1000);
NVIC_SystemReset();
}
... вывод, который я получаю:
Retained RAM variable is 0.
Retained RAM variable incremented to 1.
Resetting...
Retained RAM variable is 0.
Retained RAM variable incremented to 1.
Resetting...
Retained RAM variable is 0.
...
Может кто-нибудь заметить, что я делаю не так?
Вот мой полный файл ссылки разброса, где RW_IRAM1
это регион, о котором я говорю:
#! armcc -E
/* Default to no softdevice */
#if !defined(MBED_APP_START)
#define MBED_APP_START 0x0
#endif
#if !defined(MBED_APP_SIZE)
#define MBED_APP_SIZE 0x80000
#endif
/* Physical RAM */
#define MBED_RAM_PHYSICAL_START 0x20000000
#define MBED_RAM_PHYSICAL_SIZE 0x10000
/* Reserved areas */
#define MBED_RAM_SOFT_DEVICE_SIZE 0x31d0
#define MBED_RAM_UNINIT_AREA_SIZE 1024
/* If app_start is 0, do not set aside space for the softdevice */
#if MBED_APP_START == 0
#define MBED_RAM_START MBED_RAM_PHYSICAL_START
#define MBED_RAM_SIZE MBED_RAM_PHYSICAL_SIZE
#else
#define MBED_RAM_START (MBED_RAM_PHYSICAL_START + MBED_RAM_SOFT_DEVICE_SIZE)
#define MBED_RAM_SIZE (MBED_RAM_PHYSICAL_SIZE - MBED_RAM_SOFT_DEVICE_SIZE)
#endif
#define MBED_RAM0_START MBED_RAM_START
#define MBED_RAM0_SIZE 0xDC
#define MBED_RAM1_START (MBED_RAM0_START + MBED_RAM0_SIZE)
#define MBED_RAM1_SIZE MBED_RAM_UNINIT_AREA_SIZE
#define MBED_RAM2_START (MBED_RAM1_START + MBED_RAM1_SIZE)
#define MBED_RAM2_SIZE (MBED_RAM_SIZE - MBED_RAM0_SIZE - MBED_RAM1_SIZE)
LR_IROM1 MBED_APP_START MBED_APP_SIZE {
ER_IROM1 MBED_APP_START MBED_APP_SIZE {
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM0 MBED_RAM0_START UNINIT MBED_RAM0_SIZE { ;no init section
*(*nvictable)
}
RW_IRAM1 MBED_RAM1_START UNINIT MBED_RAM1_SIZE { ;no init section
*(*noinit)
}
RW_IRAM2 MBED_RAM2_START MBED_RAM2_SIZE {
.ANY (+RW +ZI)
}
}
К вашему сведению, это на сканере Nordic NRF52832 с 64 Кбайт оперативной памяти, и я собираюсь собирать с помощью mbed-os, хотя я не верю в этодолжен иметь отношение к проблеме.Версия ARMCC - 5.06, обновление 6 (сборка 750).