如何处理嵌入式 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 写入限制的地方。
我正在玩一个 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 写入限制的地方。