You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32芯片镜像构建时如何设置类环境变量?

在ESP32构建镜像时使用“类环境变量”参数的方案

当然可以实现无需修改参数就重新编译整个程序的需求,以下是几种实用的落地方案:

1. 利用NVS(非易失性存储)存储动态参数

ESP32自带的NVS是专门用于存储小量非易失性数据的区域,你可以把需要调整的参数存在这里,程序启动时自动读取,完全不需要重新编译镜像。

  • 核心实现步骤:
    • 初始化NVS分区:
      nvs_handle_t config_handle;
      esp_err_t err = nvs_open("device_config", NVS_READWRITE, &config_handle);
      if (err != ESP_OK) {
          // 处理初始化异常
      }
      
    • 动态写入参数(可通过串口指令、WiFi配网工具等方式操作,无需编译):
      err = nvs_set_str(config_handle, "mqtt_broker", "tcp://mqtt.example.com:1883");
      err = nvs_commit(config_handle);
      
    • 程序启动时读取参数:
      char broker_addr[64];
      size_t addr_len = sizeof(broker_addr);
      err = nvs_get_str(config_handle, "mqtt_broker", broker_addr, &addr_len);
      
  • 优势:参数断电不丢失,修改后重启设备即可生效,适合部署后调整设备配置。

2. 自定义分区表存储配置

你可以在ESP32的分区表中单独划分一个小分区,用自定义格式(比如JSON、二进制结构体)存储复杂配置,同样支持动态修改。

  • 关键操作:
    • 修改partitions.csv添加自定义分区:
      # Name,   Type, SubType, Offset,  Size, Flags
      device_cfg,data, custom, 0x12000, 0x2000,
      
    • 使用esp_partition API读写该分区:
      const esp_partition_t* cfg_part = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_CUSTOM, "device_cfg");
      esp_partition_read(cfg_part, 0, &device_settings, sizeof(device_settings));
      
  • 优势:比NVS更灵活,适合存储结构复杂的多参数配置。

3. 启动时从外部加载配置

如果参数需要从设备外部获取,可以在程序启动阶段通过串口接收配置,或者连接WiFi后从远程服务器拉取最新参数,完全脱离编译流程。

  • 典型场景:
    • 设备上电后进入配网模式,通过手机APP下发配置参数,存储到NVS后进入正常运行状态。
    • 通过串口发送指令临时调整参数,无需重启或编译。

和#define的核心差异

以上方案都彻底避免了修改参数后重新编译整个程序的问题,尤其是NVS和自定义分区的方式,参数直接存储在设备本地,调整成本极低,非常适合需要频繁修改配置的场景。

内容的提问来源于stack exchange,提问作者Alex Flint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:17:05