ESP-IDF平台 , 将所有用到全局变量封装在一个结构体中,并存入到NVS, 芯片启动第一步即读出这个结构体变量,然后赋值给各硬件驱动c文件,任何一个驱动模块要改变全局变量,修改后,再存入NVS 重启动
时间: 2024-09-19 08:05:35 浏览: 54
esp-idf-v4.4.3
ESP-IDF平台是一个针对Espressif系列芯片(如ESP32和ESP8266)设计的应用框架,它主要用于构建物联网(IoT)应用程序。在这个框架中,为了管理全局变量并保持数据持久化,开发者通常会将关键配置信息存储在非易失性存储(NVS,Non-Volatile Storage)中,比如在启动阶段。
在应用初始化过程中,系统首先从NVS中加载预定义的全局变量结构体。这个结构体包含了硬件驱动所需的初始设置。例如:
```cpp
typedef struct GlobalConfig {
int ledPin;
float sensorValue;
bool networkMode;
} GlobalConfig_t;
// 在启动函数里
GlobalConfig_t globalConfig;
esp_err_t loadFromNVS(GlobalConfig_t* config) {
// 从NVS中读取并填充config结构体
}
loadFromNVS(&globalConfig);
```
各个硬件驱动程序在接收到新的全局变量后,可以通过指针`globalConfig`访问并应用新的设置。如果驱动需要更改全局变量,先更新结构体,然后保存回NVS:
```cpp
// 驱动程序中
void setLedPin(int pin) {
globalConfig.ledPin = pin;
saveToNVS(&globalConfig); // 存储回NVS
}
void saveToNVS(const GlobalConfig_t* config) {
esp_err_t err = nvs_flash_write("global_config", config, sizeof(GlobalConfig_t));
if (err != ESP_OK) {
// 错误处理...
}
}
```
这种做法的好处在于,数据持久化和模块间的通信更为高效,同时降低了因全局变量冲突而导致的问题。如果某个驱动模块要改变全局变量,只需简单地更新结构体并刷新NVS,无需关心其他部分如何同步。
阅读全文