ARM,指定section name的内容如何不被覆盖?

ARM, how the content of the specified section name is not overwritten?

我正在为 STM32F4 系列 MCU 使用 mbed-os 用 C++ 编写的固件。有一部分代码应该只在第一次启动时执行。为了实现这个目标,开发人员使用了一个名为 mysection 的内存段来存储一个名为 MAGIC_INIT_CODE 的标志。 mysectiontext 内存下的 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 和编程新值来改变它的值)