Sistema de arquivos ESP32 e SPIFFS


SPIFFS - (Sistema de arquivos Flash da Interface Periférica Serial) para memória flash conectada por uma interface periférica serial. Em palavras simples: existe um microcontrolador ESP32 (Figura 1), que possui uma memória NOR não volátil regravável, que armazena: Preferências, gerenciador de inicialização, firmware (esboço compilado), sistema de arquivos (SPIFFS) e outra coisa algo como uma atualização over-the-air (OTA).



Figura 1. Diagrama de blocos funcionais do microcontrolador ESP32


A memória NOR é um tipo de memória regravável não volátil que possui uma velocidade de leitura bastante alta, velocidade de gravação e exclusão relativamente baixa, em comparação com o tipo de memória NAND . É quase impossível encontrar memória NOR de grande capacidade, geralmente limitada a 128 MB. No caso do ESP32 - quatro .


Hoje, o SPIFFS tem algumas desvantagens. falhas , incluindo: falta de suporte a pastas; não é uma pilha em tempo real; portanto, a mesma operação pode levar tempos diferentes; falta de habilidade para encontrar e consertar blocos quebrados. Se as deficiências listadas não são críticas para você, continuamos a ler o próximo parágrafo.


Vamos falar sobre o uso


Infelizmente, fora da caixa, a memória do microcontrolador não está marcada como SPIFFS. Para marcá-la, você precisa usar o plug- in ESP32FS para o ambiente de desenvolvimento do Arduino IDE.


Após o download do plug-in, ele deve ser instalado:


  • Verifique se você possui a versão mais recente do ambiente de desenvolvimento do Arduino IDE e o driver do seu dispositivo no ESP32 instalado . Eu tenho o driver M5Stack CP210X que eu baixo deste link;
  • Copie a pasta da ferramenta baixada com o plug-in incorporado na pasta / Arduino / tools / ESP32FS / ;
  • No macOS, a pasta está localizada em ~ / Documents / Arduino / ;
  • Reinicie o computador e verifique no ambiente de desenvolvimento no menu Ferramentas o item Upload de dados de esboço do ESP32 aparece (Figura 2) - isso significa que você fez tudo corretamente;


Figura 2. Menu Ferramentas


  • Preste atenção na pasta de dados localizada ao lado do esboço. Todos os arquivos localizados nesta pasta serão carregados na memória do dispositivo durante a formatação;
  • Sinta-se livre para selecionar o item indicado e aguarde até o final da formatação da área de memória. Observe que outras seções da memória NÃO serão afetadas, o que significa que o firmware permanecerá na memória do dispositivo e funcionará. Da mesma forma que no esboço, quando ele é compilado no firmware e baixado no dispositivo, o sistema de arquivos não será afetado.

Se você quer conforto


  • Se você quiser tocar em arquivos e ver informações sobre espaço livre, faça o download do esboço BRIDGE e faça o flash do dispositivo.


  • Também baixar e compilar gerenciador de arquivos de plataforma cruzada A-Explorer (Figura 3). No GitHub, os binários em breve estarão na pasta bin .



    Figura 3 a. Gerenciador de arquivos A-Explorer para macOS



    Figura 3, b. Gerenciador de arquivos A-Explorer para Windows



Este gerenciador de arquivos permitirá que você descubra informações sobre espaço livre, carregue / faça o download / exclua arquivos. Há uma indicação do andamento da operação.


Como você pode ver na Figura 3, o plug-in alocou aproximadamente 1,38 MB de memória no SPIFFS.


Quem é essa PONTE?


O BRIDGE é um esboço e, antes de tudo, uma função com o mesmo nome que funciona com o sistema de arquivos SPIFFS e o A-Explorer é um shell gráfico para ele. O último envia um comando ou outro, e essa função o processa no próprio dispositivo usando as bibliotecas FS e SPIFFS . Vamos ver o que é interessante nessas bibliotecas.


Vamos começar examinando os métodos públicos da classe SPIFFS :


  • Método Bool Begin (bool formatOnFail = false, const char * basePath = "/ spiffs", uint8_t maxOpenFiles = 10). Este método tenta inicializar uma instância da classe. O primeiro argumento é verdadeiro ou falso, caso o sistema de arquivos deva ser formatado se o sistema de arquivos não estiver formatado. O segundo argumento segue o caminho onde a raiz do sistema de arquivos estará localizada. O terceiro argumento determinará o número de arquivos abertos simultaneamente. É melhor deixar os dois últimos parâmetros padrão e não alterá-los. Se o sistema de arquivos estiver ausente (o plugin acima não foi usado). então a função retornará false.


  • O método bool format () verifica se o sistema de arquivos está formatado - retorna true, caso contrário - false.


  • Método size_t totalBytes (). Este método retorna o número size_t do número total de bytes alocados para o sistema de arquivos.


  • Método Size_t usedBytes (). Este método retorna o número size_t de bytes usados ​​no sistema de arquivos.


  • Anule o método end (). Esse método desinicializa essa classe. Depois de chamar esse método, não faz sentido chamar outros métodos.



Tudo nesta classe, não há nada particularmente interessante. Vamos passar para a classe FS e ver o que pode ser útil a partir daí.


  • A primeira coisa que chama sua atenção é o método inicializador da classe bool begin (). Este método não requer argumentos e não é necessário chamá-lo, porque usaremos o próximo método imediatamente.


  • O método File open (const char path, modo const char ) e seu irmão File open (const String & path, const char * mode). Esses métodos usam dois argumentos, o primeiro dos quais é um ponteiro simbólico e de seqüência de caracteres para o caminho do arquivo e o segundo é o modo de abertura, que pode ser a seguinte constante:



FILE_READ - aberto apenas para leitura;


FILE_WRITE - aberto apenas para gravação;


FILE_APPEND - aberto para substituição.


Depois que abrimos o arquivo, agora podemos executar quaisquer operações nele.


  • O método size_t write (uint8_t) permite gravar um número inteiro não assinado de 8 bits no final do arquivo.
  • O método de gravação size_t (const uint8_t * buf, size_t size) permite escrever uma série de números inteiros não assinados do comprimento especificado no segundo argumento.
  • O método int available () conta o número de caracteres do final ao ponteiro.
  • O método int read () lê um caractere do arquivo e o retorna como um número inteiro, enquanto o cursor move uma unidade para a direita.
  • O método size_t readBytes (char * buffer, size_t length) lê caracteres no buffer apontado pelo primeiro argumento e o número de caracteres passados ​​pelo segundo argumento. Retorna o número de caracteres lidos.
  • O método String readString () lê uma linha de um arquivo.
  • O método int peek () funciona de maneira semelhante ao método int read (), apenas o cursor permanece no lugar.
  • O método bool seek (uint32_t pos, modo SeekMode) e bool seek (modo uint32_t pos, modo SeekMode) define o cursor para o local especificado. A posição é passada como o primeiro argumento e a segunda regra ( SeekSet - defina o cursor). Se for bem-sucedido - retorna verdadeiro, caso contrário - falso.
  • O método size_t position () retorna a posição do cursor.
  • O método size_t size () retorna o tamanho do arquivo em bytes.
  • O método const char * name () retorna o nome do arquivo.
  • O método const char * fullName (), levando em consideração o caminho completo.
  • O método bool isFile () retornará true se o objeto aberto for um arquivo. Caso contrário - uma mentira.
  • O método bool isDirectory () retornará true se o objeto aberto for uma pasta. Caso contrário - uma mentira.
  • O método File openNextFile () retorna um ponteiro para o próximo arquivo na raiz, caso contrário, NULL.
  • Os métodos bool existe (const char * path) e bool existe (const String & path) tomam o nome completo do arquivo como argumento e, se esse arquivo existe, ele retorna true, caso contrário, retorna false.
  • Os métodos bool remove (const char * path) e bool remove (const String & path) tentam excluir o arquivo cujo nome é passado pelo argumento. Se for bem-sucedido, retorna verdadeiro, caso contrário - falso.
  • Método bool rename (const char pathFrom, const char pathTo) e bool rename (const String & pathFrom, const String & pathTo); aceita o nome completo do arquivo como o primeiro argumento e o segundo como o novo nome completo do arquivo e renomeia-o.

Sim, sim, você pode pegar essa função e executá-la em um thread separado em qualquer outro esboço


Muito obrigado pelo seu tempo! Ficaria feliz se este artigo o beneficiar.


Referências e (ou) fontes:


  • Sistema de arquivos SPIFFS aqui
  • Trabalhe com o sistema de arquivos no complemento ESP8266 no IDE do Arduino aqui
  • Uploader do sistema de arquivos Arduino ESP32 aqui

Source: https://habr.com/ru/post/pt483280/


All Articles