реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Mass storage in flash M25P16, Как сделать FAT на флешке с большим размером страницы?
Dmitrich
сообщение Jan 15 2013, 19:20
Сообщение #1


Участник
*

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



Есть процессор STM32F103RC и память на 2 Мегабайта M25P16.
Хочется получить доступ к памяти через USB, как к диску.

Взял на сайте ST пример реализации mass storage, обрезал обращение к SD карточке, и для начала запустил в качестве памяти буфер на 32К в ОЗУ процессора.
Это работает, диск при подключении определяется, форматируется, файлы пишутся, читаются и стираются.

Нужно делать следующий шаг - перенести буфер во флеш. Для начала - хотя бы во внутреннюю флеш процессора.

И вот тут я "затормозил".

Виндовс при обращении к моему "диску" многократно перезаписывает таблицу размещения файлов.
Что с этим делать - с ходу не придумывается. Да и придумывать тут не надо - всё давно до меня придумано, но найти не могу.

Помогите, пожалуйста, кто "в теме".
Go to the top of the page
 
+Quote Post
polyname
сообщение Jan 15 2013, 21:00
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915



кроме как кешировать весь сектор 64К в ОЗУ на момент стирания/записи - похоже что никак.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 16 2013, 02:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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/задачи), то он весь должен быть в ОЗУ.
Go to the top of the page
 
+Quote Post
_3m
сообщение Jan 16 2013, 03:59
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 745
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(jcxz @ Jan 16 2013, 06:01) *
Зачем "весь" и зачем "64К"?
Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка (256/512/2048 байт) и все операции записи реализуете через эти страницы. Дальше - обычный write-back буфер страниц в ОЗУ CPU под некоторое кол-во этих страниц с вытеснением при переполнении наиболее старых страниц из ОЗУ во флеш.

Минимальный стираемый блок у микросхем M25P** фирмы микрон составляет 64 килобайта.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 16 2013, 04:27
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(_3m @ Jan 16 2013, 06:59) *
Минимальный стираемый блок у микросхем M25P** фирмы микрон составляет 64 килобайта.

У M25PE** можно стирать страницы, по 256 байтов.
Go to the top of the page
 
+Quote Post
polyname
сообщение Jan 16 2013, 06:19
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 18-05-12
Пользователь №: 71 915



Цитата
Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка
как раз 64К стирает, см.даташит.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 16 2013, 07:01
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Тогда лучше использовать что-то более удобное: W25X16 (4K), AT45DB161D (512).
Иначе - придётся ставить внешнюю ОЗУ для буфера.
Хотя (так как микросхема флеш всегда будет использоваться вместе с данным ПО доступа к диску) можно придумать и что-то сложно извращённое. Например: иметь таблицу трансляции логических номеров секторов в физические, иметь один дополнительный свободный сектор, при записи некоторой страницы во флеш переписывать весь сектор, который её содержал в свободный сектор, корректировать таблицу трансляции и очищать старый сектор, объявляя его свободным. Таблицу трансляции надо сохранять в эту же флеш при сбое питания.
Или более сложный алгоритм типа как в SSD-дисках. disco.gif
Go to the top of the page
 
+Quote Post
Dmitrich
сообщение Jan 16 2013, 07:05
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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К.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 16 2013, 07:12
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Dmitrich @ Jan 16 2013, 10:05) *
К сожалению, нельзя. Только 64К.

Не понял, почему или кому нельзя. На всякий случай - кусок из технического описания.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Dmitrich
сообщение Jan 16 2013, 07:22
Сообщение #10


Участник
*

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



Цитата(jcxz @ Jan 16 2013, 11:01) *
Тогда лучше использовать что-то более удобное: W25X16 (4K), AT45DB161D (512).
Иначе - придётся ставить внешнюю ОЗУ для буфера.


Не, железо менять не будем

Цитата
Хотя (так как микросхема флеш всегда будет использоваться вместе с данным ПО доступа к диску) можно придумать и что-то сложно извращённое.


Именно так: - "сложно извращённое", и с учётом реальных потребностей.



Цитата(ViKo @ Jan 16 2013, 11:12) *
Не понял, почему или кому нельзя. На всякий случай - кусок из технического описания.


M25P16 нельзя.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 16 2013, 07:26
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Dmitrich @ Jan 16 2013, 10:22) *
M25P16 нельзя.

Купите втихаря M25PE16, перепаяйте втихаря, документацию откорректируйте, и - вперед! rolleyes.gif
Go to the top of the page
 
+Quote Post
Dmitrich
сообщение Jan 16 2013, 07:32
Сообщение #12


Участник
*

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



Цитата(jcxz @ Jan 16 2013, 06:01) *
Зачем "весь" и зачем "64К"?
Определяете минимальную порцию данных (страницу) которую может писать/стирать данная флешка (256/512/2048 байт)


Минимум, что можно стереть - 64К.

Цитата
И надо ещё предусмотреть сигнал аварии питания...аварийной записи.


Не, это не требуется. Mass storage - не основной режим, очень редкое использование.

Цитата
Не знаю как для STM32, но по LPC могу сказать что внутренняя флеш - не лучший выбор
...Во время операций записи/стирания нельзя выполнять код из флеш.


Про внутренний флеш я упомянул только имея в виду - попробовать. При этом я забыл, что запись останавливает выполнение. Спасибо, что напомнили. Не буду даже пробовать.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 16 2013, 09:13
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Dmitrich @ Jan 16 2013, 13:32) *
Минимум, что можно стереть - 64К.

Если вы говорите что железо менять нельзя, то у вас в устройстве значит уже должна быть внешняя память.
Либо использовать предложенный мной метод с таблицей трансляции логических номеров кластеров в физические.
Иначе - как вы собираетесь переписать один кластер во флеш с учётом того, что стирать можете только по 64К?
Размер кластеров в вашем FAT какой? 512 или...?
Либо внешняя память и тогда - считываем сектор, стираем его, заменяем изменившиеся кластеры в нём, записываем.
Либо используем таблицу трансляции - тогда не нужен большой буфер в ОЗУ и можно обойтись внутренней ОЗУ CPU.
Но таблицу трансляции надо скидывать по сигналу сбоя питания (это тоже должно быть уже в железе).
Если у вас чего-то из этого в железе нет, то его менять придётся всё равно и лучше заменить микросхему флеш на что-нить более удобное.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jan 16 2013, 11:30
Сообщение #14


Ally
******

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



Цитата(Dmitrich @ Jan 15 2013, 21:20) *
Виндовс при обращении к моему "диску" многократно перезаписывает таблицу размещения файлов.
Что с этим делать - с ходу не придумывается. Да и придумывать тут не надо - всё давно до меня придумано, но найти не могу.

Помогите, пожалуйста, кто "в теме".


Здесь надо вникнуть в детали. Насколько "многократно перезаписывает таблицу" вы знаете?
Там в худшем случае, предполагаю, будет соотношение 1 к 10. Т.е. 10 стираний в FAT на одно стирание в области файлов.
Это сущая ерунда. Если действительно как вы говорите файловая система будет использоваться редко.
Плюс это это соотношение можно еще улучшить изменяя размер файлов, количество файлов и размер кластеров.
Т.е. проблема скорее надуманна.
Go to the top of the page
 
+Quote Post
Dmitrich
сообщение Jan 16 2013, 12:03
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 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 секунды после последней операции со стороны виндовс.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016