• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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, не так всё просто... пишут что оверхед в трехзначных числах...
Я то полез - думал что уже слепили что-то более менее, но оказалось как всегда - Ардуинщики...
 
Сверху Снизу