Перейти к содержанию
Материалы раздела

Файловая система

Поддерживаемые файловые системы

ROMFS

ROMFS содержит файлы, поставляемые вместе с прошивкой. Она доступна только для чтения и подходит для библиотек, примеров и других ресурсов, которые должны обновляться вместе с прошивкой.

Преимущества ROMFS:

  • файлы не занимают место в пользовательском разделе;
  • содержимое обновляется вместе с прошивкой через OTA;
  • для работы требуется мало оперативной памяти.

RAMFS

RAMFS хранит файлы в оперативной памяти. После перезагрузки всё её содержимое удаляется, поэтому она подходит только для временных данных. Например, RAMFS можно использовать для истории команд консоли:

-- Подключить RAMFS в каталоге /rfs
fs.mount("/rfs", "ramfs")

-- Включить историю команд
os.history(true)

LittleFS (LFS)

LittleFS предназначена для устройств с ограниченным объёмом памяти и сохраняет устойчивость при внезапном отключении питания. Динамическое выравнивание износа помогает продлить срок службы флеш-памяти.

SPIFFS

SPIFFS предназначена для встроенных устройств и требует мало оперативной памяти. Статическое выравнивание износа помогает продлить срок службы флеш-памяти.

FAT

FAT — простая и широко совместимая файловая система. В Lua RTOS она обычно используется с картами памяти.

Файловые системы Lua RTOS поддерживают:

  • основные операции POSIX;
  • одновременную работу нескольких задач;
  • файлы и каталоги, включая эмулируемые каталоги SPIFFS.

Логическая файловая система и точки монтирования

Каждая файловая система подключается к общему дереву каталогов через точку монтирования.

При запуске Lua RTOS монтирует корневую файловую систему в /. Если на устройстве доступна ROMFS, она подключается в /romfs.

Остальные файловые системы можно подключить из стартового скрипта или приложения. Например:

Точка монтированияФайловая системаНосительНазначение
/LFSВстроенная флеш-памятьКорневая файловая система
/sdFATКарта памятиСъёмный накопитель
/ramRAMFSОперативная памятьВременные файлы
/spilfsLFSВнешняя флеш-памятьДополнительное хранилище

Точка монтирования должна находиться непосредственно в корневом каталоге. Например, /sd и /ram допустимы, а /other/sd и /other/ram — нет.

Перед отключением файловой системы незаписанные изменения сохраняются на носитель, после чего занятые ресурсы освобождаются.

Для монтирования используйте fs.mount(target, filesystem):

  • target: точка монтирования;
  • filesystem: одна из файловых систем — romfs, ramfs, lfs, spiffs или fat.
-- Подключить карту памяти с FAT в каталоге /sd
fs.mount("/sd", "fat")

Пути

В Lua RTOS некоторые системные вызовы имеют параметр в виде одного или нескольких путей. Когда используется один из этих системных вызовов, Lua RTOS начинает процесс разрешения пути. Процесс разрешения пути работает следующим образом:

  • Если путь начинается с символа “/” (абсолютный путь), начальным каталогом для поиска является корневой каталог, который одинаков для всех потоков.

  • Если путь не начинается с символа “/” (относительный путь), начальным каталогом для поиска является текущий рабочий каталог, который также одинаков для всех потоков.

  • Для каждого нефинального компонента пути, где компонент - это подстрока, ограниченная символом ‘/’, выполняется следующее:

    • Если компонент равен “.” (текущий каталог), каталог поиска остается неизменным, и процесс переходит к следующему компоненту.
    • Если компонент равен “..” (предыдущий каталог), каталог поиска устанавливается на предыдущий компонент, и процесс переходит к следующему компоненту.
    • Если компонент не найден, возвращается ошибка ENOENT.
    • Если компонент найден, но не является каталогом, возвращается ошибка ENOTDIR.
    • Если компонент найден и является каталогом, текущий каталог поиска устанавливается на этот каталог, и процесс переходит к следующему компоненту.
    • Если компонент является точкой монтирования, текущий каталог поиска устанавливается на корневой каталог связанной файловой системы.
  • Для финального компонента пути:

    • Если компонент равен “.” (текущий каталог), каталог поиска остается неизменным.
    • Если компонент равен “..” (предыдущий каталог), каталог поиска устанавливается на предыдущий компонент.
    • Если компонент не найден, возвращается ошибка ENOENT.

Функции просмотра

os.partitions()

Перечислить доступные на устройстве разделы.

Аргументы: нет

Возвращает: доступные разделы, типы разделов, названия, закодированные состояния, начальные адреса и длины в байтах.

/ > os.partitions()
TYPE:SUB	 ADDRESS	  LENGTH	ENC	LABEL
0x00:0x10	  655360	 1769472	N	ota_0 < boot < running
0x00:0x11	 2424832	 1769472	N	ota_1
0x01:0x02	   36864	   24576	N	nvs
0x01:0x40	   61440	  524288	N	storage
0x01:0x01	  585728	    4096	N	phy_init
0x01:0x00	  589824	    8192	N	otadata
/ > 

Функции форматирования

os.format(filesystem)

Отформатировать файловую систему. Поскольку в процессе форматирования все данные удаляются, функция запрашивает подтверждение.

Аргументы:

  • filesystem: имя файловой системы — spiffs, spilfs или fat.

Возвращает: ничего или исключение.

/ > os.format("fat")
All data in fat will be deleted. Continue? [y/n]: y
Formatting...
Initializing FAT area: 4% completed

Работа с файлами и каталогами

os.cat(filename)

Показать содержимое текстового файла на экране.

Аргументы:

  • filename: абсолютный или относительный путь к файлу.

Возвращает: ничего или ошибку.

os.cd(path)

Изменить текущий рабочий каталог.

Аргументы:

  • path: абсолютный или относительный путь к каталогу.

Возвращает: ничего.

/> os.cd("/examples")
/examples >

os.edit(file)

Редактирует файл.

Аргументы:

  • file: абсолютный или относительный путь к файлу.

Возвращает: ничего.

/> os.edit("autorun.lua")

os.ls([path])

Показать содержимое каталога. Поддерживаются простые шаблоны с *.

Аргументы:

  • path: путь к каталогу. Если аргумент не указан, отображается содержимое текущего каталога. Путь может быть абсолютным или относительным.

Возвращает: ничего.

/> os.ls("/")
d              -        tmp
d              -        www
d              -        conf
d              -        log
d              -        lib
f             27        test1.lua
f            956        autorun.lua
f           1871        lcd.lua
/examples/lua > os.ls("/*.lua")
f	    2407	                        	config.lua
f	    1034	                        	autorun.lua
f	    2446	                        	system.lua
f	    1105	                        	settings.lua
/examples/lua > 

Содержимое каталога отображается в столбцах, разделённых табуляцией:

  • первый столбец — тип записи (d — каталог, f — файл);
  • второй столбец — размер в байтах;
  • третий столбец — имя.

os.mkdir(path)

Создать каталог.

Аргументы:

  • path: абсолютный или относительный путь к каталогу.

Возвращает: true, если операция выполнена успешно.

-- Создать каталог test в текущем каталоге
local ok = os.mkdir("test")
print(ok)
true

os.more(filename)

Показать содержимое текстового файла по одному экрану за раз. Содержимое отображается постранично, один экран за раз.

Аргументы:

  • filename: абсолютный или относительный путь к файлу.

Возвращает: ничего или ошибку.

os.pwd()

Получить текущий рабочий каталог.

Аргументы: нет

Возвращает: путь к текущему каталогу.

/examples > os.pwd()
/examples

os.remove(path)

Удалить файл или каталог. Поддерживаются простые шаблоны с *.

Аргументы:

  • path: абсолютный или относительный путь к файлу, каталогу или шаблону.

Возвращает: ничего или ошибку.

/examples/lua > os.remove("*.bak")
/examples/lua > 

os.rename(old_path, new_path)

Переименовать файл или каталог.

Аргументы:

  • old_path: путь к файлу или каталогу, который нужно переименовать;
  • new_path: новое имя или путь.

Возвращает: ничего или ошибку.

os.cp(source_path, destination_path)

Копировать файл.

Аргументы:

  • source_path: путь к исходному файлу;
  • destination_path: путь к копии.

Возвращает: ничего.

-- Скопировать autorun.lua в autorun.old
os.cp("/autorun.lua", "/autorun.old")