【问题标题】:How to handle changes to settings during runtime of a embedded c project?如何在嵌入式 c 项目运行期间处理设置更改?
【发布时间】:2021-08-14 08:43:39
【问题描述】:

我正在使用 esp32(带有 esp-idf 的 c,而不是 arduino)用于我的一个爱好项目。我目前正在编写一个可以用智能手机控制的小型无人机。一切正常。

但现在我需要为持久设置和参数创建系统。例如 pid 调整参数或启用了哪些传感器等等。一般的想法是在启动时读取闪存中的设置文件。然后可以在程序的各个模块中使用这些设置。现在我还想在运行时更改这些设置。例如 pid 调整参数。我不想仅仅为了改变一个小参数而重启系统。

所以现在我的问题是:如何在运行时处理对这些设置的更改?

  • 一个想法是让模块定期询问一个特殊的 “设置模块”(如果有任何更改)。然后它会改变它的 相应的内部设置。因为设置不应该改变它 通常我认为不断要求更新的开销是相当大的 没必要。

  • 一个更极端的想法是,给一个指向变量的指针 对“设置模块”的问题。如果必须进行任何更改 设置模块会直接改变变量。

  • 或者也许是一个回调系统?

这些想法似乎可行,但我不知道是否有任何最佳实践或更好的选择。

你们中有人知道我可以在谷歌上搜索的技术的名称,或者可能提供类似功能的库吗?

谢谢!

【问题讨论】:

  • 您有一个程序还是多个程序?如果是单个程序,则将设置加载到结构中,并让程序的所有部分访问该结构。创建一个函数以将该结构保存到闪存中。使用结构的一个成员作为一个简单的计数器,每次更改都会递增。程序的一部分可以检查该计数器并与他们自己的副本进行比较。如果不同,则发生更改并可以采取适当的措施。
  • @fpiette 代码是模块化的,并作为由 FreeRTOS 管理的多个任务运行。如果我理解正确,您说将所有设置都放在全局可访问的结构中?有没有一种简单的方法来模块化这个?
  • 任务是在不同的线程中运行,还是单线程协同多任务?这对于以安全的方式管理对数据的访问非常重要。
  • 不是您的问题,但请记住闪存的写入周期数有限。不要频繁写入,否则会毁掉闪存!阅读this artcile

标签: c embedded settings esp32 freertos


【解决方案1】:

non-volatile storage library 已经满足了您 90% 的需求 - 字符串键、整数/字符串值、磨损均衡等。只需使用它来存储您的所有设置和参数。每次您想获得一个值时都读取它(除非您进入亚毫秒级延迟区域,在这种情况下,最好将设置缓存在 RAM 中)。

从 NVS 读取值可能会失败(例如,如果未存储参数,NVS 分区被擦除等),这会在您读取参数的每个代码块中引入繁琐的错误处理。避免这种错误处理的一个常见技巧是添加一个瘦包装器,它采用参数的后备值并在每次从 NVS 读取参数失败时返回它。像这样的:

uint32_t fetchU32(const char* key, const uint32_t fallback) {
  uint32_t ret;
  if (ESP_OK != nvs_get_u32(g_nvs_hnd, key, &ret)) {
    ret = fallback;
  }
  return ret;
}

请注意,使用此类包装器时需要小心 - 有时必须从 NVS 中找到关键参数值,而不是盲目地替换为后备。

【讨论】:

  • 承诺!薄包装的想法似乎对我的问题很有帮助。我会稍微玩一下 nvs_flash。我很乐意将您的回答标记为有帮助,但为此还需要多加几分。 :)
  • 享受乐趣并考虑 fpiette 的建议 - 闪存上的擦除周期限制为每个扇区大约 10000 次。如果你需要经常更新你的参数(比如每小时多次),你可以很容易地用掉一个小的 NVS 分区。您可以通过增加 NVS 分区的大小来解决此问题(因此磨损均衡算法可以将工作分散到更多扇区),但此解决方案仅随大小线性缩放。最好将经常更新的数据保存在 RAM 中。
【解决方案2】:

除了 Tarmo 的建议之外,您还应该注意 ESP32 的 NVS 没有写入限制。但请注意,限制是由您使用的闪存设置的。

我将link 放在他们讨论 ESP32 的写入限制的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多