LINUX.ORG.RU

Ext2 или на худой конец VFAT для микроконтроллеров


1

2

Что-то меня "в гугле забанили": не могу найти ни одного простого готового модуля ФС для мелкоконтроллеров. Хочу научиться работать с SD-карточкой на STM32.

Смотрел fatfs "от Чена". Жуть жуткая: около 5000 строк кода только в модуле ФС! Да я ж год убью, если буду в этом разбираться!!! С Ext2 еще хуже: что-то как-то уныло все...

Есть что-нибудь готовое, или все-таки нужно велосипедить на основе кода модуля ext2 какого-нибудь старого линуксового ядра?

☆☆☆☆☆

Последнее исправление: Eddy_Em (всего исправлений: 1)

Жуть жуткая: около 5000 строк кода

Для ФС на Си это не так уж и много.

Manhunt ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо, добрый человек!

Буду смотреть. Все-таки, 3 с небольшим тысячи строк в паре-тройке файлов — это не с десяток тысяч строк в пяти файлах!

Жаль только, что там нет ext2. Я думал, получится намного короче vfat, особенно если выкинуть нафиг поддержку не-ASCII символов.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от anonymous

Ух ты! Вообще крохотулечка! Уж полторы тысячи страниц рефакторить будет проще. А там работы непочатый край (взять, хотя бы, тот же malloc, отсутствующий на мелкоконтроллерах).

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от arson

Жирная какая-то эта FAT16, лучше EXT2 посмотрю. Тем паче, EXT2 намного приятней, нежели этот вантузоидный ЖЫР.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

Жирная какая-то эта FAT16,

The following table shows some typical code sizes in bytes, using the 20090330 release with a buffered read-write MMC/SD configuration, FAT16 and static memory allocation: 
layer 	code size 	static RAM usage
MMC/SD 	2410 	518
Partition 	456           17
FAT16 	7928 	188

Или ты имеешь ввиду количество комментариев в коде :)

лучше EXT2 посмотрю

Так тебе только для чтения!?

arson ★★★★★
()
Ответ на: комментарий от Eddy_Em

malloc, отсутствующий на мелкоконтроллерах

Вполне себе malloc есть на микроконтроллерах. И задержки на его вызов будут несравнимы с задержками на чтение и запись SD-карты.

KivApple ★★★★★
()
Ответ на: комментарий от arson

Или ты имеешь ввиду количество комментариев в коде :)

Дык, мне все это читать... А уж чем меньше #ifdef'ов, тем меньше шансов накосячить, удалив что-то не то...

Так тебе только для чтения!?

Нет, конечно: для начала только для записи. Просто очень уж не хочется самому велосипедить какой-нибудь формат для записи. Удобней же ФС использовать. Ext2 хороша еще тем, что уж нативней некуда!

Жаль, что до сих пор для STM32 ничего «родного» никто не реализовал ☹ Некоторые из этих сниппетов мною буквально выстраданы. Чего только 1-wire стоит! Пока не понял, что надежней делать четко по даташиту, а не надеятся на функции libopencm3, долго грыз кактус: код вроде правильный, а логанализатор туфту выдавал.

(вчера аналогично мучился с софтовым I2C для STM8, чтобы из «вольтметра» можно было что-нибудь полезное сделать: любое прерывание — и трындец таймингам!)

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от KivApple

Вполне себе malloc есть на микроконтроллерах

Это если его сам выдумаешь. А для этого придется свою mini-RTOS пилить!

Проще без malloc обойтись.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

А ты уверен что по инклудам они не принесут эти самые 10к строчек кода? <br> Может посмотреть что-то под ардуино и исправить? (к примеру https://code.google.com/p/nixduino/source/browse/fs/ext2/ext2fs.c )

ymuv ★★★★
()
Последнее исправление: ymuv (всего исправлений: 1)
Ответ на: комментарий от ymuv

Это не так страшно: из инклудов в основном всякая туфта вроде le_to_cpu используется, которая элементарно выкидывается из кода. Вместо malloc пишется свой менеджер памяти (скажем, сделать массив на 10кБ и в нем выделять память; а где возможно, вообще статические переменные юзать и т.п.). Главное — чтобы была готовая реализация ФС, потому как по спецификациям писать с нуля код — это жесть!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от KivApple

Кинь ссылку на код. Мне интересно, как там malloc организовали. Сам хочу себе забульбенить как-нибудь на досуге.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от ymuv

В первой ссылке — только для чтения + без директорий. Вторая ссыль — тупо железка. Я уже на примере TFT с тачем насмотрелся на быдлокод, «идущий на диске»...

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=tree

В арче достаточно установить пакет arm-none-eabi-newlib из репозитория community. Библиотека реализует malloc, printf и прочие функции libc, но при этом достаточно урезанные, чтобы не отжирать заметно флеша и без ОС-специфичных вещей.

KivApple ★★★★★
()
Ответ на: комментарий от Eddy_Em

Хотя последнее время я перехожу на использование ChibiOS. Да, код получается жирнее на 10-15КБ, зато писать многопоточное приложение гораздо приятнее. К тому же там есть замечательный HAL (опционально), который реализует драйвера для GPIO, UART, SPI, I2C, USB и т. д. (не хватает разве что для интерфейса камеры). Причём реализует весьма качественно (ещё не видел ни одного глюка в отличии от libopencm3, хотя активно использую различные интерфейсы) и при желании можно задействовать архитектурно-специфичные плюшки. Также «под капотом» автор постарался всё делать максимально рационально. Например, использовать DMA, где только возможно (в итоге процесс засыпает, пока обмен данными не окончится, а в это время свободно работают другие, никаких busy loop).

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Оказывается, оно у меня установлено. Только все равно я этой жирнотой пользоваться не собираюсь.

Кстати, я все-таки не понимаю, как оно может без sbrk или mmap работать, которых уж стопудово нет!

замечательный HAL

После линуксового и STM'ного HAL мне эта аббревиатура как синоним других трех букв...

Eddy_Em ☆☆☆☆☆
() автор топика

Во, можно, кстати, в старых ведрах поковыряться. Нужные функции и структуры выдрать, да допилить. Кстати, сразу вижу баг:

 34 static struct file_operations ext2_dir_operations = {
 35         NULL,                   /* lseek - default */
 36         ext2_dir_read,          /* read */
 37         NULL,                   /* write - bad */
 38         ext2_readdir,           /* readdir */
 39         NULL,                   /* select - default */
 40         ext2_ioctl,             /* ioctl */
 41         NULL,                   /* mmap */
 42         NULL,                   /* no special open code */
 43         NULL,                   /* no special release code */
 44         ext2_sync_file,         /* fsync */
 45         NULL,                   /* fasync */
 46         NULL,                   /* check_media_change */
 47         NULL                    /* revalidate */
 48 };
В строчке 37 вместо функции для записи в директорию воткнули NULL! А ведь в еще более старых ядрах рут мог редактировать файл директории!!!

Надо это дело откопать и исправить.

Eddy_Em ☆☆☆☆☆
() автор топика

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

всеже лучше смени контроллер на «современный»(с тоннами памяти)..они по размеру даже такиеже,и питание всеравнож из разетки разницы нет

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

sup9999
()
Ответ на: комментарий от Eddy_Em

ты болен,реально

если тебя «опыт» мужиков делающих из запорожца вертолет живущих в ...сарае которым ничего не надо и гордятся тем что сделали из запорожца,и такой опят тебя не смущает(опыт всего твоего провинциального окружения если точнее)-ты болен темже чем они

вместо прогресса и открытого принятия нового и лучшего-ты комплексуешь и сам себя насилуешь используя «мертвые» технологии прошлого века/десятилетия

и да за годы наблюдения за тобой на этом и другом форуме-болезнь только прогрессирует

и я не шучу,к сожалению

sup9999
()
Ответ на: комментарий от sup9999

зависит от задачи же.

может ему нужны stm-ки. не воткнёшь же арм с 64мя гигами туда где у тебя или место ограничено, или память, или цена.

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

Местами вообще хочется за копейки сделать. Тогда на помощь приходят Cortex-M0 или даже STM8. А уж для питания от батарейки лучше всего STM8L (кстати, у них с EEPROM все ОК).

А этот думает в направлении современных говнокодеров: зачем экономить память и процессорные ресурсы, если уже огого какие делаются?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

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

prischeyadro ★★★☆☆
()
Ответ на: комментарий от Eddy_Em

Тогда на помощь приходят Cortex-M0 или даже STM8. А уж для питания от батарейки лучше всего STM8L (кстати, у них с EEPROM все ОК).

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

anonymous
()

FatFs на данный момент является практически стандартом файловой системы для embedded. Отличная либа, гибко конфигурируется (отключаются ненужные функции). Использовал её в нескольких проектах, впечатления только положительные. Насчёт большого объёма для изучения - там не так уж много относится собственно к файловой системе, больше всяких сервисных функций, которые можно не использовать (и не смотреть). Да и вообще, либа проверенная, особо в ней ковыряться не придётся. Линуксовые/u-boot варианты гарантированно потребуют больше ОЗУ/ПЗУ, и, скорее всего, кучи. Да и мороки по портированию будет немало, имхо.

Beewek ★★
()
Ответ на: комментарий от prischeyadro

глобального массива чаров

(фикс ведроидного автофиксера)

prischeyadro ★★★☆☆
()

У чена все очень гибко и настраиваемо, при желании оно и в attiny помещается, и разбираться там особо не нужно, только низкоуровневые функции i/o подставить.

Rupricht ★★
()
Ответ на: комментарий от Rupricht

Vfat буду дергать только если с EXT2 ничего не получится. А если получится, то на кой черт мне долбаная fat32, если ext2 лучше?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от prischeyadro

фрагментированным

Надо туда Javascript запихать.

i-rinat ★★★★★
()
Ответ на: комментарий от AndreyKl

он для квартиры делает,или ради «игры»...безцельно

а арм с 64М оперативки стоит всего в два раза дороже(с очевидным удобством)

sup9999
()
Ответ на: комментарий от sup9999

а арм с 64М оперативки стоит всего в два раза дороже(с очевидным удобством)

Ты ври, да не завирайся!

Давай ссылку на подобную девборду за 10 баксов!!!

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от cherry-pick

Да я уже решил из ядра 1.0 или 2.0.1 выдрать нужный код, переделать для начала, чтобы работал с псевдоФС в файле, а потом уже можно и на МК портировать.

Eddy_Em ☆☆☆☆☆
() автор топика

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

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от Eddy_Em

за 10 нет,думал твое стоит около 10,за 30+ можно купить уже свободно

sup9999
()
Ответ на: комментарий от Eddy_Em

А что с таймингами-то не так? i2c к этому вполне терпим, пока не отпустил CLK, никто никуда не едет.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Eddy_Em

У тебя на МК какая-то ось по типу FreeRTOS крутится, или bare metal? Если bare metal, то тебе ведь кроме драйвера FS еще аналог VFS пилить, хотя бы на примитивнейшом уровне. Или у тебя абтракции директория/файл уже определены? А если ты не файлы/папк на флэшку писать хочешь, а просто поток байтиков, то зачем тебе ext2/fat?

cherry-pick
()
Ответ на: комментарий от cherry-pick

Не, можно конечно драйвер и так написать, чтобы он напрямую команды «дай мне список файлов в директории /xyz» принимал, но это ж костыли жуткие, лучше няшная абтракция с API, которым ты из сторонних модулей пользоваться сможешь.

cherry-pick
()
Ответ на: комментарий от cherry-pick

Нет там никакой оси, и не будет.

А если ты не файлы/папк на флэшку писать хочешь, а просто поток байтиков, то зачем тебе ext2/fat?

Чтобы легко было на компе прочитать.

Eddy_Em ☆☆☆☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.