ARM,指定段名的内容怎么不被覆盖?

Posted

技术标签:

【中文标题】ARM,指定段名的内容怎么不被覆盖?【英文标题】:ARM, how the content of the specified section name is not overwritten? 【发布时间】:2021-10-12 15:41:28 【问题描述】:

我正在为 STM32F4 系列 MCU 使用带有 mbed-os 的 C++ 编写的固件。有一部分代码应该只在第一次启动时执行。为了实现这一目标,开发人员使用名为mysection 的内存部分来存储名为MAGIC_INIT_CODE 的标志。 mysectiontext 内存下的 ARM_GCC 编译器链接器文件中定义。 mysection 的内容在一开始写在下面几行,就在包含标题之后:

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呢?

【问题讨论】:

【参考方案1】:

这一行将uint64_t 对象放入.mysection 部分并将其初始化为MAGIC_INIT_CODE。如果.mysection 放在闪存中,它将永久存在。当您将程序上传到您的微型计算机时,它正在被编程。他的值将是永久的(它不能被标准的C操作改变。你只能通过擦除闪存和编程新值来改变它的值)

【讨论】:

我明白了。但是FW_Manager_Interface.MicroFlash.ProgramFlash(reinterpret_cast&lt;uint32_t&gt;(&amp;__mysection_start__), reinterpret_cast&lt;uint8_t*&gt;(&amp;voidMagicCode) , 8, false); 将零写入mysection 的起始地址。否则,备份代码将在每次启动时执行,事实是它仅在第一次启动时执行。这是ProgramFlash的原型,如果有帮助的话:int c_Micro_Flash::ProgramFlash( uint32_t Address, uint8_t* Data, uint32_t size, bool autoErase ) 要了解它,您需要阅读参考手册 - FLASH 部分。您将了解程序如何更改 FLASH 内容。

以上是关于ARM,指定段名的内容怎么不被覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

Python file重复写入之前的内容不被后写入的覆盖

将子视图添加到 self.view 但让某些子视图内容不被添加的子视图覆盖

如何让python循环写入文档的内容不被后面写入的内容覆盖

labview中制作一个选项卡按钮设置好背景,放入进去的控件怎么才能不被覆盖

labview中制作一个选项卡按钮设置好背景,放入进去的控件怎么才能不被覆盖

抽象类类型...不允许,纯虚函数不被覆盖