|
Mass storage in flash M25P16, Как сделать FAT на флешке с большим размером страницы? |
|
|
|
Jan 15 2013, 19:20
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 15-02-05
Пользователь №: 2 663

|
Есть процессор STM32F103RC и память на 2 Мегабайта M25P16. Хочется получить доступ к памяти через USB, как к диску.
Взял на сайте ST пример реализации mass storage, обрезал обращение к SD карточке, и для начала запустил в качестве памяти буфер на 32К в ОЗУ процессора. Это работает, диск при подключении определяется, форматируется, файлы пишутся, читаются и стираются.
Нужно делать следующий шаг - перенести буфер во флеш. Для начала - хотя бы во внутреннюю флеш процессора.
И вот тут я "затормозил".
Виндовс при обращении к моему "диску" многократно перезаписывает таблицу размещения файлов. Что с этим делать - с ходу не придумывается. Да и придумывать тут не надо - всё давно до меня придумано, но найти не могу.
Помогите, пожалуйста, кто "в теме".
|
|
|
|
|
Jan 16 2013, 02:01
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Зачем "весь" и зачем "64К"? Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка (256/512/2048 байт) и все операции записи реализуете через эти страницы. Дальше - обычный write-back буфер страниц в ОЗУ CPU под некоторое кол-во этих страниц с вытеснением при переполнении наиболее старых страниц из ОЗУ во флеш. И надо ещё предусмотреть сигнал аварии питания, по которому у вас при отключении питания CPU успеет всё содержимое буфера скинуть во флеш. Упреждение прихода сигнала относительно формирования RESET на CPU должно быть достаточным для сброса буфера. Для ускорения этого процесса, можно во флеш предусмотреть необходимое кол-во заранее стёртых страниц для такой аварийной записи (так как запись во флеш без стирания много быстрее чем со стиранием). Цитата(Dmitrich @ Jan 16 2013, 01:20)  Нужно делать следующий шаг - перенести буфер во флеш. Для начала - хотя бы во внутреннюю флеш процессора. Не знаю как для STM32, но по LPC могу сказать что внутренняя флеш - не лучший выбор: 1. На порядок меньший ресурс перезаписи по сравнению с обычными SPI флеш. 2. Неудобный размер минимальных порций записи/стирания. И причём они разного размера. 3. Во время операций записи/стирания нельзя выполнять код из флеш. Соответственно если у вас в это время работает USB стек (и прочие ISR/задачи), то он весь должен быть в ОЗУ.
|
|
|
|
|
Jan 16 2013, 06:19
|
Частый гость
 
Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915

|
Цитата Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка как раз 64К стирает, см.даташит.
|
|
|
|
|
Jan 16 2013, 07:05
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 15-02-05
Пользователь №: 2 663

|
Спасибо отвечавшим, всё внимательно прочитал, и даже сам пытался думать. Надумал вот что попробовать: - сделать в RAM буфер размером с таблицу FAT. Запись и чтение в сектора, принадлежащие FAT - перенаправлять в этот буфер. Запись собственно данных - направлять сразу в M25P16. А спустя одну-две секунды после окончания записи - переписывать FAT из RAM в M25P16, стирая предварительно сектор (64К). Так как использоваться в качестве mass storage устройство будет очень редко, то это вполне допустимо. Обязуюсь доложить результаты. Цитата(ViKo @ Jan 16 2013, 08:27)  У M25PE** можно стирать страницы, по 256 байтов. К сожалению, нельзя. Только 64К.
|
|
|
|
|
Jan 16 2013, 07:22
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 15-02-05
Пользователь №: 2 663

|
Цитата(jcxz @ Jan 16 2013, 11:01)  Тогда лучше использовать что-то более удобное: W25X16 (4K), AT45DB161D (512). Иначе - придётся ставить внешнюю ОЗУ для буфера. Не, железо менять не будем Цитата Хотя (так как микросхема флеш всегда будет использоваться вместе с данным ПО доступа к диску) можно придумать и что-то сложно извращённое. Именно так: - "сложно извращённое", и с учётом реальных потребностей. Цитата(ViKo @ Jan 16 2013, 11:12)  Не понял, почему или кому нельзя. На всякий случай - кусок из технического описания. M25P16 нельзя.
|
|
|
|
|
Jan 16 2013, 07:32
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 15-02-05
Пользователь №: 2 663

|
Цитата(jcxz @ Jan 16 2013, 06:01)  Зачем "весь" и зачем "64К"? Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка (256/512/2048 байт) Минимум, что можно стереть - 64К. Цитата И надо ещё предусмотреть сигнал аварии питания...аварийной записи. Не, это не требуется. Mass storage - не основной режим, очень редкое использование. Цитата Не знаю как для STM32, но по LPC могу сказать что внутренняя флеш - не лучший выбор ...Во время операций записи/стирания нельзя выполнять код из флеш. Про внутренний флеш я упомянул только имея в виду - попробовать. При этом я забыл, что запись останавливает выполнение. Спасибо, что напомнили. Не буду даже пробовать.
|
|
|
|
|
Jan 16 2013, 09:13
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Dmitrich @ Jan 16 2013, 13:32)  Минимум, что можно стереть - 64К. Если вы говорите что железо менять нельзя, то у вас в устройстве значит уже должна быть внешняя память. Либо использовать предложенный мной метод с таблицей трансляции логических номеров кластеров в физические. Иначе - как вы собираетесь переписать один кластер во флеш с учётом того, что стирать можете только по 64К? Размер кластеров в вашем FAT какой? 512 или...? Либо внешняя память и тогда - считываем сектор, стираем его, заменяем изменившиеся кластеры в нём, записываем. Либо используем таблицу трансляции - тогда не нужен большой буфер в ОЗУ и можно обойтись внутренней ОЗУ CPU. Но таблицу трансляции надо скидывать по сигналу сбоя питания (это тоже должно быть уже в железе). Если у вас чего-то из этого в железе нет, то его менять придётся всё равно и лучше заменить микросхему флеш на что-нить более удобное.
|
|
|
|
|
Jan 16 2013, 11:30
|

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

|
Цитата(Dmitrich @ Jan 15 2013, 21:20)  Виндовс при обращении к моему "диску" многократно перезаписывает таблицу размещения файлов. Что с этим делать - с ходу не придумывается. Да и придумывать тут не надо - всё давно до меня придумано, но найти не могу.
Помогите, пожалуйста, кто "в теме". Здесь надо вникнуть в детали. Насколько "многократно перезаписывает таблицу" вы знаете? Там в худшем случае, предполагаю, будет соотношение 1 к 10. Т.е. 10 стираний в FAT на одно стирание в области файлов. Это сущая ерунда. Если действительно как вы говорите файловая система будет использоваться редко. Плюс это это соотношение можно еще улучшить изменяя размер файлов, количество файлов и размер кластеров. Т.е. проблема скорее надуманна.
|
|
|
|
|
Jan 16 2013, 12:03
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 15-02-05
Пользователь №: 2 663

|
Цитата(jcxz @ Jan 16 2013, 13:13)  Если вы говорите что железо менять нельзя, то у вас в устройстве значит уже должна быть внешняя память. Либо использовать предложенный мной метод с таблицей трансляции логических номеров кластеров в физические. Иначе - как вы собираетесь переписать один кластер во флеш с учётом того, что стирать можете только по 64К? Из внешней памяти в устройстве только M25P16. Устройство в таком виде свои задачи выполняет. В памяти ( M25P16 ) записаны голосовые сообщения, одним "куском" немного больше мегабайта. Файловой системы в устройстве нет. Звук записывается один раз при изготовлении, через технологический UART по протоколу X-modem, медленно и печально. Речь идёт о модификации - ускорении этой загрузки. И - как дополнительный бонус - дать возможность заказчику обновлять звук при эксплуатации. Цитата Размер кластеров в вашем FAT какой? 512 или...? Размер кластера, насколько я понимаю, мне виндовс задаст при форматировании. Хм... А что, если мне самому "отформатировать" диск? Задать размер кластера 64К, тогда у меня вся таблица FAT будет крошечная. Виндовсу форматирование - запретить. Надо попробовать. Цитата Либо используем таблицу трансляции - тогда не нужен большой буфер в ОЗУ и можно обойтись внутренней ОЗУ CPU. Но таблицу трансляции надо скидывать по сигналу сбоя питания (это тоже должно быть уже в железе). С таблицей трансляции как-то сложновато по моему. Да и, признаться, не очень понятно как. Отследить потерю питания ТЕОРЕТИЧЕСКИ можно, но это "не вариант". При записи файла питание устройства будет, скорее всего - от USB. Время, в течении которого имеющиеся электролиты разрядятся с 5 до 3 вольт слишком мало. Но вполне можно сделать сохранение таблицы трансляции через 1-2 секунды после последней операции со стороны виндовс.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|