当前位置: 首页 > news >正文

第8章 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分区。
执行结果
运行结果

相关文章:

  • 中纪委网站关于加强廉政建设/韶关疫情最新消息
  • 免费的源码分享网站/一站传媒seo优化
  • 宁夏找人做网站多少钱/推广引流工具
  • 做web网站原型设计/免费crm网站不用下载的软件
  • 做空eth网站/站长工具星空传媒
  • 山东世界500强企业/佛山网站优化排名推广
  • 【Android笔记67】Android之动态申请访问权限(工具类封装)
  • Pytorch自定义数据集模型训练流程
  • QEMU零知识学习3 —— QEMU配置
  • k8s之挂载本地磁盘到POD中
  • Spring国际化详解,Spring国家化实例及源码详解
  • 解决Windows Server远程断开后自动锁屏问题
  • 系分 - 案例分析 - 系统设计
  • 基于有向图的邻接矩阵计算其割点、割边、压缩图,并用networkx可视化绘制
  • 【进阶】Spring更简单的读取和存储对象
  • C++内存分配方法new与placement new使用方法详解
  • [ACTF2020 新生赛]BackupFile
  • 自动化测试 | 这些常用测试平台,你们公司在用的是哪些呢?