Файловая система
Поддерживаемые файловые системы
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 | Встроенная флеш-память | Корневая файловая система |
/sd | FAT | Карта памяти | Съёмный накопитель |
/ram | RAMFS | Оперативная память | Временные файлы |
/spilfs | LFS | Внешняя флеш-память | Дополнительное хранилище |
Точка монтирования должна находиться непосредственно в корневом каталоге. Например, /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")