Я делаю проект для загрузчика для 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
Итак, мой вопрос:
Есть ли способ присвоить содержимое переменной приложения переменной в загрузчике без необходимоститочно знать, в каком адресе памяти он находится?