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.

[参考译文] MSPM0G3507:如何在启动或复位时不将变量初始化为零

Guru**** 2460850 points
Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1478235/mspm0g3507-how-to-allows-a-variable-to-be-not-zero-initialized-at-startup-or-reset

器件型号:MSPM0G3507

工具与软件:

使用了 "持久的   attributeon MSPM0G3507、我看到该变量分配在 SRAM 中、并在重置或启动时重新初始化为0:

我想知道 MSPM0G 上是否有任何方法可以在启动或复位时不对变量进行零初始化、类似于  persistent属性 工作原理。

谢谢。此致、

SON。

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

    尊敬的 SON:

    下面是我以前使用的方法:

    --------------------------------------------------------

    您可以  在 cmd 文件中添加一个新存储器:

    SRAM_NOINIT (RWX):origin = 0x20200000、length = 0x00000200

    --------------------------------------------------------

    然后、您可以在 cmd 文件中添加一个新段:

    .NoInitSection :> SRAM_NON_INIT type=NOINIT

    --------------------------------------------------------

    之后、您可以在此新部分中设置变量:

    __attribute__((section (".NoInitSection"))) int32_t test = 0;

    --------------------------------------------------------

    至于持久性、您可以在 TI CLANG 用户指南中找到详细说明:

    https://software-dl.ti.com/codegen/docs/tiarmclang/compiler_tools_user_guide/ 

    一旦应用程序加载完毕、它也将被初始化。 复位期间、它应该再次未被初始化。

    如果我使用 ___ attribute __((persistent))、我将看到编译器警告:

    请在 cmd 文件中手动添加此部分、然后再试一次。

    B.R.

    SAL

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

    非常感谢!
    我遵照你的指示:
         

    存储在 SRAM 中 仅在级别0复位时重新初始化  如表中所述:  

    DL_SYSCTL_resetDevice (0);

    --------------------------------------------------------

    但是、当我执行硬件复位或其他复位级别时、该变量仍然会重新初始化。  

    我的操作是否正确、或者是否有办法防止变量 在任何复位时重新初始化(除了 通过 DL 函数将其存储在闪存中、因为这会消耗时间和资源)?

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

    尊敬的 Goku:

    在我看来、如果您要求变量未初始化、这意味着您想要维护数据。

    但是、当我执行硬件复位或其他复位级别时、该变量仍然被重新初始化。  [报价]

    它需要一个特定的值,当你 fisrt tun 应用程序。 或者、它将是一个随机值、对您的应用没有意义。

    也许你可以研究"c_int00"汇编代码、我不确定这里是否有在 BOR 内进行未初始化的方法。

    我做得是否正确、或者是否有办法防止变量 通过任何重置重新初始化

    MSPM0器件中确实有4个字节、 可以在 BOR 复位状态下保持、这意味着不会将其初始化。

    对于 POR 复位、我认为有任何方法可以保持除闪存之外的变量。

    B.R.

    SAL

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

    非常感谢您、Sal、
    在我的项目中、需要使用一个称为"volume_counter"的变量来持续为传感器的测量值分配该值 测量 (例如、用水量)。

    我无法持续擦除和写入闪存、然后为该变量重复读取它、因为 这非常耗时、并且闪存写入周期的数量被限制为1000000次 . 更糟糕的是、如果 MCU 在我写入闪存之前复位、测量可能会变得不准确。

    对于此项目最合适的解决方案、您有什么建议吗?

    非常感谢!

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

    尊敬的 Goku:

    考虑到 POR 复位、 此处需要一个 EEPROM 解决方案。

    它可以保留数据、即使在闪存写入中发生复位、也会将最后一次写入的值保持为正确的值。

    您可以在 SDK 中找到实施演示项目、而且我们在 TI.com 中提供了相关文档。

    [报价 userid="575068" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1478235/mspm0g3507-how-to-allows-a-variable-to-be-not-zero-initialized-at-startup-or-reset/5679803 #5679803"] 非常耗时 [报价]

    写入闪存的速度很快。 唯一的问题是管理闪存地址时的擦除操作。  

    [报价 userid="575068" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1478235/mspm0g3507-how-to-allows-a-variable-to-be-not-zero-initialized-at-startup-or-reset/5679803 #5679803"] 闪存写入周期数被限制为1000000次 .

    使用 EEPROM 时、 等效耐写次数将增加到1M 倍甚至更多(使用更多的闪存可将其增加)。

    B.R.

    SAL

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

    祝您度过美好的一天!
    我接下来将使用 EEPROM 仿真 B 型设计尝试保存变量。
    我也会继续仔细研究有关文件、相信我可以找到合适的解决办法。
    但是、我仍然有两个最后的问题:

    1. 当 SRAM 始终通电时(通过引脚)、它的行为应该几乎像非易失性存储器一样。 那么、为什么在复位后无法保持最后的值呢? MSP430FR 可以做到这一点(我已经测试过在 OTA 工程中的 RAM 中保存一个变量)。 是这样吗?

    2. 另一个 MCU (STM32L151C8T)具有类似的存储器架构、但可以通过略微修改链接器中的 SRAM 配置来轻松实现。

      你对这两个问题有什么想法吗?"

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

    尊敬的 Goku:

    当 SRAM 始终通电(通过引脚)时、其行为应几乎类似于非易失性存储器。 那么为什么在重置后无法保持最后的值?[/QUOT]

    是的、您回答正确。

    让我来看看这个主题。

    另一款 MCU、STM32L151C8T 具有类似的内存架构、但通过略微修改链接器中的 SRAM 配置可以轻松实现此目标

    我不熟悉这个器件。 您是否有任何关于如何修改 SRAM 链接器的参考?

    B.R.

    SAL

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

    祝您度过美好的一天!

    -我仔细阅读了关于各种复位级别和 PMCU 操作的文档,并确定 Vcore 是设备 存储器的电源。  
    -因此,任何导致的重置类型 '要对 VCORE 进行下电上电' 将导致 SRAM 丢失其值并需要重新初始化。
    *您是否知道在 复位时"VCORE 是功率循环"状态是否由软件(SW)控制、或者它是否由自动执行 电流环路 在检测到特定位的变化时会发生什么? 此外、如果由软件控制、是否可以修改相应的 ISR 复位?
    此致、
     SON



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

    尊敬的 SON:

    (如果自动执行) 电流环路 在检测到特定位的变化时?[/QUOT]

    否、由硬件控制。 我想它只会在 VDD 丢失或进入分流模式时闭合。

    在我看来、手动触发 POR/BOR 通常不会复位 Vcore、Vcore 将保持不变、不会包括 VDD 损耗。

    B.R.

    SAL

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

    谢谢 Sal、

    -根据该表,我注意到任何复位导致与一个复位级别对应的,导致 SRAM 被标记为'R'也会影响 Vcore 和原因 对 Vcore 进行功率循环 (如文档中所述)

    -由于 Vcore 受到影响,我相信无论变量是如何分配的,只要它位于 SRAM 区域内,它就会被重置并丢失值。

    你同意我的说法吗?

    此致。

    SON

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

    尊敬的 SON:

    是的、我同意您的意见。 我想在 TRM 中了解一下这个信息。

    然而、只有一个问题是、Vcore 可能不会进行下电上电、仅对 PMU 模块进行下电上电。

    是的、因此、所有 SRAM 内容都不会维护。

    B.R.

    SAL

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

    非常感谢您、Sal、

    然而、只有一点是、Vcore 可能不会进行下电上电、只有 PMU 模块进行下电上电。

    我将再次查看 TRM 文档、并根据提供的表确定最适合该项目的方法!

    非常感谢您在此主题为我提供的帮助!!

    此致。

    SON

     

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

    尊敬的 SON:

    感谢您的反馈。 我将关闭该主题帖、如果还有其他问题、可随时提交新主题帖。

    B.R.

    SAL