Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
VinxFS - Самая маленькая файловая система FAT32 для AVR / Алгоритмы и программные решения / Сообщество EasyElectronics.ru

VinxFS - Самая маленькая файловая система FAT32 для AVR

Скачать одним файлом тут: github.com/vinxru/VinxFs/archive/master.zip
Смотреть на GITHUB: github.com/vinxru/VinxFs

Неоднократно читал на форумах, что люди ищут небольшую программу, которая бы позволяла работать с файловой системой FAT16/32. И многие выбирают Petit FatFS, потому что она работает даже на ATTiny. Но понимают через некоторе время, что она не умеет увеличивать размер существующих файлов. Приходится заранее создавать большие пустые файлы. А об удалении, создании, перемещении файлов или папок можно даже не думать.

Я предлагаю (безвозмездно) переработанную версию этой библиотеки. Это самая маленькая файловая система FAT16/FAT32 написанная на Си, умеющая создавать, изменять размер и удалять файлы. А так же переименовывать и переносить файлы и папки.

Главные преимущества перед Petit FAT, это:
— Два открытых файла (легко раширяется)
— Возможность записывать в любое место файла любой объем данных. Выравнивание на размер сектора полезно, но не обязательно.
— Можно создавать, удалять, переименовывать, перемещать, файлы или папки.
— Требуется меньший размер стека.
— Аналогичный набор функций занимает меньше места.

(Кстати в исходных кодах от оригинала кроме идеи ничего не осталось.)

Я написал коротенький README на английском языке. Еще подготовил демо программу на Visual C++ 2012 (в которой эта VinxFS работающая с файлом на диске). В этой демо программе удобно экспериментировать.

Полный набор функций помещается в ATMega8, при этом, остается еще и место для работы.

К недостаткам я отнесу:
— Требуется временный 512 байтный буфер для работы некоторых функций. Требуется только во время исполнения функции, в остальное время программист может использовать его по своему усмотрению.
— Возможно код содержит ошибки, но код PetitFS то же их содержит. Ошибки PetitFS я исправил.

VinxFS File System Module

It is an open source software to implement FAT file system to small embedded systems. This is a free software and is opened for education,
research and commercial developments under license policy of following trems.

(C) 2013 vinxru
(C) 2010, ChaN, all right reserved.

Features
* Very small RAM consumption (~50 bytes work area + certain stack)
* 512 byte temporary buffer. Used only while the function run.
* Very small code size (2K-7K bytes).
* Supports FAT16, FAT32.
* Single volume and two opened files.
* File write function with out restrictions.
* Can create, delete, rename, resize, move, file and directory

Application Interface
VinxFS module provides following functions.
* fs_init — Mount a volume
* fs_check — If user changed a drive, when mount it
* fs_opendir — Open a directory
* fs_readdir — Read a directory item
* fs_delete — Delete a file or directory
* fs_open — Open a File
* fs_openany — Open a file or directory
* fs_create — Create a file;
* fs_createdir — Create a directory
* fs_move0, fs_move — Move or rename a file or directory
* fs_lseek — Move read/write pointer
* fs_tell — Get read/write pointer
* fs_getfilesize — Get file size
* fs_read0, fs_read — Read file
* fs_write — Write File
* fs_write_eof — Truncate file
* fs_write_start, fs_write_end — Write temporary buffer to a file
* fs_swap — Swap opened files (work this two files)
* fs_gettotal — Get total drive space
* fs_getfree — Get free drive space

Drive I/O Interface
Since the VinxFS module is completely separated from disk I/O layer, it requires following functions to lower layer to read the physical disk.
* sd_init — Initialize disk drive
* sd_check — Check if user changed a drive
* sd_read — Read partial sector
* sd_write512 — Write sector

The module contains driver SD Card connected at ATMega8


Заметки

* Регистры DDRB, PORTB вы должны настроить в первых строках main. Например: DDRB = 0b00101100; PORTB = 0b00010100; Заметте, тут подтягивающие резисторы на MISO.

* Внутри этой библиотеки не описана переменная верменного буфера BYTE buf[512];. Вам надо добавить эту строку в вашу программу. Это сделано для того, что бы вы могли управлять положением буфера в памяти. Компилятор размещает переменные в памяти в том порядке, в котором он их встречает в программе. Этот буфер используется только пока выполняется функция ФС. Вы можете использовать буфер, портить его. Файловой системе вы не навредите. Но сама файловая система будет портить буфер во время вызовов.

* Код оптимизирован под CodeVisionAVR. Это самый оптимальный компилятор для AVR. В программе каждый возможный байт ПЗУ выжимался перестановкой строк, использованием goto вместо return, использованием одинаковых кусков кода, глобальный переменных, отказом от else и т.п. Если его переписать по академическому, он не влезет в память Atmega8 — а это главная фишка этой библиотеки. Возможность использовать на ATMega8 полноценную файловую систему. А так же на 16,32,64…
  • +16
  • 15 марта 2015, 14:25
  • vinxru

Комментарии (63)

RSS свернуть / развернуть
Я предлагаю (безвозмездно) переработанную версию этой библиотеки
И где взять?
0
0
А отдельно к статье не подцепишь? А то ненавижу гитхабы всякие, не срослось у меня с ними.
0
Так устроит?
+1
да, спасибо :)
0
Чета не понял где линия CS от портаВ настраивается на выход. На реале не проверялось?
0
Это пользователь должен сделать в первых строчках MAIN. Я добавлю это сейчас в описание.

Бло сделано примерно по 15 плат 8 различных устройств и разослано напроду.

cs616920.vk.me/v616920349/79ce/eV5hiUzD1Jc.jpg

cs314117.vk.me/v314117349/a928/nK08YK8jIPY.jpg
0
Изначально CS лучше перевести в пассивное, т.е. PORTB = 0b00010100
0
ок
0
Насколько пойдет данная фс на другие архитектуры?
0
  • avatar
  • Wic
  • 15 марта 2015, 16:01
Пример запуска на x86 в комплекте ) везде заработает, где хватит ОЗУ и ПЗУ. Переписать надо будет только SPI инетрфейс (файл spi.c)
0
Спасибо
0
попробовал на STM8S
код скомпилировался 4 — 4,5 Кбайт (IAR)
даже в stm8s003F3 — должен влезть
еще и останется
в STM8 есть CRC у SPI аппаратный
вообщем надо в реале пробовать!
должно работать!
0
также можно поgробовать на pic16f1825
памяти должно хватить
совсем мелкая чипа
и два канала ECCP half-bridge нв динамики
стерео музыкальная шкатулка!
SOIC-14!!!
0
Это круто, это офигенно!
0
Стоит ли её прикручивать вместо FatFs на STM32?
0
Если всё устраивает, то нет. Рабоатет — не трожь. :)
+1
Конечно же она нужна для ARM MCU! Как пишет автор, надо переписать драйвер spi.c. Ну и надо слегка причесать ее к нормальному виду Си либы а-ля MCU:

1/ C99 — что это за странный аналог stdint в виде BYTE, WORD и DWORD :D

2/ Обязательно должна быть поддержка 3-х основных компиляторов для ARM: GCC, Keil, IAR.
0
Код оптимизирован под CodeVisionAVR. Это самый оптимальный компилятор для AVR.

В программе каждый возможный байт ПЗУ выжимался перестановкой строк, использованием goto вместо return, использованием одинаковых кусков кода, глобальный переменных, отказом от else и т.п. Если его переписать по академическому, он не влезет в память Atmega8 — а это главная фишка этой библиотеки. Возможность использовать на ATMega8 полноценную файловую систему. А так же на 16,32,64…
+1
Одна-а-ако! API FS(fs.c) 1320 строк и в ней 51!!! goto.
0
Да хоть 1320. Они ничуть не усложняют понимание программы и работу оптимизатора, поэтому это не плохо. Там goto используется только вместо return 1. Это экономит 51 байт ПЗУ.
+1
Там goto используется только вместо return 1
Т.е. там нет никакого хитрого спагетти и все эти goto можно просто заменить на return'ы при портировании на ARM?
-1
Да.
0
Говорит о том, что у компилятора некоторые проблемы с оптимизацией. На всякий случай есть ещё вариант перехода
do{
  ....
  if(X) break;
  ....
}while(0);
return 1;
+2
О, спасибо.
0
не влезет в память Atmega8(1K_ram 8K_flash) — а это главная фишка этой библиотеки
Дело в том, что для ARM-мэнов самый малый RAM начинается обычно с 4K, а flash с 16K.
0
Я понимаю. Если у АРМ-а много памяти, то можно использовать FatFS от Chan-а (http://elm-chan.org/fsw/ff/00index_e.html). У моей библиотеки тогда нет особых преимуществ.
0
Стоит, если есть желание выразить признательность автору и помочь обкатать/отладить библиотеку.
0
А с какой скоростью можно читать данные, например играть wav 22000bps можно?..
А Petit не требует 512кб ОЗУ стэк?..
0
Сможет. Petit не требует 512 байт. Но он и не позволяет модифицировать файловую систему, изменять длину файлов.

Мне эти 512 байт нужны, что бы прочитать сектор в память, изменить там несколько байт и записать обратно. Флешка ведь не возмоляет изменять отдельные байты. А что бы увеличить размер файла, надо в таблице FAT поменять 2/4 байта.
+1
А если мне не нужно менять длину файлов можно обойтись меньшим буфером?..
Может быть можно читать эти 512 байт во флешь контроллера, а не а ОЗУ?..
0
Если не использовать функции требующие этот буфер, то буфер можно не создавать. А можно еще посмотреть на оригинальную PetitFS
0
0
кстати… я работал с флеш-микросхемой на 2 мбит и секторы эти побайтно читал с одного места в другой, модифицировал и потом обратно… С картой такой фокус не пройдет?
0
Вряд ли. Если мы начали читать, то обязаны прочитать 512 байт. Если начали записывать, то обязаны записать 512 байт и ничего другого в это время делать нельзя.
0
Я извиняюсь за занудство, просто тема ин тересная и самому предстоит реализовывать это на PSoC, даже нанял бы кого-то дистанционно)… Вопрос такой… если использовать только первые например 64 байта из 512 в кластере можно обойтись более простым контроллером?..
Скажем… нужно прочитать весь сектор-сделать это по частям… первые 64, следующие и тд..
Нужно записать файл-писать только а первые 64байта сектора… Может можно даже отформатировать так чтобы и на компьютере писать только в первые 64 байта-это я не знаю.
Скажем мне нужно проигрывать большие wav файлы, записаные из под виндоус, а редактировать программно максимум небольшой текстовый файл… до 64кб… В конце концов при инициализации можно прочитатьэтот файл блоками по 64 байта и раскидать его по большему количеству секторов чтобы можно было модифицировать контроллером?
0
Ой… я наверное отстал от жизни, чип за 0.29$ имеет на борту 2к озу… наверное его вполне хватит..
www.cypress.com/?mpn=CY8C4013SXI-400
0
Я все-таки не понял что тут нового добавлено?
Сама FatFS прекрасно меняет размер файлов: просто запись в конец файла меняет и его размер.
Вот цитата с сайта ChaN`а:
f_unlink — Remove a file or sub-directory
f_rename — Rename/Move a file or sub-directory
Т.е. удаление/переименование файла или директории тоже есть.
0
Да, но вы говорите о FatFS (http://elm-chan.org/fsw/ff/00index_e.html). Она никак не влезет в ATMega8. Она расчитана на ARM-ы и круче.

А я доботал PetitFatFS (http://elm-chan.org/fsw/ff/00index_p.html). Она ничего этого не умеет. Но зато работает даже на ATTiny.

Моя версия уже не помещается в Tiny с 512 байт ОЗУ, так как ей надо ~570 байт памяти. Но зато на ATMega-е мы имеем всё то, что может полноценный FatFS.
+1
Теперь понятно, спасибо!
Внимательно рассмотрел данные параметры, действительно круто!
0
Не изучал подробно, поэтому вопрос: вот у Вас при аварийных выходах иногда меняется lastError, иногда — нет. Это так задумано?
0
Там скорее всего код ошибки устанавливается во внутрененй функции. Внешняя в этом случае просто прерывает свою работу, без изменения кода ошибки.

Надо на код смотреть, там можно сложно ответить
0
IAR самый лучший компилятор. Потому как с самого начала сотрудничает с ATMEL. Система команд отрабатывалась совместно с IAR для написания программ на си.

Если несколько строк return x; то код будет соптимизирован как rjmp, что аналогично вашим goto.

Спорить не буду. Не верите, проверьте.
0
поправка: система команд AVR оптимизирована для написания программ на си.
0
Что то этой оптизизации под Си не видно. Си в первую очедерь индексная адресация. Что то типа [REG+CONST_OFFSET], [REG*CONST_MULT+CONST_OFFSET], [REG+REG*CONST_MULT+CONST_OFFSET]. Это работа с любыми стековыми переменными, массивами, структурами и ООП.

AVR — типичный такой ассемблер. Очень красивый и удобный.

То ли дело ARM
ldr r1,[r2,#-16]
0
Система команд отрабатывалась совместно с IAR для написания программ на си.
И как они в таком случае ухитрились сделать такой кривой аппаратный стек, что иар ведет свой, программный?
0
Насчет стека к IAR какие претензии? IAR это среда для создания и компилирования проектов.
0
К AVR претензии. Делать ядро с прицелом на С и при этом с малопригодным для С стеком — это надо постараться.
0
Какая вообще связь между стеком и высокоуровневым языком программирования?
0
передача параметров в стеке и
локальные переменные в стеке

но это как захочется разработчику компилятора
(в зависимости от внутренностей процессора)
0
передача параметров в стеке и
локальные переменные в стеке

У AVR регистров, как у дурака фантиков. В этих случаях можно вообще без стека обойтись.

При возникновении прерывания в него можно сохранять адрес возврата и флаги, но, как ты и написал, этим не Си занимается.
0
скомпилировал данную библиотеку для stm8 (писал уже выше)
получилось 4,5 Кбайт
посмотрел код листинга
компилятор вовсю использует глобальные адреса
хотя в stm8 можно очень хорошо использовать стек
(еще можно сократить код)!
0
Да, компилятор IAR
(может IAR с STM дружит раз код меньше)
или система команд универсальнее для компилятора
0
С стеком активно пользуется для автоматических переменных (иногда даже называемых стековыми). Использование хранения в стеке, например, позволяет не хранить переменные когда они не нужны (и при этом не используя динамическое выделение памяти) и рекурсивно вызывать функции.
Хотя да, с таким количеством регистров стек менее актуален, но IAR, тем не менее, создает свой собственный стек для переменных.
ARM, с другой стороны, не только имеет много регистров, но и развитый стек. Это уже действительно выглядит, как оптимальный для С набор команд. А AVR больше похож на предназначенный для кодинга на асме.
0
Даже самый лучший компилятор в руках дилетанта будет говнокодить. Вот взять за образец хотя бы этот проект. Берем управление многострадальным сигналом CS. Что бы видим на Си? PORTB |= ..., PORTB &=… Которые при низкой оптимизации приведут к неатомарной триаде in,ori,out. Хорошо это? Нет. Пример 2. Так, может, надо просто поставить навсегда большую оптимизацию? Хорошо, сделаем оптимизацию покруче. И тогда умный оптимизатор может сыграть другую шутку: в случаях, когда надо успеть выставить биты периферийного устройства в течение 4-х циклов (а сам регистр находится за пределами IN/OUT адресации, например, CLKPR), умница-оптимизатор решит, что настало самое лучшее время для вставки инструкции rjmp на какой-то общий фрагмент! И окажется что конструкция не укладывается в 4 цикла-то. А без оптимизации было все ОК. Вот и пойми, хороша оптимизация или плоха? Так что компиляторы все хороши. Головой надо работать.
0
1 — Автор не поленился, разобрался.
2 — Я бегло посмотрел код. Не очень. Много магических чисел. По поводу уменьшения размера кода и использования goto. Это нужно садиться и разбираться. На самом деле нужно искать материалы по эффективному программированию и применять приемы из этих материалов. Плюс пробовать, экспериментировать самому.
0
Автору — просто респект. Работа колоссальная проделана. И самое главное — для людей. Ему это несомненно зачтётся в карме))
0
Автор, а пример использования вашей библиотеки есть? Я с разбегу не могу разобраться в каком формате надо указывается имя файла при его открытии/создании.
0
извините, разобрался
0
При всем уважении, оставив в стороне саму реализацию FAT, должен сказать по поводу того, в чем разбираюсь.
А именно, процедура передачи байта по SPI не оптимальна по быстродействию, нужно сначала проверить флаг готовности, по его достижению переслать байт в буфер и покинуть процедуру. В этом случае мы можем провести какие-то полезные действия во время собственно передачи, а не тупо ждать ее завершения.
Причем даже ничего не надо добавлять в код (раз его размер так важен), просто поменять местами 2 строки.
0
Ссылка не работает. Просьба к автору помочь с получением исходников.
0
Похоже, автор переименовался на гитхабе в alemorf. Кроме того, раз ссылка на гитхаб — первым делом вбиваем название репоза в поиск там же и ищем форки.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.