• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

LittleFS вылетает при записи

Junkie

Member
Суть проблемы в том, что я перегоняю изображение из одного формата в другой, то есть открываю один файл, вычитываю его и в это же время записываю, но все это по разным функциям, то есть у меня общая переменная
File f;
в функции инициализации я присваиваю
f = fileSystem->open("convert.tmp", "r");
и затем уже в функции add я делаю
Код:
    uint16_t pix =
        ((*(colors + el * 3 + 0) >> 3) << 10) |
        ((*(colors + el * 3 + 1) >> 3) << 5 ) |
         (*(colors + el * 3 + 2) >> 3);
    giftemp.write((char*)&pix, 2);
эта функция вызывается многократно,
вобщем после некоторого числа переваренных данных все падает с ошибкой

Код:
Panic ../lib/littlefs/lfs.c:2875 lfs_file_write: Assertion 'file->flags & LFS_F_OPENED' failed.

>>>stack>>>

ctx: cont
sp: 3ffffc60 end: 3fffffc0 offset: 0000
3ffffc60:  00000001 000000be 00000374 00000003 
3ffffc70:  000000fe 00000000 00000000 00000000 
3ffffc80:  00000000 00000000 00000000 40260db4 
3ffffc90:  3fff2310 000010b1 00000000 3fffff10 
3ffffca0:  3fff577c 0000086f 3fff2d2c 4021ef62 
3ffffcb0:  3ffffd42 00000002 00000000 4021ef96 
3ffffcc0:  4020a4eb 00000030 00000015 4020340d 
3ffffcd0:  4020a4f4 0000062e 3fff4e7c 00000020
расшифровка
Код:
Decoding stack results
0x4020a4eb: add(uint16_t) at C:\Users\user\AppData\Local\Temp\arduino_build_408149\sketch\sub_gif.cpp line 89
0x4020340d: lfs_file_write at C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\LittleFS\src\../lib/littlefs/lfs.c line 2881
0x4020a4f4: add(uint16_t) at C:\Users\user\AppData\Local\Temp\arduino_build_408149\sketch\sub_gif.cpp line 90
0x40100184: NeoEsp8266DmaMethodBase ::i2s_slc_isr() at C:\Users\user\Documents\Arduino\libraries\NeoPixelBus_by_Makuna\src/internal/NeoEsp8266DmaMethod.h line 487
0x4021286d: littlefs_impl::LittleFSFileImpl::write(unsigned char const*, unsigned int) at C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\libraries\LittleFS\src/LittleFS.h line 346
0x4020a5ca: getBit(unsigned char*, int) at C:\Users\user\AppData\Local\Temp\arduino_build_408149\sketch\sub_gif.cpp line 14
0x40221bdd: fs::File::write(unsigned char const*, unsigned int) at C:\Users\user\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.4\cores\esp8266\FS.cpp line 40
0x4020a946: gif_header(String, bool) at C:\Users\user\AppData\Local\Temp\arduino_build_408149\sketch\sub_gif.cpp line 124
0x4020a4cd: add(uint16_t) at C:\Users\user\AppData\Local\Temp\arduino_build_408149\sketch\sub_gif.cpp line 69
как видим падает в функции которая делает write
а в исходниках littlefs эта выглядит
Код:
lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file,
        const void *buffer, lfs_size_t size) {
    LFS_TRACE("lfs_file_write(%p, %p, %p, %"PRIu32")",
            (void*)lfs, (void*)file, buffer, size);
    LFS_ASSERT(file->flags & LFS_F_OPENED);
    LFS_ASSERT((file->flags & 3) != LFS_O_RDONLY);
....
то есть там какие-то проверки, и между вызовом функции он крашится, кстати что за функция LFS_TRACE? как я понял можно где-то включить чтобы она выводила все действия, как это сделать? и самое главное почему падает программа? что можно попробовать чтобы исправить?
 

pvvx

Активный участник сообщества
Суть проблемы в том, что я перегоняю изображение из одного формата в другой, то есть открываю один файл, вычитываю его и в это же время записываю, но все это по разным функциям, то есть у меня общая переменная
File f;
в функции инициализации я присваиваю
f = fileSystem->open("convert.tmp", "r");
и затем уже в функции add я делаю
Код:
    uint16_t pix =
        ((*(colors + el * 3 + 0) >> 3) << 10) |
        ((*(colors + el * 3 + 1) >> 3) << 5 ) |
         (*(colors + el * 3 + 2) >> 3);
    giftemp.write((char*)&pix, 2);
Т.е. вы читаете и пишите один файл File f; открытый для чтения? :oops:
Оно вам и говорит: 'file->flags & LFS_F_OPENED' failed. - Файл закрыт.
 

Junkie

Member
файла два, из одного читаю, в другой пишу, причем оно падает не сразу, и маленькие файлы перевариваются, если исходный файл больше какого-то размера, то все падает, вобщем то этот код переводит gif в bmp, а данные для записи вообще находятся в RAM
NeoEsp это библиотека для адресной светодиодной ленты.
Еще у меня есть код чтобы просто разворачивать BMP но 90 градусов, и он свободно переваривает даже большую картинку в 1mb
 

Junkie

Member
еще я где то вычитал что эта файловая система асинхронная, может есть какая-то проверка готова ли она для записи или нет
 

pvvx

Активный участник сообщества
Оно всегда выходит на Panic (Assertion 'file->flags & LFS_F_OPENED' failed) ?
Если да, то это не "падение", а отрабатывает проверка LFS_ASSERT(file->flags & LFS_F_OPENED);
 

Junkie

Member
да, вот эти проверки, я же и нашел их в функции, попробую тогда neopixels на простой ногодрыг режим сделать, чтобы он не создавал прерывания i2c, и попробую чтобы дебаг литлфс выводило в сериал, свободного места у меня хватает, понять бы почему файл сам закрывается, хотя я не вызывал f.close()
 

pvvx

Активный участник сообщества
Та, littlefs ещё не отлажена.
Вот непереводимое описание про несколько открытых файлов:
А ваш конфиг (и даже версия littlefs) неизвестен - пробуйте разобраться сами.
 

pvvx

Активный участник сообщества
Если вы используете файловую систему как журнал, то она будет только мешать, тормозить и протирать дырки в Flash.
Гораздо проще назначить циклический буфер в flash и запоминать адреса начал последних пару файлов для последующего считывания (если надо вообще несколько - может вам нужен только последний для отображения?). И убивать их когда кольцо записи перехлестнет их. И flash и вам будет легче.
 

Junkie

Member
просто на страницы гитхаба сами разрабы есп писали что spiffs устарела и оставлена только для совместимости, в будущих релизах может быть убрана, так же где то вычитал что дописывать в файл не вредит флеш, потому что они хранятся блоками по 8кб, это только при стирании надо перезаписывать весь блок, а заполнять можно хоть побитно
 

pvvx

Активный участник сообщества
просто на страницы гитхаба сами разрабы есп писали что spiffs устарела и оставлена только для совместимости, в будущих релизах может быть убрана,
Всё там-же поиск: Arduino+LittleFS :
Предупреждение об устаревании SPIFFS
SPIFFS в настоящее время устарела и может быть удалена в будущих выпусках ядра. Пожалуйста, подумайте о переносе вашего кода в LittleFS. SPIFFS больше не поддерживается разработчиками основной ветки разработки, в то время как LittleFS находится в активной разработке, поддерживает реальные каталоги и во много раз быстрее для большинства операций.
так же где то вычитал что дописывать в файл не вредит флеш, потому что они хранятся блоками по 8кб, это только при стирании надо перезаписывать весь блок, а заполнять можно хоть побитно
Там, в littlefs, не так всё просто... пишут что оверхед в трехзначных числах...
Я то полез - думал что уже слепили что-то более менее, но оказалось как всегда - Ардуинщики...
 
Сверху Снизу