|
FAT16/32 для ARM, FatFS, efs писали PC-программисты |
|
|
|
Sep 12 2012, 14:33
|
Местный
  
Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659

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

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Sagittarius @ Sep 12 2012, 17:04)  К проекту на LPC2378 надо подключить FAT16/32 на SD. Функции для самой SD написал, выбираю библиотеку файловой системы...
Неприятно удивило использование операций деления и взятия остатка от деления вместо сдвигов и наложения маски... Keil умножения и деления на степени двойки однозначно поменяет на сдвиги автоматически. Лучшая библиотека, ИМХО, будет от Micrium-а. Сравнивал по скорости и стабильности с двумя другими коммерческими. Сравнивать лучше на хорошо изношенных SD картах (после записи и стирания 1000 и более файлов). Тогда все особенности FS ярче проявляются.
|
|
|
|
|
Sep 16 2012, 20:26
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(AlexandrY @ Sep 12 2012, 23:08)  Keil умножения и деления на степени двойки однозначно поменяет на сдвиги автоматически. IAR также. Причём, даже сложнозапутанные, совсем не явные. Я недавно столкнулся с куском дерьмокода. Показал ребятам, как нельзя делать. Переписал, как правильно ... Кроме красоты, сэкономил пару байт. На приличном куске. Не поверил. Переписывал несколько раз, самыми разными способами. Результат практически не менялся.
|
|
|
|
|
Sep 17 2012, 06:20
|
Местный
  
Группа: Свой
Сообщений: 207
Регистрация: 26-01-06
Из: СПб
Пользователь №: 13 659

|
Цитата(SasaVitebsk @ Sep 17 2012, 00:26)  IAR также. Причём, даже сложнозапутанные, совсем не явные. Если значение известно при компиляции то да, но если делитель берется из переменной, то уже вызов udiv, udivmod. То что в этой переменной будет только степень 2 компилятор предугадать уже не может. Или такое выражение (из FatFS): if (ifptr > 0 && (ofs - 1) / bcs >= (ifptr - 1) / bcs ){...} деление вызывается 2 раза. Так что пока пользую FatFS, потом руками все поправлю.
|
|
|
|
|
Sep 26 2012, 19:58
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915

|
Цитата армы давно деление на уровне инструкций имеют не все.
|
|
|
|
|
Nov 6 2012, 05:02
|
Участник

Группа: Свой
Сообщений: 65
Регистрация: 9-02-11
Из: Трехгорный
Пользователь №: 62 814

|
Тут еще зависит от конкретного компилятора (возможности оптимизатора). Действительно, ASM-листинги в помощь. Хотя бы для типовых операций.
|
|
|
|
|
May 16 2013, 13:23
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 22-09-08
Пользователь №: 40 378

|
Доброго дня! К АРМ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 ? Я ж в устройстве на арме не могу каждый раз полностью пересчитывать кол-во свободных секторов- это занимает слишком много времени.
Сообщение отредактировал M0HAX - May 16 2013, 13:27
|
|
|
|
|
May 17 2013, 09:59
|
Участник

Группа: Участник
Сообщений: 33
Регистрация: 22-09-08
Пользователь №: 40 378

|
не зависит. может перестать обновлять даже,если 2 файла подряд запишишь на карточку. Между 2-мя файлами проверишь кол-во свободных кластеров,вроде норм, потом после 2-ого файла(карточку вообще не извлекал) проверяю - осталось прежнее число. Извлекаешь методом безопасного извлечения,втыкаешь, результат тот же ,печальный. Стираешь все файлы с карточки - тоже число не меняется, пока не отформатируешь заново. Счас поменяю кардридер,может здесь закрался подвох.. ПС. Точно, кардридер на компе - дерьмо, подключил другой кардридер - все ок. Пока такого эффекта не обнаружилось
Сообщение отредактировал M0HAX - May 17 2013, 10:21
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|