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.

[参考译文] MSP430FR5964:防止在程序加载时初始化 NVS 数据

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1027905/msp430fr5964-preventing-initialisation-of-nvs-data-on-program-load

器件型号:MSP430FR5964

我一直在使用 MSP MCU FRAM 实用程序中的 NVS 实用程序、几乎可以按预期工作、但效果不是很好! NVS 数据正在 FRAM 中正确定位、并在重新启动时保留、但如果我重新加载代码、则会重新初始化。 我猜这是一件很重要的事情、但我错过了-希望有人能给我指正确的方向。 下面是我所做的工作以及我目前所处的位置的一个前提。 我使用的是 GCC 工具链和 Studio 10.4。

首先、使用以下命令将 NVS 存储分配给.persistent 段;

uint8_t NVS_DATA[NVS_DATA_STORAGE_SIZE (sizeof (NVS_DATA_t))]__attribute__((section (".persistent")));

在映射和调试器中、所有这些都正确地位于 FRAM 中的.persistent 段(5964处理器中的0x4xxx)。

从该 处理器的链接器.ld 脚本中、相应的段为;

/*此段包含加载期间初始化的数据
  但不在应用程序复位时。 *
.persistent (持久):

  。 =对齐(2);
  提供(__persistent_start =.);
  *(.persistent)
  。 =对齐(2);
  提供(__persistent_end =.);
}> FRAM

我的第一个尝试是、这应该包括一个(NoLoad)指令来 抑制加载期间的初始化、但这似乎没有什么不同。 从对调试器进行透视、NVS 数据在 NVS 执行其自身验证之前肯定已重新初始化。

我有什么想法出错了吗?

Andrew

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

    在.noinit 段的一些类似问题上找到了非常相关的注释...

    默认情况下、mspflaser 使用"-e ERASE_All"将所有程序存储器(FRAM)清零为0xFF。 [参考 MSPFlasher UG (SLAU654E)表1]。 您可以使用"-e NO_ERASE"或"-e ERASE_SEGM"做得更好。  

    这似乎正是我看到的情况- NVS 存储器返回为0xFF。

    我一直在尝试弄清楚如何配置和/或抑制 CCS 内被擦除的内容。 在项目属性、调试-> MSP430闪存设置下、有一些擦除选项、但似乎没有任何防止完全擦除的选项、或以某种方式根据特定部分进行定制。 我想我可以抑制特定的存储器范围、但这会将抑制 与特定构建的映射紧密相连。 通过此路由的另一种选择是抑制整个 FRAM 的擦除、如果我需要的话、这可能是一个很小的问题。

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

    未找到任何使用 CCS 抑制擦除的显式方法。 我尝试将擦除设置为0..0 (一个粗略的想法)的特定地址范围、但这也会擦除所有内容。 我尝试了一个表、表示空范围刚刚被忽略、因此将擦除范围设置为0..1、它最终将仅保留 FRAM、而我的 NVS 将继续重新加载。 必须有更好的方法?

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

    我建议您将 NVS 放入信息内存中。

    然后、您可以使用默认擦除设置。

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

    遗憾的是、在4 x 128字节时、信息内存段很小、 不足以满足我的需求。 将 FRAM 块映射到 NVS 似乎完全符合所需的操作、而不是管理被擦除的操作。

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

    您可以尝试按地址范围设置

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

    目前这正是我所做的。

    由于没有任何方法可以定义擦除的内容(例如、擦除除除除除除该区域之外的所有内容)、因此我选择尽可能接近"擦除无"策略。 这似乎也不是通过 CCS 直接支持的? 如上所述、我已尝试让它从地址0到0擦除所有内容、这本可以完成此操作、但它似乎忽略空地址范围、然后继续擦除所有内容。 我目前已让它擦除地址0到1的所有内容、这似乎不会导致任何问题、并且只剩下存储器空间。

    随着 FRAM 的出现以及可供利用的非易失性选项(FRAM 实用程序正在执行的操作)的出现、这会让人感觉有点受限。 如果有真正的抑制擦除的选项会更好、因为它们对于非易失性模型的工作至关重要。 如果可以将其视为存储器段级别、则创建 NVS 段非常容易、并让加载器保留该级别(我不知道加载器是否可以访问该级别的存储器元数据、因此在技术上甚至不可能?)。  

    感谢您的评论。 我将关闭它、因为我很确定我已经到达了这条特定道路的尽头!

    Andrew