esp32 && 8266 freertos Task与NVS api入门练习---(2)

本文介绍了如何使用ESP32和ESP8266的FreeRTOS任务以及NVS API进行实践操作。创建了两个任务,task3负责保存长度为100的二进制流到NVS,并通过通知机制将此操作告知task4。task4则从NVS中读取数据并以十六进制形式打印出来。预先规划了分区表,为NVS分配了100KB的空间,并为自定义参数区预留了相同大小的空间。
摘要由CSDN通过智能技术生成

前提:
自己规划 Partition table,要求 nvs 大小100KB,自自定义参数区大小 100KB

  1. 基于两个 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);
    

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值