如何处理嵌入式 c 项目运行时设置的更改?

How to handle changes to settings during runtime of a embedded c project?

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

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

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

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

你们中有人知道我可以使用的技术名称吗google 或者可能是提供类似内容的库?

谢谢!

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

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

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 中找到,而不是盲目地替换为后备。

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

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