Non-volatile Storage (NVS)
A NVS é uma biblioteca do ESP-IDF (IoT Development Framework, o conjunto de ferramentas e bibliotecas para desenvolvimento de aplicações nativas do ESP-32). O seu objetivo é armazenar informações na Flash (e eventualmente em outras formas de armazenamento não volátil). As informações são armazenadas na forma de pares chave/valor. Grupos de pares são armazenados em namespaces, para facilitar a separação das informações de várias aplicações ou módulos.
Atualmente a NVS salva as informações em uma partição da flash com tipo data e subtipo nvs. Normalmente esta partição tem o nome "nvs".
As chaves e namespaces são cadeias ASCII terminadas por nul, com até 15 caracteres (fora o nul final). Vários tipos de valores são suportados:
- Inteiros de 8, 16, 32 ou 64 bits, com ou sem sinal
- Cadeias ASCII terminadas por nul
- Dados binários de tamanho variável
- Os pares são armazenados de forma sequencial na flash, na forma de entradas de 32 bytes salvas em páginas da flash
- A busca por uma chave é feita procurando sequencialmente em uma lista de hashs das chaves. Desta forma a comparação é rápida (por usar um hash), porém a busca pode ser lenta se existir um número grande de pares.
- Após realizar escritas é necessário fazer um commit
- // Includes do ESP-IDF
- #include "esp_system.h"
- #include "nvs_flash.h"
- #include "nvs.h"
- // Definições dos meus nomes
- char *my_namespace = "DQSoft";
- char *chave = "Resets";
- // Iniciação
- void setup() {
- // Inicia serial
- Serial.begin(115200);
- // Inicia NVS
- esp_err_t err = nvs_flash_init();
- if (err != ESP_OK) {
- Serial.print ("Erro ao iniciar NVS: ");
- Serial.println (esp_err_to_name(err));
- return;
- }
- // Acessar o namespace
- nvs_handle my_handle;
- err = nvs_open(my_namespace, NVS_READWRITE, &my_handle);
- if (err != ESP_OK) {
- Serial.print ("Erro ao acessar namespace: ");
- Serial.println (esp_err_to_name(err));
- return;
- }
- // Tenta ler o contador de resets
- int32_t cont_resets = 0;
- err = nvs_get_i32(my_handle, chave, &cont_resets);
- cont_resets++;
- Serial.print ("Resets: ");
- Serial.println (cont_resets);
- // Atualiza
- err = nvs_set_i32(my_handle, chave, cont_resets);
- if (err != ESP_OK) {
- Serial.print ("Erro ao acessar atualizar: ");
- Serial.println (esp_err_to_name(err));
- return;
- }
- err = nvs_commit(my_handle);
- if (err != ESP_OK) {
- Serial.print ("Erro no commit: ");
- Serial.println (esp_err_to_name(err));
- return;
- }
- nvs_close (my_handle);
- }
- void loop() {
- delay(100);
- }
A biblioteca Preferences é uma camada fina por cima da biblioteca NVS, criando uma interface mais parecida com outras bibliotecas Arduino.
O programa abaixo faz o mesmo que o exemplo anterior, porém usa a biblioteca Preferences.
- // Acesso à biblioteca
- #include <Preferences.h>
- Preferences preferences;
- // Definições dos meus nomes
- char *my_namespace = "DQSoft";
- char *chave = "Resets";
- // Iniciações
- void setup() {
- // Inicia serial
- Serial.begin(115200);
- // Inicia acesso às nossas preferences
- preferences.begin(my_namespace, false);
- // Tenta ler o contador de resets
- int32_t cont_resets;
- cont_resets = preferences.getInt (chave, 0);
- cont_resets++;
- Serial.print ("Resets: ");
- Serial.println (cont_resets);
- // Atualiza
- preferences.putInt (chave, cont_resets);
- preferences.end();
- }
- void loop() {
- delay(100);
- }
Nenhum comentário:
Postar um comentário