Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выбор файловой системы для LPC2378
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vitaliy_ARM
Всем доброго времени.

Делаю маленький цифровой логер.

Задача простая. Опрос 16-битной шины (читаю с портов ввода/вывода) и складываю на SD-флешку в виде некоторых файлов.
Максимальный поток данных на флешку около 3-5 Мегабайт/сек.

Вопросы:

- Потянет ли LPC2378 на 72 МГц такую задачу?
- Какую файловую систему лучше выбать для прикручивания к модулю SDIO (MCI) процессора (fatfs, efs или что-то другое)?

Кто как считает?
etoja
Лучше выбрать файловую систему FAT16.
Если не можете написать сами, возьмите те исходные тексты, которые вам понятны.
Vitaliy_ARM
Цитата(etoja @ Apr 9 2009, 15:39) *
Лучше выбрать файловую систему FAT16.
Если не можете написать сами, возьмите те исходные тексты, которые вам понятны.


Немного некорректно поставил вопрос, какие исходники FAT16 лучше выбрать чтобы получить максимальную скорость на запись по 4-х битной шине?
esaulenka
Дурацкий вопрос: а кто-то гарантирует, что на SD можно записывать 5 мегабайт в секунду?

У меня (правда, контроллер другой, и работаю я только на чтение) процесс весьма неспешен. Точно не мерял, но получается заметно меньше 5 Мбайт/сек. Впрочем, можно списать на мои кривые руки, старый контроллер SD в моём камне, на работу с карточкой по одному сектору, ...
Впрочем, функция эта в моём устройстве используется больше в технологических целях, юзер может и потерпеть smile.gif
Vitaliy_ARM
Цитата(esaulenka @ Apr 9 2009, 16:01) *
Дурацкий вопрос: а кто-то гарантирует, что на SD можно записывать 5 мегабайт в секунду?


Вообще-то да, и больше можно (до 20MB/s): http://www.gadgetspage.com/cameras/underst...ard-speeds.html

Цитата(esaulenka @ Apr 9 2009, 16:01) *
Впрочем, функция эта в моём устройстве используется больше в технологических целях, юзер может и потерпеть smile.gif


У меня будет долго терпеть при переливании 1Гб laughing.gif
aaarrr
Я бы думал, что основное внимание следует уделить не файловой системе, а системе кэширования и менеджеру записи (которые в "исходниках из интернета" как-то обойдены стороной).
esaulenka
Я не зря упомянул, что работаю с карточкой работаю по одному сектору.
Основные проблемы, как мне кажется (подробного исследования не делал) - большая задержка между командой "считать сектор" и началом выдачи данных.
Эти измерения наверняка проводились на команде "считать несколько секторов, пока не остановим", оно должно работать заметно шустрее.
И на запись значения тоже будут другие.


Надо срочно задуматься, нужно ли писать за раз мегабайты в одно место, или нужно писать разные кусочки по 512 байт. Скорость будет принципиально разная.
Dog Pawlowa
Цитата(Vitaliy_ARM @ Apr 9 2009, 15:51) *
Немного некорректно поставил вопрос, какие исходники FAT16 лучше выбрать чтобы получить максимальную скорость на запись по 4-х битной шине?

Отвечаю только за то, что сам проверял.
Скорость efsl около 150 килобайт в секунду.
А о каких максимальных объемах информации идет речь?
SDRAM стоит недорого и может быть прекрасным буфером.
Насколько я понимаю, речь не идет о массовых тиражах приборов?
_Pasha
Цитата(esaulenka @ Apr 9 2009, 16:21) *
Надо срочно задуматься, нужно ли писать за раз мегабайты в одно место, или нужно писать разные кусочки по 512 байт. Скорость будет принципиально разная.

На большом потоке и большом объеме диск обычно предварительно дефрагментируется...
Vitaliy_ARM
Спасибо всем за ответы!

Устройство не массовое, будет штуки три. Винда вкладывается в 3 Мегабайта/с.
Конкретизирую архитектуру проекта. В устройстве два режима - логер и картридер.
В первом случае идет запись данных на флешь со сокростью (после корректировки тз) уже 500кБайт/с.
Во втором случае по усб идет считывание того, что он написал на флешку.
Режимы переключаются жестко при помощи кнопки.

Интересен первый режим, где на флешке надо выжать все, что можно.
Думал сделать двойную буферизацию или кольцевой буфер, один "процесс"
пишет данные в буфер, другой из буфера на флешку. Размеры буферов ориентировочно - 16кБайт.

SRAM ставить нехочется, так как устрйство автономное, питается от батарейки + объем данных неизвестен, может быть будет переваливать
за размер одной флешки.

Пробую разобраться с исходниками, которые идут в комплекте яра для платы MCB2378
aaarrr
500кБайт в секунду можно писать без каких-либо ухищрений, просто по одному сектору.
ar__systems
Цитата(Vitaliy_ARM @ Apr 9 2009, 09:05) *
Устройство не массовое, будет штуки три. Винда вкладывается в 3 Мегабайта/с.
Конкретизирую архитектуру проекта. В устройстве два режима - логер и картридер.
В первом случае идет запись данных на флешь со сокростью (после корректировки тз) уже 500кБайт/с.

А зачем тогда огород городить, если их всего три будет? Купите 3 маленьких одноплатных компутера, поставьте туда линух, прилепите к ним батареи побольше, I/O и не парьтесь.

Нафига делать режим "кардридер" -- можно же просто всавить карту в комп и прочитать?

У вас инженерный труд как оценивается?
Vitaliy_ARM
Цитата(ar__systems @ Apr 9 2009, 17:58) *
Купите 3 маленьких одноплатных компутера, поставьте туда линух, прилепите к ним батареи побольше, I/O и не парьтесь.


Устройство должно иметь малые габариты. С этим вариантом проблем будет столько же -> "I/O и не парьтесь."

Цитата(ar__systems @ Apr 9 2009, 17:58) *
Нафига делать режим "кардридер" -- можно же просто всавить карту в комп и прочитать?


Можно, а если нет картридера в компе - то нельзя smile.gif.

Цитата(aaarrr @ Apr 9 2009, 17:18) *
500кБайт в секунду можно писать без каких-либо ухищрений, просто по одному сектору.


Спасибо за инфо, значит буду пробовать эту архитектуру.
ar__systems
Цитата(Vitaliy_ARM @ Apr 9 2009, 10:05) *
Устройство должно иметь малые габариты. С этим вариантом проблем будет столько же -> "I/O и не парьтесь."
Можно, а если нет картридера в компе - то нельзя smile.gif.

Ну пусть себе купят кард ридер за 15 долларов! Вспоминается анекдот про удаление гланд...

Вот огромный список компов малых размеров в том числе с кардридерами и I/O.

http://www.linuxdevices.com/articles/AT8498487406.html
Vitaliy_ARM
Цитата(ar__systems @ Apr 9 2009, 18:32) *


Это дорого.
ar__systems
Цитата(Vitaliy_ARM @ Apr 9 2009, 11:23) *
Это дорого.

Я не понимаю -- 150-200 баксов за штуку дорого, а оплачивать работу инженера за один а то и два месяца -- недорого? Не считая расходов на изготовление этих трех...
Wano
Цитата(aaarrr @ Apr 9 2009, 16:18) *
500кБайт в секунду можно писать без каких-либо ухищрений, просто по одному сектору.


Хорошая скорость. USB+FatFS никак быстрее 70 кБайт не вышло sad.gif . Правдо записывал по 150 байт, но файл был всё время открыт.
А вот FatFS+MCI вышло быстрее, раза в два. Правдо тестировал на древней SD-шке.
aaarrr
Да вот меня и удивляет, откуда берутся настолько плохие цифры - ~150кБ/с. Тут в консерватории что-то править надо.
Wano
Цитата(aaarrr @ Apr 9 2009, 21:28) *
Да вот меня и удивляет, откуда берутся настолько плохие цифры - ~150кБ/с. Тут в консерватории что-то править надо.


SD на 256 метров, FAT16, пишу по 512 байт 10000 раз ,MCLCLK frequency=6МГц - время минута. Меняю делитель на 12МГц - и один чёрт 40 секунд. Вставляю в ноут 12,8 метра за 110 секунд smile.gif
Флэха старая, но не думал что на столько.
aaarrr
Цитата(Wano @ Apr 10 2009, 02:13) *
Вставляю в ноут 12,8 метра за 110 секунд smile.gif

12.8 одним куском? Просто удивительные тормоза.
MALLOY2
Цитата
Я не понимаю -- 150-200 баксов за штуку дорого, а оплачивать работу инженера за один а то и два месяца -- недорого? Не считая расходов на изготовление этих трех...


Ну как я понял здесь инженер и программист одно лицо, да и купив платы надо все равно оплачивать работу программиста. А изготовление 3 таких образцов может быть дешевле 200$.
Vitaliy_ARM
Попробовал настроить тактовую на 25Мбит в примере Mci в папке яра. Получил ~22кБита/c по четырехбитной шине с использованием DMA. smile3046.gif
Andy Mozzhevilov
Протестировал FatFS на LPC2478
Исходные данные:
FatFS 0.07 + uCOS-II
LPC2478: Core CLK 72МГц, MCI CLK - 18МГц, трансфер данных между картой и памятью по DMA.

При тестировании производилась запись и чтение файла целиком, и для сравнения - в цикле блоками по 512 байт.
При чтении/записи целого файла драйвер использует команды SD карты WRITE_MULTIPLE_BLOCK (CMD25) и READ_MULTIPLE_BLOCK (CMD18).
FatFS пишет последовательно столько блоков, сколько их содержится в кластере.
При чтении/записи блоками по 512 байт драйвер использует команды WRITE_SINGLE_BLOCK (CMD24) и READ_SINGLE_BLOCK (CMD17).

SD Card - 16 MB (размер кластера 4096 байт):
Код
Test for read/write speed whole file.                                          
File size       = 262144 bytes                                                
File write time = 770152 mks                                                  
Write speed     = 340425 bytes/sec                                            
File read time  = 87600 mks                                                    
Read speed      = 3011764 bytes/sec                                            

Test for read/write speed with blocks.                                        
File size       = 262144 bytes                                                
Block size      = 512 bytes                                                    
File write time = 5824609 mks                                                  
Block write time= 11375 mks                                                    
Write speed     = 45007 bytes/sec                                              
File read time  = 270855 mks                                                  
Block read time = 528 mks                                                      
Read speed      = 969696 bytes/sec

Комментарий. Карта старая, запись длится примерно 10 мс.
В Windows для этой же карты разультат на запись 650 кБ/сек, на чтение - 6 МБ/сек.

SD Card - 2 GB (размер кластера 32768 байт):
Код
Test for read/write speed whole file.                                          
File size       = 262144 bytes                                                
File write time = 290314 mks                                                  
Write speed     = 904593 bytes/sec                                            
File read time  = 39776 mks                                                    
Read speed      = 6736842 bytes/sec                                            

Test for read/write speed with blocks.                                        
File size       = 262144 bytes                                                
Block size      = 512 bytes                                                    
File write time = 1438077 mks                                                  
Block write time= 2808 mks                                                    
Write speed     = 182336 bytes/sec                                            
File read time  = 268885 mks                                                  
Block read time = 524 mks                                                      
Read speed      = 977099 bytes/sec

В Windows для этой карты разультат на запись 2200 кБ/сек, на чтение - 12 МБ/сек.
IgorMarx
Если интересно, я попробовал чтение на LPC2888/D1. DMA, 4-bit width, 6 MHz clock (больше на на соплях не вышло - CRC ERROR)
порлучил чтение сектора за время 0.7 mc. Ядро на частоте 60 MHz.

Из-за багов в чипе (DMA останавливается раньше, чем вычитает весь FIFO) пришлось читать 120 двойных слов через DMA и потом остатки из FIFO выгребать вручную. Затем перемещать считанный сектор в буфер, если изначально буфер не выровнен по границе 4 байта. Мало того, перед запуском DMA необходимо сбрасывать data cache, если используется.

Если интересуют малые размеры, высокая производительность и не пугает пайка BGA корпусов с шагом 0.5, то рекомендую этот чип. Правда, насколько он хорош, настолько же плохая документация (что характерно для NXP) и велико количество багов самого чипа.
Andy Mozzhevilov
Цитата(IgorMarx @ Apr 17 2009, 13:17) *
Из-за багов в чипе (DMA останавливается раньше, чем вычитает весь FIFO) пришлось читать 120 двойных слов через DMA и потом остатки из FIFO выгребать вручную. Затем перемещать считанный сектор в буфер, если изначально буфер не выровнен по границе 4 байта. Мало того, перед запуском DMA необходимо сбрасывать data cache, если используется.

Можно ли об этом поподробнее. На 2478 столкнулся с непонятным поведением DMA, если адрес в памяти не выровнен на границу 4.
Буфер находится во внешней SDRAM, забирается напрямую по DMA в MCI при записи. Иногда DMA просто останавливается, и в MCI возникает TxUnderrun. Причем именно иногда, файл размером 1М Байт может без ошибок записаться 2-3 раза, потом где-то в середине трансфера DMA останавливается. Пока пришлось реализовать запись и чтение из невыровненных буферов через промежуточное копирование во внутренний буфер в области USB RAM, он все равно нужен для записи буферов, содержащихся во внутренней RAM и Flash, не доступных для DMA, но тем не менее потеря производительности есть.
Хотелось бы уточнить, описаны где-либо проблемы и ошибки DMA контроллера? В errata этой информации на данный момент нет.
IgorMarx
Я не работал с контроллером на 2478, но думаю, что он должен работать аналогично тому, что на 2888. С ним ситуация такая: он может перемещать блоки данных размером не более 0x1000 "юнитов", где "юнит" может быть байт, слово и двойное слово. Соответственно, для байтов выравнивание не требуется, для слов - выравнивание на границу 2 байта (я это не проверял) и для двойных слов необходимо выравнивание по границе 4 байт. Поскольку MCI FIFO (а впринципе не важно, чъё FIFO) имеет разрядность 32, то для DMA можно использовать только режим чтения (или записи) двойными словами, и как следствие, необходимо иметь буфер, выровненный по границе двойного слова.

Забыл добавить - в Errata нет и более серьёзных проблем, чем эти.

Далее, DMA реально останавливается, когда FIFO ещё не пустое - видать, при разводке чипа DMA прицепили к сигналу "FIFO наполовину заполнено". Вот он и не дочитывает. И подобного геммороя у NXP полно, странно то, что они не перевыпускают свои даташиты с исправлениями.
Andy Mozzhevilov
Цитата(IgorMarx @ Apr 17 2009, 14:02) *
Я не работал с контроллером на 2478, но думаю, что он должен работать аналогично тому, что на 2888. С ним ситуация такая: он может перемещать блоки данных размером не более 0x1000 "юнитов", где "юнит" может быть байт, слово и двойное слово.

Да, если Flow control - DMA, если Flow control - периферия, то количество этих юнитов не имеет значения, пока периферия запрашивает - он будет отдавать. Я использовал в своей реализации именно MCI контроллер для flow control.

Цитата
Соответственно, для байтов выравнивание не требуется, для слов - выравнивание на границу 2 байта (я это не проверял) и для двойных слов необходимо выравнивание по границе 4 байт. Поскольку MCI FIFO (а впринципе не важно, чъё FIFO) имеет разрядность 32, то для DMA можно использовать только режим чтения (или записи) двойными словами, и как следствие, необходимо иметь буфер, выровненный по границе двойного слова.

У них по документации рулится 2 параметра - burst size и wide. Когда wide для памяти устанавливаю 32 бита, то все нормально, а если 8 - то DMA иногда затыкается.

Цитата
Далее, DMA реально останавливается, когда FIFO ещё не пустое - видать, при разводке чипа DMA прицепили к сигналу "FIFO наполовину заполнено". Вот он и не дочитывает. И подобного геммороя у NXP полно, странно то, что они не перевыпускают свои даташиты с исправлениями.

Когда ставил DMA в качестве Flow Control - были проблемы, не забирает последнюю "половинку Fifo". Видимо здесь имеется ввиду именно это.

Выше подправил результаты тестов для SD
Vitaliy_ARM
Всем спасибо за ответы.
Скромные результаты для карточек.

Сейчас написал низкоуровневую библиотеку по работе с картами MMC/SD для файловой системы.
Использую DMA, частота MCICLK = 24Мгц, запись делаю по четыре блока командой WR_MUL_BLOCK.
Размер блока - 512байт.
Протестировал на запись флешку - получилось около 550кБайт/с.
на чтение - 3Мбайт/с

Теперь буду пробовать прикручивать этот драйвер к файловой системе.
Пока еще не знаю, к какой...
Dog Pawlowa
Цитата(Vitaliy_ARM @ Apr 17 2009, 16:47) *
Пока еще не знаю, к какой...

На lpc2478 FatFs дала скорость раза в четыре больше, чем efsl.
Sanek_spb
Цитата(Vitaliy_ARM @ Apr 17 2009, 17:47) *
Сейчас написал низкоуровневую библиотеку по работе с картами MMC/SD для файловой системы.
Использую DMA, частота MCICLK = 24Мгц, запись делаю по четыре блока командой WR_MUL_BLOCK.
Размер блока - 512байт.
Протестировал на запись флешку - получилось около 550кБайт/с.
на чтение - 3Мбайт/с

Теперь буду пробовать прикручивать этот драйвер к файловой системе.
Пока еще не знаю, к какой...


Странные у вас результаты, правда я старыми картами не балуюсь, но у меня результаты немного другие
проц на 8 мгц, скорость чтения 350кбайт/с, запись 190.
на 24 в 2.5 раза быстрее, те 450 запись, 850 чтение
И при этом карта подключена через СПИ, быстрее не разгонял - было в лом плл включать.
По поводу файловых систем - положил болт: мне надо писать одновременно 2 потока данных с разным битрэйтом и читать ещё что-нить. По этому поводу написал свою маленькую фс-ку, пишет двухпотоковые файлы, при этом одновременно можно читать один из двух потоков. Написание заняло 2 часа, час на прогоны.
Vitaliy_ARM
В общем после нескольких дней просмотров этапов записи/чтения узнал, что флешки бывают еще с неким классом скорости: http://www.google.com/search?client=opera&...-8&oe=utf-8

В итоге в наличии была старая флешка, но на ней определил, что с SD-Card малой кровью не обойтись и начинаю терзать CF и LPC2939.
zltigo
Цитата(Vitaliy_ARM @ May 6 2009, 16:58) *
начинаю терзать CF

Скорее всего зря - там по нынешним временам произвола со скоростями вообще немеряно. Да и дальше PIO/UDMA... В результате каой-нибудь SanDisk UltraII в реальности еле шевелится. А неведомые зверюшки, хоть и Kingston, еле 500KB/s вытягивают. Лучше берите с SD более-менее брендовые и с маркировкой по скорости.
Vitaliy_ARM
Цитата(zltigo @ May 6 2009, 20:01) *
Скорее всего зря - там по нынешним временам произвола со скоростями вообще немеряно. Да и дальше PIO/UDMA... В результате каой-нибудь SanDisk UltraII в реальности еле шевелится. А неведомые зверюшки, хоть и Kingston, еле 500KB/s вытягивают. Лучше берите с SD более-менее брендовые и с маркировкой по скорости.


С CF дела обстоят гораздо лучше, времена доступа могут быть даже 80 нс. При этом она может висеть на внешней статической шине процессора.
Кончено количество их на рынке меньше чем SD, но и устройств не так и много планируется smile.gif.
zltigo
Цитата(Vitaliy_ARM @ May 8 2009, 12:48) *
С CF дела обстоят гораздо лучше, времена доступа могут быть даже 80 нс.

smile.gif Вот подключите реально и все узнаете. Лично у меня есть реально быстрые CF из комлекта профессиональных фотоаппаратов, но цена в сотню-другую баксов за неcколько гигов мне совсем не нравится. Проверяется на индустриальных PC-шках. Контроллеры вполне продвинутые - UDMA само собой. Операционки, драйвера разные, но результат в подавляющем большинстве случаев тормозной. Одна радость - сможете обычный HDD подключить и заливать на него.
blackfin
Цитата(zltigo @ May 8 2009, 14:10) *
Операционки, драйвера разные, но результат в подавляющем большинстве случаев тормозной.

А как же Microdrive? rolleyes.gif

Хотя:
Цитата
Microdrives are not as fast as the high-end CompactFlash cards; they generally operate at around 4-6 megabytes per second while high-end CF cards can operate at 45 megabytes per second.
zltigo
Цитата(blackfin @ May 8 2009, 13:20) *
Хотя:

Вот именно "хотя" sad.gif То, что Hi-End работет шустро это факт, но и стоят они немерянно.
Vitaliy_ARM
Цитата(zltigo @ May 8 2009, 14:10) *
smile.gif Вот подключите реально и все узнаете. Лично у меня есть реально быстрые CF из комлекта профессиональных фотоаппаратов, но цена в сотню-другую баксов за неcколько гигов мне совсем не нравится. Проверяется на индустриальных PC-шках. Контроллеры вполне продвинутые - UDMA само собой. Операционки, драйвера разные, но результат в подавляющем большинстве случаев тормозной. Одна радость - сможете обычный HDD подключить и заливать на него.


После праздников буду тестировать на LPC2468. Посмотрю что получится.
Кстати я на форум так и не отписал, на моей карточке SD получалась скорость записи 500кБайт/с - это средняя скорость,
измеренная за 5 минут записи данных. Писал по четыре 512-ти байтных блока. Реально поставил осциллограф на шину CMD и D0
и увидел, что иногда на шине данных попадаются большие задержки разной длины ~20-120мс (в это время по шине CMD бегут опросы готовности карты для записи),
причем длина их случайна.
Т.е. для синхронной быстрой записи такое не годится. Я так полагаю, что в это время внутренний контроллер занимается коррекцией ошибок
секторов NAND. В зависимости от количества плохих секторов плавает время задержки, это только мое предположение.

P.S: Может кто поделится исходниками по работе с CF, если есть?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.