esp32 && 8266 freertos Task与partition api入门练习

前提:
自己规划 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 为用户模式

  1. 基于两个 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);
    
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值