This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5969:将 persistent 与 C++类配合使用

Guru**** 2927270 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1652834/msp430fr5969-using-persistent-with-c-class

器件型号: MSP430FR5969

你好。 我正在处理传感器固件、其中传感器逻辑的状态封装在 C++“传感器“类中。 我希望类的状态在下电上电过程中保持不变、但在加载程序时进行初始化。 我知道、在 C 语言中、如果类替换为结构体、我在声明中手动初始化它、并在程序中省略 sensor_init () 函数调用、则可以使用 persistent pragma 来完成此操作。 但对于 C++、我担心每次 MCU 重置时、类的构造函数将运行并重新初始化类。 在 C 语言中、我可以手动省略对 init 函数的调用、在 C++中、我不确定如何复制它。 是否有方法可以使用 C++类获得所需的行为、或者是否是采用 C 语言的唯一选择?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    让您的构造函数在数据中寻找“幻数“-我喜欢 0xDEADBEEF — 。 如果存在、则无需初始化。 如果不存在、请使用幻数和初始值初始化持久性区域。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以在 C++中实现此目的、而无需完全恢复到原始 C!。 C++的主要关注点是编译器的启动例程对静态/全局对象进行的隐藏初始化。 为避免在每次复位时运行构造函数并覆盖持续状态、可以使用一些定制的嵌入式 C++方法:

    • 您可以将传感器类封装在包装结构中。 这使您能够将包装器放置在持久存储器段中、同时确保底层状态与自动初始化 C++构造函数安全分离。
    • 如果整个 Sensor 类需要标记为永久性、则必须阻止编译器在程序启动时生成构造函数。 将类声明为具有平凡或删除构造函数的普通旧数据 (plain Old Data, POD) 结构/类。 链接器将其放入持久存储器段后、您可以在运行时使用放置方式 new 将 C++类方法“附加“到持久数据
    • 如果您的传感器状态只需要在硬件复位后(但完全断电时擦除)、则大多数嵌入式工具链支持使用编译器属性将 C++对象放入.noinit 段中。

    此外、我认为 Keith 对实现这一点也有很好的想法。 希望这对您有所帮助!

    -布赖恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Brian! 我最终选择了选项 1、它对我来说已经足够好了。 感谢分享选项 2、也许我可以调查一下、并学习一些新内容!