Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: FAT16/32 для ARM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Sagittarius
Здравствуйте.

К проекту на LPC2378 надо подключить FAT16/32 на SD. Функции для самой SD написал, выбираю библиотеку файловой системы. Смотрел FATFS R0.09 Чена, EFSL-0.3.6
Неприятно удивило использование операций деления и взятия остатка от деления вместо сдвигов и наложения маски, даже для проверки на четность. Возможно кто то подскажет другие библиотеки, написанные для МК. Требуется чтение/запись/создание FS.

С уважением,
Игорь.
aaarrr
Цитата(Sagittarius @ Sep 12 2012, 18:04) *
Неприятно удивило использование операций деления и взятия остатка от деления вместо сдвигов и наложения маски, даже для проверки на четность.

Если бы код файловой системы преимущественно состоял из подобных операций, тогда еще можно было бы понять Ваше удивление. Но на деле их мало, выполняются достаточно редко. Так зачем пытаться отжать пол-копейки, усложняя при этом код?
Sagittarius
Цитата(aaarrr @ Sep 12 2012, 18:18) *
Если бы код файловой системы преимущественно состоял из подобных операций, тогда еще можно было бы понять Ваше удивление. Но на деле их мало, выполняются достаточно редко. Так зачем пытаться отжать пол-копейки, усложняя при этом код?


в FatFs их много, и это операции деления на степень 2, которые просто заменяются сдвигом. Если в остальном проекте нет операций деления то нет и смысла тащить для этого библиотеку из за избыточности в реализации файловой системы. Да и просто когда в коде встречается abc/4 вместо abc>>2 это как то неприятно :-)
SII
Ну, такие операции деления (на языках высокого уровня, в частности, на Си) любой сколько-нибудь вменяемый компилятор соптимизирует сам.
ukpyr
ну так сделайте патч и отошлите его автору.

sm.gif в тему: http://habrahabr.ru/post/150982/
AlexandrY
Цитата(Sagittarius @ Sep 12 2012, 17:04) *
К проекту на LPC2378 надо подключить FAT16/32 на SD. Функции для самой SD написал, выбираю библиотеку файловой системы...

Неприятно удивило использование операций деления и взятия остатка от деления вместо сдвигов и наложения маски...


Keil умножения и деления на степени двойки однозначно поменяет на сдвиги автоматически.
Лучшая библиотека, ИМХО, будет от Micrium-а.
Сравнивал по скорости и стабильности с двумя другими коммерческими.
Сравнивать лучше на хорошо изношенных SD картах (после записи и стирания 1000 и более файлов).
Тогда все особенности FS ярче проявляются.
hd44780
Цитата(Sagittarius @ Sep 12 2012, 17:04) *
Смотрел FATFS R0.09 Чена, EFSL-0.3.6


К китайцу и вопросы все biggrin.gif ...
Allregia
Цитата(hd44780 @ Sep 13 2012, 08:45) *
К китайцу и вопросы все biggrin.gif ...


Он вообще-то японец а не китаец sm.gif
SasaVitebsk
Цитата(AlexandrY @ Sep 12 2012, 23:08) *
Keil умножения и деления на степени двойки однозначно поменяет на сдвиги автоматически.

IAR также. Причём, даже сложнозапутанные, совсем не явные. Я недавно столкнулся с куском дерьмокода. biggrin.gif
Показал ребятам, как нельзя делать. Переписал, как правильно ... Кроме красоты, сэкономил пару байт. На приличном куске. Не поверил. Переписывал несколько раз, самыми разными способами. Результат практически не менялся.
Sagittarius
Цитата(SasaVitebsk @ Sep 17 2012, 00:26) *
IAR также. Причём, даже сложнозапутанные, совсем не явные.


Если значение известно при компиляции то да, но если делитель берется из переменной, то уже вызов udiv, udivmod. То что в этой переменной будет только степень 2 компилятор предугадать уже не может. Или такое выражение (из FatFS):
if (ifptr > 0 && (ofs - 1) / bcs >= (ifptr - 1) / bcs ){...}
деление вызывается 2 раза. Так что пока пользую FatFS, потом руками все поправлю.
sonycman
А что за контроллер используете? Библиотеки какие-то - армы давно деление на уровне инструкций имеют.
polyname
Цитата
армы давно деление на уровне инструкций имеют
не все.
SasaVitebsk
Цитата(Sagittarius @ Sep 17 2012, 09:20) *
Если значение известно при компиляции то да, но если делитель берется из переменной, то уже вызов udiv, udivmod. То что в этой переменной будет только степень 2 компилятор предугадать уже не может.

Компилятор угадать не сможет. А вы то как угадаете?
demiurg_spb
Цитата(SII @ Sep 12 2012, 18:36) *
Ну, такие операции деления (на языках высокого уровня, в частности, на Си) любой сколько-нибудь вменяемый компилятор соптимизирует сам.

+1
MBR
Также плюсую. Автору стоит почаще смотреть в ассемблерные листинги - без базовых представлений о том, как работает компилятор можно запросто плодить неэффективный код, совершенно об этом не представляя.
yurmala
Тут еще зависит от конкретного компилятора (возможности оптимизатора). Действительно, ASM-листинги в помощь. Хотя бы для типовых операций.
M0HAX
Доброго дня!
К АРМ2388 с FreeRTOS пристегнул FatFS. Юзаю Sd-карту SDHC Transcent 4Gb.
Столкнулся с проблемой определения количества свободных кластеров на карточке. С помощью функции FatFS f_mkfs(0, 0, 1024) в устройстве форматирую карточку под FAT32. Затем мне надо было заполнить часть памяти мусором- стал записывать на компе (ОС WinXP) на карточку авишки. В процессе экспериментов выяснилось, что количество свободных кластеров, которые считываются с сектора 64 по смещению 0x1E8(Структура FSInfo), не изменяется. Причем сначала вроде меняются, а потом стопорится на каком-либо числе, даже стирания всех файлов не приводит к изменению этого числа. После записи каждого файла проверяю этот сектор с помощью Victoria, но при этом средствами Windows (свойства логическог диска) я вижу, что размер-то свободного места на карточке меняется... А в устройстве функция FatFS f_getfree("0:/", &SDMemoryRemains, &fs) дает такое же число(которое неизменяемое, т.е. неправильное). Почему такое происходит? Почему перестает обновляться количество свободных секторов в секторе 64 ? Я ж в устройстве на арме не могу каждый раз полностью пересчитывать кол-во свободных секторов- это занимает слишком много времени.
AHTOXA
А если в винде карточку "безопасно извлечь" и снова вставить - тоже не меняется?
M0HAX
не зависит. может перестать обновлять даже,если 2 файла подряд запишишь на карточку. Между 2-мя файлами проверишь кол-во свободных кластеров,вроде норм, потом после 2-ого файла(карточку вообще не извлекал) проверяю - осталось прежнее число. Извлекаешь методом безопасного извлечения,втыкаешь, результат тот же ,печальный. Стираешь все файлы с карточки - тоже число не меняется, пока не отформатируешь заново. Счас поменяю кардридер,может здесь закрался подвох..
ПС. Точно, кардридер на компе - дерьмо, подключил другой кардридер - все ок. Пока такого эффекта не обнаружилось
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.