STM32F0. Как мне присвоить значения из переменных в ОЗУ отдельной переменной?

Я делаю проект на загрузчике для 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.

Итак, мой вопрос:

Есть ли способ присвоить содержимое переменной приложения переменной в загрузчике без необходимости точно знать, по какому адресу памяти оно находится?


person Abdul Wahab van Reenen    schedule 06.10.2019    source источник
comment
Возможно связанные ответы с возможно полезной информацией: stackoverflow.com/questions/48561217/ и stackoverflow.com / questions / 55622174 /   -  person Gabriel Staples    schedule 07.10.2019


Ответы (1)


По крайней мере, должен быть какой-то указатель (4 байта), который знает и приложение, и загрузчик. Это должен быть указатель на функцию или структуру. Обычно я выделяю одну самую маленькую страницу FLASH для общих данных / настроек. В STM32F051 все страницы имеют одинаковый размер, поэтому вы можете выделить последнюю страницу

#define SETTINGS_PAGE_NUM 63
#define SETTINGS_ADDR 0x0800FC00
#define settings ((struct settings_s*)(SETTINGS_ADDR))

Другой способ указать адреса - присвоение PROVIDE скрипта компоновщика. Я создаю первое приложение и создаю список PROVIDE с помощью сценария bash. Когда я создаю второе приложение, я просто включаю этот список в свой скрипт компоновщика. Так что, наверное, это ответ «да» на ваш вопрос.

person Stephen Plyaskin    schedule 06.10.2019