前提:
自己规划 Partition table,要求 nvs 大小100KB,自自定义参数区大小 100KB
- 基于两个 task 实现如下功能(使用用NVS api)
2.1 task3 保存长度为 100 的二进制流,形式为
\0x00\0x01\0x02\0x03\0x04\0x05\0x06\0x07\0x08\0x09\0x00\0x01\0x02\0x03\0x04…,然后通知
到 task2
2.2 task4 取出 task1 保存到数据,并按照 十六进制打印出来
#include <stdio.h>
#include "esp_system.h"
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "rom/ets_sys.h"
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "nvs_flash.h"
#include <assert.h>
#include "esp_partition.h"
#include "esp_log.h"
#define MY_STRING_LEN 100
static EventGroupHandle_t receive_data_event;
const int CONNECTED_BIT = BIT0;
void vTask7( void *pvParameters )
{
uint8_t binary[MY_STRING_LEN + 1] = {0};
for (int i=0;i<MY_STRING_LEN;i++) {
binary[i]=(i+1)%10;
}
printf("Task1 Opening Non-Volatile Storage (NVS) handle... ");
nvs_handle my_handle;
esp_err_t err = nvs_open("my_storage", NVS_READWRITE, &my_handle);
printf("write:%s\n", binary);
err = nvs_set_blob(my_handle, "my_binary", binary,sizeof(binary));
err = nvs_commit(my_handle);
printf((err != ESP_OK) ? "Failed!\n" : "Done\n");
// Close
nvs_close(my_handle);
xEventGroupSetBits(receive_data_event, CONNECTED_BIT);
vTaskDelete(NULL);
}
void vTask8( void *pvParameters )
{
xEventGroupWaitBits(receive_data_event, CONNECTED_BIT,
false, true, portMAX_DELAY);
printf("\n");
printf("Task2 Opening Non-Volatile Storage (NVS) handle... ");
nvs_handle my_handle;
esp_err_t err = nvs_open("my_storage", NVS_READWRITE, &my_handle);
if (err != ESP_OK) {
printf("Error opening NVS handle!\n");
} else {
printf("Done\n");
}
uint8_t buf[101] = { 0 };
size_t buf_len = MY_STRING_LEN + 1;
esp_err_t ret = nvs_get_blob(my_handle, "my_binary", buf, &buf_len);
//printf("read:% x, ret:%d\n",buf, ret);
for(int i=0;i<100;i++)
{
printf("0x0%x",buf[i]);
}
// Close
nvs_close(my_handle);
vTaskDelete(NULL);
}
void app_main()
{
// Initialize NVS
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES ) {
// NVS partition was truncated and needs to be erased
// Retry nvs_flash_init
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
ESP_ERROR_CHECK( err );
receive_data_event = xEventGroupCreate();
xTaskCreate(vTask7,"Task7",4096, NULL,1,NULL);
xTaskCreate(vTask8,"Task8",4096,NULL,1,NULL);
}