ESP32专栏八 NVS存储

NVS Blob块存储

1. 演示app_main任务栈溢出

任务栈溢出

2. 设置app_main任务栈大小

打开menuconfig,输入main,如下图所示
默认栈大小
默认栈大小为3584字节,这里改为35840字节,重新编译
修改默认栈大小

3. Blob存储结果
#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "nvs.h"
#include "nvs_flash.h"

#define AP_MAX  40
#define TAG     "NVS"

typedef struct {
    char ssid[33];
    char passwd[34];
} ap_t;

void app_main(void)
{
    size_t length;
    nvs_handle_t handle;
    ap_t ap_write[AP_MAX] = {0};
    ap_t ap_read [AP_MAX] = {0};

    for (int i = 0; i < AP_MAX; i++) {
        strcpy(ap_write[i].ssid, "TPLINKHOST");
        strcpy(ap_write[i].passwd, "4018el9U");
    }

    nvs_flash_init();
    nvs_open("storage", NVS_READWRITE, &handle);
    nvs_set_blob(handle, "ap_info", ap_write, sizeof(ap_write));
    length = sizeof(ap_read);
    nvs_get_blob(handle, "ap_info", ap_read, &length);
    ESP_LOGI(TAG, "AP information list:");
    for (int i = 0; i < AP_MAX; i++) {
        ESP_LOGI(TAG, "AP(%d): ssid:%s passwd:%s", i, ap_read[i].ssid, ap_read[i].passwd);
    }
    nvs_commit(handle);
    nvs_close(handle);
}

执行结果

4. 启动流程

启动流程:

  1. 概述
    总体启动流程
  2. bootloader启动
    bootloader启动
  3. APP启动
    APPA应用程序启动

4. PartitionTable分区表

默认的PartitionTable分区表 (注意!!!ESP32和ESP32S3的Flash布局不同)
默认的Flash分区表
分区表描述
分区表
如何自定义分区表?

  1. 复制原始分区表到工程路径下
    分区表
  2. 默认分区表内容
    默认分区表内容
  3. 新增一个NVS分区
    新增分区表内容
  4. 重命名分区表文件
    重命名分区表文件
  5. menuconfig中输入partition,配置分区表
    重命名分区表文件
  6. 编译工程,可以看到编译报错,原因是Flash不够
    编译报错
  7. 打开menuconfig,输入flash,设置flash大小为8M
    重新设置flash大小为8M

5. 使用自定义的分区表

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "nvs.h"
#include "nvs_flash.h"

#define AP_MAX  2
#define TAG     "NVS"

typedef struct {
    char ssid[33];
    char passwd[64];
} ap_t;

void app_main(void)
{
    size_t length;
    nvs_handle_t handle;
    ap_t ap_write[AP_MAX] = {0};
    ap_t ap_read [AP_MAX] = {0};

    for (int i = 0; i < AP_MAX; i++) {
        strcpy(ap_write[i].ssid, "TPLINKHOST");
        strcpy(ap_write[i].passwd, "123456789");
    }

    nvs_flash_init_partition("mynvs");
    nvs_open_from_partition("mynvs", "storage", NVS_READWRITE, &handle);
    nvs_set_blob(handle, "ap_info", ap_write, sizeof(ap_write));
    length = sizeof(ap_read);
    nvs_get_blob(handle, "ap_info", ap_read, &length);
    ESP_LOGI(TAG, "AP information list:");
    for (int i = 0; i < AP_MAX; i++) {
        ESP_LOGI(TAG, "AP(%d): ssid:%s passwd:%s", i, ap_read[i].ssid, ap_read[i].passwd);
    }
    nvs_commit(handle);
    nvs_close(handle);
}

原来nvs_flash_init改为nvs_flash_init_partition, nvs_open改为nvs_open_from_partition, 这样就从默认的NVS分区,切换到我们自定义的mynvs分区。
执行结果
_init改为nvs_flash_init_partition, nvs_open改为nvs_open_from_partition`, 这样就从默认的NVS分区,切换到我们自定义的mynvs分区。
执行结果
运行结果

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值