首页 文章

重写手臂皮质m4 nrf52的局部闪光中变量的初始值

提问于
浏览
0

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

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

谢谢 .

1 回答

  • 2

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

    这可能甚至不可能是您的RAM小于擦除块大小 . 此外,如果SoC从Flash执行代码,则块擦除可能正在擦除正在执行的代码 .

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

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

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

相关问题