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

我想知道 MSPM0G 上是否有任何方法可以在启动或复位时不对变量进行零初始化、类似于 persistent属性 工作原理。
谢谢。此致、
SON。
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.
工具与软件:
使用了 "持久的 attribute" on 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 型设计尝试保存变量。
我也会继续仔细研究有关文件、相信我可以找到合适的解决办法。
但是、我仍然有两个最后的问题:
当 SRAM 始终通电时(通过引脚)、它的行为应该几乎像非易失性存储器一样。 那么、为什么在复位后无法保持最后的值呢? MSP430FR 可以做到这一点(我已经测试过在 OTA 工程中的 RAM 中保存一个变量)。 是这样吗?
另一个 MCU (STM32L151C8T)具有类似的存储器架构、但可以通过略微修改链接器中的 SRAM 配置来轻松实现。
你对这两个问题有什么想法吗?"
尊敬的 Goku:
当 SRAM 始终通电(通过引脚)时、其行为应几乎类似于非易失性存储器。 那么为什么在重置后无法保持最后的值?[/QUOT]是的、您回答正确。
让我来看看这个主题。
另一款 MCU、STM32L151C8T 具有类似的内存架构、但通过略微修改链接器中的 SRAM 配置可以轻松实现此目标我不熟悉这个器件。 您是否有任何关于如何修改 SRAM 链接器的参考?
B.R.
SAL
[/quote]
祝您度过美好的一天!


尊敬的 SON:
(如果自动执行) 电流环路 在检测到特定位的变化时?[/QUOT]否、由硬件控制。 我想它只会在 VDD 丢失或进入分流模式时闭合。
在我看来、手动触发 POR/BOR 通常不会复位 Vcore、Vcore 将保持不变、不会包括 VDD 损耗。
B.R.
SAL
非常感谢您、Sal、
然而、只有一点是、Vcore 可能不会进行下电上电、只有 PMU 模块进行下电上电。
我将再次查看 TRM 文档、并根据提供的表确定最适合该项目的方法!
非常感谢您在此主题为我提供的帮助!!
此致。
SON