kashey
Oct 24 2006, 06:45
Доброго времени суток!
Вот скачав и написав соответствующий драйвер, для имеющегося процессора, удалось запустить
EFSL. Но результаты чтения оставляют желать лучшего: ~300 КБ за 15 секунд, и это при максимальной скорости работы SPI на 20МГЦ контроллере.
Фрагмент кода чтения файла, взято из примера идущего с библиотекой.
Код
while ((e = file_read(&file_w, 16, buf)))
{
for (i = 0; i < e; i++)
{
/*TODO:*/
}
}
Кто может подсказать в чем может быть загвоздка?
Заранее благодарен!
dm_mur
Oct 24 2006, 07:48
20 МГц - это тактовая частота контроллера? У филипков к примеру макс. частота клоков SPI - одна восьмая периферийных клоков, которые меньше или равны тактовой. Кроме того, кроме чтения собственно данных из файла, постоянно читается ФАТ (сектор данных - фат, сектор данных - фат и.т.д.) Так что результат неудивителен.
kashey
Oct 24 2006, 08:54
Цитата(dm_mur @ Oct 24 2006, 10:48)

20 МГц - это тактовая частота контроллера? У филипков к примеру макс. частота клоков SPI - одна восьмая периферийных клоков, которые меньше или равны тактовой. Кроме того, кроме чтения собственно данных из файла, постоянно читается ФАТ (сектор данных - фат, сектор данных - фат и.т.д.) Так что результат неудивителен.
Код
...
long clk = 20000000;
ssp_set_bits_per_word(8);
ssp_set_speed(clk / 2);
...
Исходя из этого можно предположить, что частота клоков SPI 1/2
Реально если посмотреть осцилографом, то получим ~3МБ/c, но даже если скорость чтения такова и чтение происходит (сектор - фат, ... ), то все равно как то медленно получается...
Исходя из вашего ответа, то про эффективное использование EFSL(загрузка полноэкранных картинок 640x480, и т.д.) можно забыть?
dm_mur
Oct 24 2006, 09:26
Все-таки какой контроллер вы используете?
для увеличения скорости можно:
- Само собой, увеличить частоту процессора
- Использовать не СПИ, а 4-битную шину (если вы пользуете СД-карту)
- Не пользовать имеющуюся в файловой системе функцию чтения из файла, а написать более эффективную. Сначала запоминать цепочку кластеров файла и дальше читать уже не обращаясь к фат.
kashey
Oct 24 2006, 09:46
Использую Sharp LH75401.
- Увеличить частоту наврятли получится
- SD-карты в качестве носителя
- Переписывать библиотеку не хотелось бы, но если другого выхода нет, то придеться.
Я пробовал на 2148 на SPI0, читал с SD, получалось около 3сек на 1 мегабайт
правда читал по 512, да и ссылка была несколько другая (но думаю не принципиально)
http://gandalf.arubi.uni-kl.de/avr_project..._arm/index.html
kashey
Oct 24 2006, 13:48
Сделал простой тест на время записи/чтения, получилось ~30 КБ/с.
Неужели потери на чтение служебной информации FAT такие объемные?
Полагая что чтение служебной информации FAT, занимает столько же времени сколько и чтение данных, даже переписав функцию чтения не получим значительных изменений.
dm_mur
Oct 25 2006, 03:51
Цитата(kashey @ Oct 24 2006, 16:48)

Сделал простой тест на время записи/чтения, получилось ~30 КБ/с.
Неужели потери на чтение служебной информации FAT такие объемные?
Полагая что чтение служебной информации FAT, занимает столько же времени сколько и чтение данных, даже переписав функцию чтения не получим значительных изменений.
хм. щас протестировал на скорость свою систему. у меня получилось через SPI на LPC2292 порядка 170 кб/сек. Исходники ФАТ у меня от PRLLC. Тест такой:
fp = fopen("work.tmp", READ);
printf ("\r\nначел\r\n");
do
{
i = fgetc(fp);
} while (i != EOF);
printf ("\r\nкончел\r\n");
fclose(fp);
Alex03
Oct 25 2006, 07:10
Цитата(dm_mur @ Oct 25 2006, 09:51)

хм. щас протестировал на скорость свою систему. у меня получилось через SPI на LPC2292 порядка 170 кб/сек. Исходники ФАТ у меня от PRLLC. Тест такой:
fp = fopen("work.tmp", READ);
printf ("\r\nначел\r\n");
do
{
i = fgetc(fp);
} while (i != EOF);
printf ("\r\nкончел\r\n");
fclose(fp);
Так оно поди всё строчкой
Код
i = fgetc(fp);
съедается.
KostyantynT
Oct 25 2006, 07:59
Портировал свою файловую систему на SD карточку, основные задержки - в цикле ожидания, те когда записываешь слово по SPI и ждешь его окончания. Выход в использовании DMA или хотя бы использовать весь буфер FIFO.
dm_mur
Oct 25 2006, 09:41
Цитата(КонстантинТ @ Oct 25 2006, 10:59)

Портировал свою файловую систему на SD карточку, основные задержки - в цикле ожидания, те когда записываешь слово по SPI и ждешь его окончания. Выход в использовании DMA или хотя бы использовать весь буфер FIFO.
А как в данной ситуации FIFO или DMA могут ускорить работу с картой? Если частота СПИ предельная, то выход в "утолщении" канала связи с картой, т.е. использование не последовательной, а 4-х битной шины СД карты.
kashey
Oct 30 2006, 12:03
Цитата(dm_mur @ Oct 25 2006, 07:51)

хм. щас протестировал на скорость свою систему. у меня получилось через SPI на LPC2292 порядка 170 кб/сек. Исходники ФАТ у меня от PRLLC. Тест такой:
fp = fopen("work.tmp", READ);
printf ("\r\nначел\r\n");
do
{
i = fgetc(fp);
} while (i != EOF);
printf ("\r\nкончел\r\n");
fclose(fp);
А можно скинуть исходники FAT (PRLCC) на kashey@monada.ks.ua ?
sergvks
Nov 2 2006, 17:38
Многое ещё зависит от карточки, из того что было под рукой самые лучшие результаты показал трансценд, самые тормозные - кингстон.
Каков минимальный объём служебной информации, который пишется на SD карту системой EFSL? Можно ли настроить на работу не с SD картой, а например с какой-нибудь другой памятью вроде AT25 и т.п.?
Цитата(AVR @ Nov 3 2006, 00:46)

Каков минимальный объём служебной информации, который пишется на SD карту системой EFSL? Можно ли настроить на работу не с SD картой, а например с какой-нибудь другой памятью вроде AT25 и т.п.?
Служебная информация: MBR (master boot-record 512байт), 1 или 2 таблицы ФАТ (объем зависит от объема флешки), корневой каталог (на запись об 1 файле 32 байта). Да, еще резервированные сектора. К примеру, на SD капрте объемом 512 мбайт на это все уходит 270 кбайт...
Можно настроить на работу с любой памятью. Я работал с использованием файловой системы (PRLLC правда а не EFSL) с флешкой AT45DB321 (4МБ) и даже с линейкой из 8 микросхем 24С512 (общий объем 512 кБ). Переписываются функции записи-чтения сектора и иничиализации переменных фвйловой системы.
Цитата(AVR @ Nov 2 2006, 16:46)

Каков минимальный объём служебной информации, который пишется на SD карту системой EFSL? Можно ли настроить на работу не с SD картой, а например с какой-нибудь другой памятью вроде AT25 и т.п.?
Поддерживаю вопрос , как разбить AT25 / AT45. По доке efsl не нахожу команду создания ФС. О отличии от той же FatFS
Dron_Gus
Feb 5 2007, 17:41
Кто-нить перекраивал efsl для одновременной работы с двумя носителями? Как я понял, копаясь в исходниках, количество носителей строго 1.
AlexBoy
Feb 5 2007, 19:12
Я портировал FatFs
http://elm-chan.org/fsw/ff/00index_e.html на SAM7, получалось 1,2Мб/с, а без использования FAT 1,8Мб/с
Возник следующий вопрос:
Кто как борется с отключением питания во время записи на карту?
Я в схемотехнике не силен, но подозреваю, что можно сделать так, чтобы на на один из входов внешнего прерывания контроллера подавался сигнал пропадания питания, а контроллер продолжал питаться еще некоторое время от конденсаторов на плате. За это время надо успеть сделать flush().
Может быть есть другие варианты? Варианты без изменений в аппаратной части (программные)?
PS: Подразумевается использование FAT.
AlexandrY
Feb 7 2007, 19:57
Игра со схемотехникой мало чем поможет.
Да и не логично. Это типа к исходникам fail safe файловой системы должна идти инструкция по организации питания?
Нет, просто EFSL не транзакционная файловая система и надежности от нее ждать не стоит.
Проще всего на мой взгляд сделать энергонезависимый буфер.
Цитата(ArtemK @ Feb 6 2007, 12:05)

Возник следующий вопрос:
Кто как борется с отключением питания во время записи на карту?
Я в схемотехнике не силен, но подозреваю, что можно сделать так, чтобы на на один из входов внешнего прерывания контроллера подавался сигнал пропадания питания, а контроллер продолжал питаться еще некоторое время от конденсаторов на плате. За это время надо успеть сделать flush().
Может быть есть другие варианты? Варианты без изменений в аппаратной части (программные)?
PS: Подразумевается использование FAT.
Там же указатель на файловую систему идет аргументом при открытии файла.
Никто не мешает инициализировать несколько файловых систем на разных носителях, для того там этот аргумент и идет.
Цитата(Dron_Gus @ Feb 5 2007, 19:11)

Кто-нить перекраивал efsl для одновременной работы с двумя носителями? Как я понял, копаясь в исходниках, количество носителей строго 1.
А никто не видел реализации работы с FAT16/32 без использования каких-либо буферов (даже на 1 сектор) для простейших контроллеров с минимальным RAM и ROM ? Нужно : определение формата носителя; если нужно, то форматирование (BPB,FAT1,2); побайтовое чтение и запись (дозапись) одного файла (не одновременно). Файл может быть один на весь носитель (то есть разбирать все дерево файлов/каталогов не нужно).
Alex B._
Feb 7 2007, 21:09
>> для простейших контроллеров с минимальным RAM и ROM ?
поднимите веки, тремя постами выше ссылка
http://elm-chan.org/fsw/ff/00index_e.html
Цитата
Alex B._
Видел уже. Вы посмотрите на требуемые объемы ROM (4К) и RAM (540)
А нужно реализовать в объеме 2К ROM и 128 RAM
Ладно, напишу сам
Цитата(AlexBoy @ Feb 5 2007, 19:12)

Я портировал FatFs
http://elm-chan.org/fsw/ff/00index_e.html на SAM7, получалось 1,2Мб/с, а без использования FAT 1,8Мб/с
Вот мои изыскания/наблюдения о скорости записи в SD:
Итак, SD-карта A-Data 150x. Подключена по SPI, частота клоков 7.5 МГц. DMA в проце нет. Запись идет в режиме WRITE_MULTIPLE_BLOCK. При записи до 512 секторов подряд (около 250 кБ) информация в SD улетает со скоростью ~500 кб/сек. На 513-м секторе карточка тормозит и "держит" бизи какое-то время. Дальше процесс повторяется. Таким образом, "средняя" скорость при записи в реальном времени нескольких мегабайт подряд получилась около 250 кб/сек.

Карточка той же фирмы, но 60х "спотыкается" на 256-м секторе...
AlexBoy
Feb 8 2007, 15:04
Цитата(dm_mur @ Feb 8 2007, 05:47)

Таким образом, "средняя" скорость при записи в реальном времени нескольких мегабайт подряд получилась около 250 кб/сек.

Карточка той же фирмы, но 60х "спотыкается" на 256-м секторе...
Я имел в виду 1,2Мб скорость чтения при 20Mhz SPI. Запись в любом случае медленее будет. А спотыкания это наверно границы страниц флеша.
SpiritDance
Feb 8 2007, 15:59
Цитата(AlexBoy @ Feb 5 2007, 19:12)

Я портировал FatFs
http://elm-chan.org/fsw/ff/00index_e.html на SAM7, получалось 1,2Мб/с, а без использования FAT 1,8Мб/с
А где там собственно порт-та?
AlexBoy
Feb 9 2007, 14:48
Цитата(SpiritDance @ Feb 8 2007, 14:59)

А где там собственно порт-та?
Порт на SAM7 это моя private property

а на другие можно с сайта скачать.
AlexandrY
Feb 10 2007, 23:38
Интересно будет посмотреть как это у вас получится.
В MMC/SD запись всегда выровнена по границе сектора, т.е. буфер сектора в 512 байт в RAM иметь надо всегда!
Можете посмотреть по ссылке какие ресурсы требуют некоторые решения для файловой системы:
http://aly.projektas.lt/Projects/STR91_Start/STR91.htm#4Цитата(umup @ Feb 8 2007, 01:00)

Цитата
Alex B._
Видел уже. Вы посмотрите на требуемые объемы ROM (4К) и RAM (540)
А нужно реализовать в объеме 2К ROM и 128 RAM
Ладно, напишу сам
AlexBoy
Feb 13 2007, 02:35
Можно поставить внешнюю SRAM с spi или i2c интерфейсом.
jorikdima
Feb 13 2007, 10:19
Цитата(AlexBoy @ Feb 13 2007, 02:35)

Можно поставить внешнюю SRAM с spi или i2c интерфейсом.
А вы не могли бы ткнуть пальцем в SRAM с последовательным итерфейсом, а то мне только параллельный встречался.
ЗЫ Но мне (для иных применений) надо хотя бы 32 Мбита
Цитата
Интересно будет посмотреть как это у вас получится.В MMC/SD запись всегда выровнена по границе сектора, т.е. буфер сектора в 512 байт в RAM иметь надо всегда!
всей функциональности ФАТ и не нужно. нужно только писать потоком в один файл в читабельном на компьютере виде, при включении устройства можно стирать всю карточку и формировать файловую систему с нуля, еще разбираюсь с ММС
gladov
Feb 16 2007, 10:35
Цитата(umup @ Feb 15 2007, 19:40)

Цитата
Интересно будет посмотреть как это у вас получится.В MMC/SD запись всегда выровнена по границе сектора, т.е. буфер сектора в 512 байт в RAM иметь надо всегда!
всей функциональности ФАТ и не нужно. нужно только писать потоком в один файл в читабельном на компьютере виде, при включении устройства можно стирать всю карточку и формировать файловую систему с нуля, еще разбираюсь с ММС
Была примерно такая же задачка (правда, только чтение) с карточками SmartMedia. Реализовывал на AT89C52. Всего 256 байт ОЗУ. Ессно, контроллер еще и обрабатывал считываемые данные. Так что все реально, вопрос лишь в скорости работы - как сами понимаете она была мягко говоря низкая. Но для моих задач хватило. Вычитывал 16-20кб/с "чистых" данных с FAT12 (или FAT16 - не помню уже).
AlexBoy
Feb 19 2007, 14:01
Цитата(jorikdima @ Feb 13 2007, 09:19)

Цитата(AlexBoy @ Feb 13 2007, 02:35)

Можно поставить внешнюю SRAM с spi или i2c интерфейсом.
А вы не могли бы ткнуть пальцем в SRAM с последовательным итерфейсом, а то мне только параллельный встречался.
ЗЫ Но мне (для иных применений) надо хотя бы 32 Мбита
Ну в Мбитах послед. память не меряется, максимум 256кбит. Например fram FM25L16 ... FM25L256 колич. перезаписей - трилионы раз, держит без питания.
sergeeff
Feb 19 2007, 22:45
Коллеги!
Занимаюсь портированием efsl на at91rm9200. На карту на PC записал в корневую директорию несколько мелких файлов. Делаю:
printf("CARD init...\n");
if ((res = efs_init( &efs, 0 ) ) != 0) {
printf("failed with %i\n",res);
}
else {
printf("ok\n");
printf("Directory of 'root':\n");
ls_openDir( &list, &(efs.myFs), "/");
while (ls_getNext(&list) == 0 ) {
list.currentEntry.FileName[LIST_MAXLENFILENAME-1] = '\0';
printf( "%s ( %li bytes )\n" ,
list.currentEntry.FileName,
list.currentEntry.FileSize) ;
}
}
Не получаю никакого списка файлов. Хотя инициализация прошла успешно.
Есть идеи в какую сторону копать?
sergeeff
Feb 20 2007, 15:21
Все заработало. Причин было две:
1. Посматривать надо в errata (DMA шлет данные в инверсном порядке (big_endian, если сам процессор работает в little_endian).
2. В фукции memCpy (plibc.c) в отличие от библиотечной memcpy другой порядок *from, *to, size.
Теперь надо все почистить и померять скорости.
sergeeff
Feb 22 2007, 18:12
Коллеги!
Борюсь с efsl на at91rm9200. Читаю файл в 6 Mb со скоростью 1560 Kb/s без проблем. Пробую писать этот же файл обратно (с другим именем, естественно), записывается только 24 сектора по 512 байт, т.е. 12288 байт. И ни в какую больше.
Не сталкивался ли кто с аналогичными проблемами?
Denisvak
Feb 27 2007, 16:30
Добрый день!
А вот по
http://elm-chan.org/fsw/ff/00index_e.html может кто-нить объяснить как её настроить под свой проектик? У меня английским не очень. Понял что надо написать свои функции disk_initialize, disk_read, get_fattime, disk_write, disk_status. вроде написал.
Дальше пишу:
f_mount(0, &fs);
res = f_open(&fsrc, "config.txt", FA_OPEN_EXISTING | FA_READ);
if (res)
{
send_char_uart0(res); //debug
}
возвращает 0x01, в чем может быть причина? "config.txt" - лежит в корне
Denisvak
Feb 27 2007, 22:47
Сам разобрался!
Спасибо
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.