ARM,指定section name的内容如何不被覆盖?
ARM, how the content of the specified section name is not overwritten?
我正在为 STM32F4 系列 MCU 使用 mbed-os 用 C++ 编写的固件。有一部分代码应该只在第一次启动时执行。为了实现这个目标,开发人员使用了一个名为 mysection
的内存段来存储一个名为 MAGIC_INIT_CODE
的标志。 mysection
在 text
内存下的 ARM_GCC 编译器链接器文件中定义。 mysection
的内容在最开始写在下面几行,紧接着 headers:
extern uint32_t __mysection_start__;
extern uint32_t __mysection_end__;
#define MAGIC_INIT_CODE 0xBDDBBDDBBDDBBDDB
static uint64_t magicCode __attribute__((__section__(".mysection"),used)) = MAGIC_INIT_CODE;
然后在main()
功能块中它被下面的行覆盖:
if(magicCode == MAGIC_INIT_CODE){
uint64_t voidMagicCode = 0;
FW_Manager_Interface.MicroFlash.ProgramFlash(reinterpret_cast<uint32_t>(&__mysection_start__), reinterpret_cast<uint8_t*>(&voidMagicCode) , 8, false);
#ifdef BOOTLOADER_MODE
err = FW_Manager_Interface.FW_Checker.updateExternalBackup(Bootloader);
appSettings.boot_outcome = BOOT_OUTCOME_UNKNOWN;
appSettings.store();
#else
err = FW_Manager_Interface.FW_Checker.updateExternalBackup(Application);
#endif
}
所以如果mysection的内容等于MAGIC_INIT_CODE,逻辑成立,mysection的内容被覆盖,备份函数进行备份。程序执行期间MicroFlash.ProgramFlash
将指定值写入从__mysection_start__
开始的相应内存地址。这很清楚。但是我不明白的是 mysection 的内容在第一次启动后如何没有改变?特别是我不明白下面一行是做什么的。
static uint64_t magicCode __attribute__((__section__(".mysection"),used)) = MAGIC_INIT_CODE;
将 mysection 与 MAGIC_INIT_CODE 等同是什么意思?这是给变量名赋值还是把MAGIC_INIT_CODE写到指定的内存地址?这行怎么第一次开机后不修改mysection的内容呢?据我所知,程序计数器从第一行开始执行。然后,它总是在每次重置后到达这一点。但是为什么mysection的内容没有再次变成MAGIC_INIT_CODE呢?
此行将 uint64_t
对象放入 .mysection
部分并将其初始化为 MAGIC_INIT_CODE
。如果 .mysection
放在闪存中,它将永久存在。当您将程序上传到您的微型计算机时,它正在被编程。 Ihis 的值将是永久的(它不能被标准 C 操作改变。你只能通过擦除 flash 和编程新值来改变它的值)
我正在为 STM32F4 系列 MCU 使用 mbed-os 用 C++ 编写的固件。有一部分代码应该只在第一次启动时执行。为了实现这个目标,开发人员使用了一个名为 mysection
的内存段来存储一个名为 MAGIC_INIT_CODE
的标志。 mysection
在 text
内存下的 ARM_GCC 编译器链接器文件中定义。 mysection
的内容在最开始写在下面几行,紧接着 headers:
extern uint32_t __mysection_start__;
extern uint32_t __mysection_end__;
#define MAGIC_INIT_CODE 0xBDDBBDDBBDDBBDDB
static uint64_t magicCode __attribute__((__section__(".mysection"),used)) = MAGIC_INIT_CODE;
然后在main()
功能块中它被下面的行覆盖:
if(magicCode == MAGIC_INIT_CODE){
uint64_t voidMagicCode = 0;
FW_Manager_Interface.MicroFlash.ProgramFlash(reinterpret_cast<uint32_t>(&__mysection_start__), reinterpret_cast<uint8_t*>(&voidMagicCode) , 8, false);
#ifdef BOOTLOADER_MODE
err = FW_Manager_Interface.FW_Checker.updateExternalBackup(Bootloader);
appSettings.boot_outcome = BOOT_OUTCOME_UNKNOWN;
appSettings.store();
#else
err = FW_Manager_Interface.FW_Checker.updateExternalBackup(Application);
#endif
}
所以如果mysection的内容等于MAGIC_INIT_CODE,逻辑成立,mysection的内容被覆盖,备份函数进行备份。程序执行期间MicroFlash.ProgramFlash
将指定值写入从__mysection_start__
开始的相应内存地址。这很清楚。但是我不明白的是 mysection 的内容在第一次启动后如何没有改变?特别是我不明白下面一行是做什么的。
static uint64_t magicCode __attribute__((__section__(".mysection"),used)) = MAGIC_INIT_CODE;
将 mysection 与 MAGIC_INIT_CODE 等同是什么意思?这是给变量名赋值还是把MAGIC_INIT_CODE写到指定的内存地址?这行怎么第一次开机后不修改mysection的内容呢?据我所知,程序计数器从第一行开始执行。然后,它总是在每次重置后到达这一点。但是为什么mysection的内容没有再次变成MAGIC_INIT_CODE呢?
此行将 uint64_t
对象放入 .mysection
部分并将其初始化为 MAGIC_INIT_CODE
。如果 .mysection
放在闪存中,它将永久存在。当您将程序上传到您的微型计算机时,它正在被编程。 Ihis 的值将是永久的(它不能被标准 C 操作改变。你只能通过擦除 flash 和编程新值来改变它的值)