Przy tworzeniu większych projektów zachodzi potrzeba przechowywania większej ilości danych na której będzie pracował mikrokontroler. Szczęśliwie ESP mają stosunkowo dużą pamięć flash a do tego twórcy tego urządzenia przewidzieli możliwość przeznaczenia części tej pamięci na SPIFFS. Czym jest SPIFFS? To bardzo prosty, płaski system plików, który świetnie sprawdza się na urządzeniach z małą ilością pamięci RAM. Trzeba mieć na uwadze, że posiada ograniczenia:

  • nie wspiera katalogów
  • nie gwarantuje przewidywalności w temacie czasów zapisu, operacje na danych najlepiej przeprowadzać przy uruchamianiu/wyłączaniu urządzenia
  • nie radzie sobie z uszkodzonymi sektorami

Ma jednak istotne zalety:

  • używa statycznie zdefiniowanych buforów w pamięci o rozmiarze niezależnym od ilości zgromadzonych plików
  • wspiera typowe operacje na plikach
  • implementuje statyczny mechanizm równoważenia zużycia pamięci flash

Obsługa SPIFFS w Arduino IDE

Obsługę SPIFFS w Arduino można dodać umieszczając w katalogu z IDE Arduino plik esp8266.jar który można pobrać stąd. Omawiany plik należy wypakować do ~/Arduino/tools/ESP8266FS/tool/esp8266.jar Następnie należy zrestartować Arduino IDE. Jeżeli wszystko się udało to w menu Narzędzia pojawi się pozycja ESP8266 Sketch Data Uploader W menu Narzędzia używając pozycji Flash size można wybrać jaki obszar pamięci kontrolera ma być przeznaczony na SPIFFS Dane które chcemy by były zapisane w SPIFFS należy umieścić w podkatalogu data katalogu szkicu nad którym pracujemy.

Błędy na dzień 2020.04.12

W pliku upload.py w toolkicie esp8266 2.6.1 trzeba dokonać pewnych modyfikacji by wszystko działało poprawnie.

cmdline = []
write_option = ''
+ write_addr = '0x0'
erase_addr = ''
erase_len = ''

@@ -45,6 +46,16 @@
        erase_len = sys.argv.pop(0)
        thisarg = ''

+    # Backwards compatibility with fs upload tools, eat --end
+    if thisarg == '--end':
+        thisarg = ''
+
+    # Backwards compatibility with fs upload tools, parse write_flash for later use
+    if thisarg == 'write_flash':
+        write_addr = sys.argv.pop(0)
+        binary = sys.argv.pop(0)
+        thisarg = ''

    if os.path.isfile(thisarg):
        binary = thisarg
        thisarg = ''
@@ -55,7 +66,7 @@
cmdline = cmdline + ['write_flash']
if len(write_option):
    cmdline = cmdline + [write_option]
- cmdline = cmdline + ['0x0', binary]
+ cmdline = cmdline + [write_addr, binary]

erase_file = ''
if len(erase_addr):

Poniżej pełny plik upload.py który działa z Arduino 1.8.12 i :

#!/usr/bin/env python3

# Wrapper for Arduino core / others that can call esptool.py possibly multiple times
# Adds pyserial to sys.path automatically based on the path of the current file

# First parameter is pyserial path, second is esptool path, then a series of command arguments separated with --end
# i.e. upload.py tools/pyserial tools/esptool erase_flash --end write_flash file 0x0 --end

import sys
import os
import tempfile

sys.argv.pop(0) # Remove executable name
toolspath = os.path.dirname(os.path.realpath(__file__)).replace('\\', '/') # CWD in UNIX format
try:
    sys.path.insert(0, toolspath + "/pyserial") # Add pyserial dir to search path
    sys.path.insert(0, toolspath + "/esptool") # Add esptool dir to search path
    import esptool # If this fails, we can't continue and will bomb below
except:
    sys.stderr.write("pyserial or esptool directories not found next to this upload.py tool.\n")
    sys.exit(1)

cmdline = []
write_option = ''
write_addr = '0x0'
erase_addr = ''
erase_len = ''

while len(sys.argv):
    thisarg = sys.argv.pop(0)

    # We silently replace the 921kbaud setting with 460k to enable backward
    # compatibility with the old esptool-ck.exe.  Esptool.py doesn't seem
    # work reliably at 921k, but is still significantly faster at 460kbaud.
    if thisarg == "921600":
        thisarg = "460800"

    # 'erase_flash' command is translated to the write_flash --erase-all option
    # https://github.com/esp8266/Arduino/issues/6755#issuecomment-553208688
    if thisarg == "erase_flash":
        write_option = '--erase-all'
        thisarg = ''

    if thisarg == 'erase_region':
        erase_addr = sys.argv.pop(0)
        erase_len = sys.argv.pop(0)
        thisarg = ''

 # Backwards compatibility with fs upload tools, eat --end
    if thisarg == '--end':
        thisarg = ''

    # Backwards compatibility with fs upload tools, parse write_flash for later use
    if thisarg == 'write_flash':
        write_addr = sys.argv.pop(0)
        binary = sys.argv.pop(0)
        thisarg = ''

    if os.path.isfile(thisarg):
        binary = thisarg
        thisarg = ''

    if len(thisarg):
        cmdline = cmdline + [thisarg]

cmdline = cmdline + ['write_flash']
if len(write_option):
    cmdline = cmdline + [write_option]
cmdline = cmdline + [write_addr, binary]

erase_file = ''
if len(erase_addr):
    # generate temporary empty (0xff) file
    eraser = tempfile.mkstemp()
    erase_file = eraser[1]
    os.write(eraser[0], bytearray([255] * int(erase_len, 0)))
    os.close(eraser[0])
    cmdline = cmdline + [ erase_addr, erase_file ]

esptool.main(cmdline)

if len(erase_file):
    os.remove(erase_file)

Plik należy umieścić w katalogu ~/.arduino15/packages/esp8266/hardware/esp8266/2.6.1/tools

Błędy w działaniu kontrolra korzystającego z SPIFFS

Jeżeli wgrywamy szkic do EPS używając programatora USB-UART trzeba mieć na uwadze, że zasilanie dostarczane z takiego programatora może być za słabe i podczas wgrywania danych mogą wystąpić przekłamnia. Prócz tego często podczas pracy układu zasilanie z programtora może być za mało wydaje i spowodować błędy w pracy. ESP należy zasilić z osobnego źródła prądu 3.3V przy czym nalezy mieć na uwadze, że programator i ESP muszą mieć wspólną masę.

Następny wpis