繁体   English   中英

在Arm Cortex M4 NRF52的局部Flash中重写变量的初始化值

[英]Rewriting the initialised value of a variable in the local flash of a arm cortex m4 nrf52

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

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

谢谢。

您提出的建议不太实际。 闪存是可写的,块擦除的。 不能重写单个单词; 您必须将整个擦除块复制到RAM,修改副本中的值,擦除该块,然后从修改后的RAM副本中写入整个块。 希望在此过程中不断开电源。

这可能甚至不可能,因为您的RAM小于擦除块的大小。 此外,如果SoC从闪存执行代码,则块擦除可能会擦除正在执行的代码。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM