c - 在 arm cortex m4 nrf52 的本地闪存中重写变量的初始化值

标签 c gcc embedded cortex-m

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

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

谢谢。

最佳答案

您提出的建议不太可能实用。闪存是字写入、 block 删除。重写一个单词是不可能的;您必须将整个删除 block 复制到 RAM,修改副本中的值,删除 block ,然后从修改后的 RAM 副本写入整个 block 。希望过程中不要断电。

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

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

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

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

关于c - 在 arm cortex m4 nrf52 的本地闪存中重写变量的初始化值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48891223/

相关文章:

c - 无符号指针的非法隐式转换

c - 当我调用 jmp 时,我在 c 内联汇编中遇到了段错误

c - Microblaze 多中断代码不起作用

c++ - 如何在C中写入特定地址的数据

c++ - 为什么 gcc 不能去虚拟化这个函数调用?

embedded - open ("/dev/i2c-1",O_RDWR) 返回-1, i2c-1 设备无法打开

c++ - 如何使用 vApplicationTickHook() 函数测量 freeRTOS 中的任务执行时间?

c++ - undefined reference gcc cxa

c++ - 在angstrom上编译c/c++程序

c - 如何在嵌入式 C 中读取来自 GSM 调制解调器的消息?