![]() |
Модераторы: PILOT, ManiaK, Mazzi |
![]() ![]() ![]() |
|
Dragon |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 10.8.2006 Где: Киев Репутация: нет Всего: нет |
Хм, в общем... Пишется драйвер оной флеши. Точнее, уже написан. Сверху над, собственно, драйвером находятся несколько уровней абстракции, призванных унифицировать высокоуровневому интерфейсу работу с разными типами storage media.
В частности, интерфейс желает иметь flat модель памяти - с индексацией записываемых блоков от 0 и до max_value, а также спокойно читать, писать и стирать эти блоки ![]() Собственно, здесь и начинаются проблемы ![]() Флеш имеет следующую структуру: Sector - 512B (spare area - 16B) Page - 4 sectors Block - 64 pages Core - 1024 blocks Device - 1 or 2 cores Flat модель реализуется просто... А дальше начинаются обычные для NAND флешей проблемы. Read/Write, Read/Write spare area операции доступны для секторов. Перезапись сектора возможна только после стирания. Erase операция доступна только для блоков - по 256 секторов в каждом ![]() Кастомер прется и желает чтобы мы использовали reference code его чудесного FTL - используем. Итак - дальнейшая реализация проста и естественна - берем spare area - там есть около 48 бит свободного пространства (свободного от ECC кодов и т.п.) которое не используется контроллером. Записываем туда условный 32-битный адрес логического блока и 16 бит флагов. Из этого счастья реально используются только 18 бит для адреса (0х40000 - max_value, в данном случае) и 3 флага - USED, DIRTY, INVALID. Мы держим в памяти карту соответствия - logical sector - physical sector (которая заполняется при старте устройства, путем считывания spare area's). Erase операция просто помечает сектора как dirty. Когда в блоке становится слишком много dirty секторов, выполняется Purge - которая просто копирует используемые сектора куда-то в другое место, стирает блок и отмечает все его сектора как FREE. Вот вроде бы и все... Кроме того, что карта выглядит так:
Для 0x40000 блоков эта конструкция использует ровно 1М SDRAM (из 64) Не думаю, что это прельщает кастомера и всех-всех-всех ;) С другой стороны - мы используем reference код... Но там флеша была маленькая и это не было проблемой... Ну, можно конечно сделать что-то вроде:
Тогда структура будет занимать 3 байта и мы торжественно будем занимать в памяти 786432 байта ![]() В общем, вопрос к тем, кто сталкивался с подобными проблемами - мне кажется, что возможен другой путь реализации. Буду благодарен за комменты. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |