我正在为 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”的确切内存地址,但我总是需要知道它在哪里。如果我想更新应用程序,我必须确保每个变量始终位于旧版本中的同一位置。
我正在使用“用于 stm32 的系统工作台”、“CubeMX”和 HAL 库
所以我的问题:
有没有办法将应用程序变量的内容分配给引导加载程序中的变量,而无需确切知道它在哪个内存地址中?