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
的标志。 mysection
在 text
内存下的 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<uint32_t>(&__mysection_start__), reinterpret_cast<uint8_t*>(&voidMagicCode) , 8, false);
将零写入mysection
的起始地址。否则,备份代码将在每次启动时执行,事实是它仅在第一次启动时执行。这是ProgramFlash
的原型,如果有帮助的话:int c_Micro_Flash::ProgramFlash( uint32_t Address, uint8_t* Data, uint32_t size, bool autoErase )
要了解它,您需要阅读参考手册 - FLASH 部分。您将了解程序如何更改 FLASH 内容。以上是关于ARM,指定段名的内容怎么不被覆盖?的主要内容,如果未能解决你的问题,请参考以下文章
将子视图添加到 self.view 但让某些子视图内容不被添加的子视图覆盖
labview中制作一个选项卡按钮设置好背景,放入进去的控件怎么才能不被覆盖