Я делаю проект на загрузчике для STM32F051, который переходит к приложению в другом месте памяти. Эта часть работает нормально. Проблема, с которой я столкнулся, заключается в том, что я определил место во FLASH для размещения переменных для приложения. Эти переменные могут быть такими, как номер версии, отметка времени и т. Д., Основные переменные для приложения, которые служат в качестве информации.
Я хочу разрешить загрузчику доступ к этим переменным, не пытаясь их установить. Когда я вношу изменения в загрузчик (или даже если я этого не делаю) после загрузки приложения, а затем пытаюсь его отладить, он терпит неудачу, потому что он пытается выполнить запись во флеш-пространстве переменных приложения, которое уже содержит данные.
Фрагменты компоновщика загрузчика:
MEMORY
{
VTRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 0xc0 /* First part of RAM is reserved to the vector table */
RAM (xrw) : ORIGIN = 0x200000c0, LENGTH = 8K - 0xc0
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 12K
APPLICATION (rx) : ORIGIN = 0x08003000, LENGTH = 9K
APPLICATION_VARS(rx): ORIGIN = 0x08005400, LENGTH = 1K
BCKP(rx) : ORIGIN = 0x08005800, LENGTH = 9K
BCKP_VARS(rx) : ORIGIN = 0x08007C00, LENGTH = 1K
}
.application_vars :
{
KEEP(*(.application_vars .VERSION_NUMBER))
KEEP(*(.application_vars .VERSION_TIMESTAMP))
KEEP(*(.application_vars .VERSION_LOADED_TIMESTAMP))
KEEP(*(.application_vars .VERSION_FAULTY))
*(.application_vars *);
} > APPLICATION_VARS
Компоновщик приложения такой же, за исключением того, что он не содержит:
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 12K
BCKP(rx) : ORIGIN = 0x08005800, LENGTH = 9K
BCKP_VARS(rx) : ORIGIN = 0x08007C00, LENGTH = 1K
Это строка кода в загрузчике, которую я использую для выделения переменной
char application_version_number[5] __attribute__((section(".application_vars.VERSION_NUMBER")));
В приложении присваиваю
char version_number[5] __attribute__((section(".application_vars.VERSION_NUMBER"))) = "v1.0";
Я знаю, что могу использовать указатель, чтобы указать точный адрес памяти "VERSION_NUMBER", но тогда мне всегда нужно знать, где он находится. И если я хочу обновить приложение, мне нужно будет убедиться, что каждая переменная всегда находится на том же месте, что и в старой версии.
Я использую "System Workbench for stm32", "CubeMX" и библиотеку HAL.
Итак, мой вопрос:
Есть ли способ присвоить содержимое переменной приложения переменной в загрузчике без необходимости точно знать, по какому адресу памяти оно находится?