STM32F0. Как назначить значения из переменных в ОЗУ отдельной переменной? - PullRequest
1 голос
/ 06 октября 2019

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

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

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

1 Ответ

1 голос
/ 06 октября 2019

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

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

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

...