首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写arm皮层m4 nrf52的本地闪存中变量的初始化值

重写arm皮层m4 nrf52的本地闪存中变量的初始化值
EN

Stack Overflow用户
提问于 2018-02-21 01:41:54
回答 1查看 300关注 0票数 0

我想在闪存中有一个变量,它将在重置后保留我想要的值。我知道像这样的变量int test_data = 3存储在闪存的.data部分,然后在运行时复制到内存中。我希望在运行时修改存储在闪存中的变量test_data的值,以便在下次重新启动时加载不同的默认初始化值。

我知道可以在运行时写入闪存,但我不知道如何在闪存中找到test_variable的地址。你能在这个方向上给我一些提示吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-02-21 02:16:39

你提出的建议不太可能是实际的。闪存是字写,块擦除。无法重写单个字;必须将整个擦除块复制到RAM,修改副本中的值,擦除块,然后从修改后的RAM副本中写入整个块。希望在这个过程中不会被断电。

这可能是不可能的,因为你的RAM小于擦除块的大小。此外,如果SoC执行闪存中的代码,则块擦除很可能正在擦除正在执行的代码。

检查您的部件文档,但nRF52840只有相对较小的4Kb页面。因此,一个更好的解决方案是为您的配置/初始化数据保留一个页面,并在代码中读取该数据,并在启动时将其分配给适当的变量,而不是尝试重写链接器生成的代码/数据。更好的是,为了防止断电,请使用两个页面,其中包含您最后编写的序列号和验证;然后在启动时,具有最大有效序列号的页面就是正在使用的页面。当您修改数据时,您将覆盖较旧的数据-这样,如果在写入序列号和验证之前失败,您不会丢失所有数据。如果数据页为空,则使用链接器生成的初始化。

这只是您需要做的事情的概要--复杂程度取决于您。

如果您的应用程序具有硬实时约束;您可能需要检查内存总线在页面擦除/写入期间是否被阻塞-这可能会在擦除/写入期间停止执行包括中断处理程序在内的代码,并导致您错过最后期限。对于nRF52840,页面擦除时间最高可达85ms。如果这是一个问题,那么您最好使用外部EEPROM。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48891223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档