前提:
自己规划 Partition table,要求 nvs 大小100KB,自自定义参数区大小 100KB
# Espressif ESP32 Partition Table
# Name, Type, SubType, Offset, Size, Flags
otadata, data, ota, 0xd000, 0x2000,
phy_init, data, phy, 0xf000, 0x1000,
factory, 0, 0, 0x10000, 1M,
ota_0, 0, ota_0, 0x110000, 0xE0000,
nvs, data, nvs, 0x1f0000,100K,
ota_1, 0, ota_1, 0x210000, 0xE0000,
userdata, 0x40, 0x00, 0x2f0000, 100K,
make menuconfig 设置partition 为用户模式
- 基于两个 task 实现如下功能(使用用partition api)
4.1 task5 保存⻓长度为 2000 的字符串串,形式为 “12345678901234567890…",然后通知 到 task2
4.2 task6 取出 task1 保存到数据,并按照 字符串串打印出来
#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"
static const char *TAG = "my_example";
static EventGroupHandle_t receive_data_event;
const int CONNECTED_BIT = BIT0;
#define MY_STRING_LEN 100
#define MY_STRING_LEN_2000 2000
#define BIN_LEN 100
// Get the string name of type enum values used in this example
static const char* get_type_str(esp_partition_type_t type)
{
switch(type) {
case ESP_PARTITION_TYPE_APP:
return "ESP_PARTITION_TYPE_APP";
case ESP_PARTITION_TYPE_DATA:
return "ESP_PARTITION_TYPE_DATA";
default:
return "UNKNOWN_PARTITION_TYPE"; // type not used in this example
}
}
// Get the string name of subtype enum values used in this example
static const char* get_subtype_str(esp_partition_subtype_t subtype)
{
switch(subtype) {
case ESP_PARTITION_SUBTYPE_DATA_NVS:
return "ESP_PARTITION_SUBTYPE_DATA_NVS";
case ESP_PARTITION_SUBTYPE_DATA_PHY:
return "ESP_PARTITION_SUBTYPE_DATA_PHY";
case ESP_PARTITION_SUBTYPE_APP_FACTORY:
return "ESP_PARTITION_SUBTYPE_APP_FACTORY";
case ESP_PARTITION_SUBTYPE_DATA_FAT:
return "ESP_PARTITION_SUBTYPE_DATA_FAT";
default:
return "UNKNOWN_PARTITION_SUBTYPE"; // subtype not used in this example
}
}
// Find the partition using given parameters
static void find_partition(esp_partition_type_t type, esp_partition_subtype_t subtype, const char* name)
{
ESP_LOGI(TAG, "Find partition with type %s, subtype %s, label %s...", get_type_str(type), get_subtype_str(subtype),
name == NULL ? "NULL (unspecified)" : name);
const esp_partition_t * part = esp_partition_find_first(type, subtype, name);
ESP_LOGI(TAG, "\tfound partition '%s' at offset 0x%x with size 0x%x", part->label, part->address, part->size);
}
void vTask1( void *pvParameters )
{
const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, NULL);
char str[MY_STRING_LEN_2000 + 1] = {0};
for (int i=0;i<MY_STRING_LEN_2000;i++) {
str[i]=(char)(((i+1)%10)+'0');
}
static char read_data[sizeof(str)];
printf("str=%s\n",str);
// printf("read_data=%d\n",sizeof(str));
// memset(read_data, 0xFF, sizeof(read_data));
ESP_ERROR_CHECK(esp_partition_erase_range(partition, 0, partition->size));
ESP_ERROR_CHECK(esp_partition_write(partition, 0, str, sizeof(str)));
ESP_LOGI(TAG, "Written data: %s", str);
xEventGroupSetBits(receive_data_event, CONNECTED_BIT);
vTaskDelete(NULL);
}
void vTask2( void *pvParameters )
{
xEventGroupWaitBits(receive_data_event, CONNECTED_BIT,
false, true, portMAX_DELAY);
const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, NULL);
char buf[2001] = { 0 };
size_t buf_len = MY_STRING_LEN_2000 + 1;
ESP_ERROR_CHECK(esp_partition_read(partition, 0, buf, sizeof(buf)));
ESP_LOGI(TAG, "Read data: %s", buf);
vTaskDelete(NULL);
}
void app_main()
{
extern const char csv_start[] asm("_binary_partitions_csv_start");
extern const char csv_end[] asm("_binary_partitions_csv_end");
ESP_LOGI(TAG, "Printing partition table csv file contents for reference...\n\n%.*s", csv_end - csv_start + 1, csv_start);
ESP_LOGI(TAG,"------------------find partition--------------");
find_partition(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS, NULL);
find_partition(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_PHY, NULL);
find_partition(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL);
receive_data_event = xEventGroupCreate();
//2000
xTaskCreate(vTask1,"Task1",4096, NULL,1,NULL);
xTaskCreate(vTask2,"Task2",4096,NULL,1,NULL);
}