Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SD карта. Размер блока стирания и запись на нее.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
pvo125
Приветствую всех! Вопрос следующий у SD карт есть такой параметр как блок стирания. И размер этого блока (пробовал на двух 1гиговых картах) у одной 32 другой 64 КБ. Правильно ли я понимаю что при записи командами CMD24 или CMD25 карта предварительно стирает сектора в которые будет идти запись но так как у нее блок стирания например 64 килобайта то она стирает все 128 секторов (пусть сектор 512 байт) и не меньше. С того адреса который в качестве аргумента отправлен с командой CMD24/25 даже если пишется один сектор или несколько но их количество например 20 (некий блок по 10240 байт).
Тогда если я буду писать через fatfs файлы на такой карте. Может ли получится следующая ситуация. Файл существует он открывается для дозаписи в него. На уровне fatfs единица измерения уже кластер и пусть например этот кластер 16 КВ. Далее я вызываю f_write c количеством байт 10240. Внутри вызывается disk_write из которой вызывается уже моя реализация SD_MultiBlockWrite() и там предварительно стираются сектора на карте для ускорения процесса записи командой ACMD23. И вот карта стирает не только те сектора которые я запросил (10240 байт) не только тот кластер в который будет дописываться но и соседние следующие 3 кластера ( если кластер 16 КБ а блок очистки 64КБ ) Но ведь следующие соседние кластеры могут принадлежать другому файлу. Про это fatfs известно но самой то карте нет. Она чистит с заданного адреса +64КБ.
Или файлы пишутся не впритык и между ними есть несколько кластеров некая прослойка куда ничто не пишется. И при стирании картой своего блока стиралась бы эта прослойка и не затрагивались соседние файлы.

Если это так то подскажите кто как реализовывал. Слышал что нужно писать большими блоками но контроллер у меня stm32f103 там 20КБ ОЗУ но даже 16 не получится выделить под буфер для записи на карту.
jcxz
Цитата(pvo125 @ May 16 2016, 09:06) *
Но ведь следующие соседние кластеры могут принадлежать другому файлу. Про это fatfs известно но самой то карте нет. Она чистит с заданного адреса +64КБ.
Или файлы пишутся не впритык и между ними есть несколько кластеров некая прослойка куда ничто не пишется. И при стирании картой своего блока стиралась бы эта прослойка и не затрагивались соседние файлы.

Вот именно что известно. А если просто открыть файл и записать в середину 1 байт? По Вашей логике вокруг этого байта в файле вся инфа должна потеряться.
FatFS это всё внутри должна разруливать. Скорей всего она, при модификации части файла, переписывает весь блок стирания в новый чистый блок, корректируя таблицу размещения файлов.
AlexandrY
Цитата(pvo125 @ May 16 2016, 06:06) *
Если это так то подскажите кто как реализовывал. Слышал что нужно писать большими блоками но контроллер у меня stm32f103 там 20КБ ОЗУ но даже 16 не получится выделить под буфер для записи на карту.


В современных картах блок стирания уже не имеет жестко определенного размера, wear leveling там гораздо сложней.
Поэтому ловить в FatFS уже нечего.
Если нужен жесткий детерминизм надо брать голую NAND и ставить на неё свою FS со своим выравниванием износа.
Например в MQX такое есть.
pvo125
Цитата
Скорей всего она, при модификации части файла, переписывает весь блок стирания в новый чистый блок,

Может так оно и есть. Хотя единственное место где вызывается функция disk_ioctl c параметром GET_BLOCK_SIZE ( размер блока стирания карты ) это функция f_mkfs. форматирование карты. Слышал также что лучше делать при форматировании размер кластера равным как раз этому блоку стирания.
Получается что при записи кластера нет инфы у функции записи сколько будет стерто на карте...
Тут другое разглядел.В спецификации есть еще один параметр в CSD структуре он называется ERASE_BLK_EN и если он равен 0 то хост может стереть один или несколько units равных (поле SECTOR_SIZE+1)*512 байт. Как раз там пример показан когда запрашивается стереть с 5 по 40 сектор а карта стирает с 0 по 63 потому что у нее блок очистки равен (31+1) сектор.
А если он равен ERASE_BLK_EN=1 то размер блока стирания равен 1 или несколько блоков по 512 байт. Т е минимальный блок стирания равен 512 байт. На карте с которой пробовал как раз ERASE_BLK_EN=1 а поле erase sector size (SECTOR_SIZE) равно 0x7F те (127+1)*512=64КБ но я так понимаю когда ERASE_BLK_EN=1 то это поле не действует? Если это так то это конечно все меняет к лучшему. Все опасения о чем писал выше не сбудутся.
Кстати карты будут используются SDSC на 1 может быть 2 Гигабайта. Это про современность карт.
Цитата
Если нужен жесткий детерминизм надо брать голую NAND и ставить на неё свою FS со своим выравниванием износа.
Например в MQX такое есть.

laughing.gif Мне пожалуй проще выбрать какой то конкретный тип карт(минимальный блок очистки или кластер размером с этот блок стирания или если ERASE_BLK_EN=1 так как я писал то вообще тогда проблем нет ) и жестко его придерживаться. Изучить наверное дольше будет чем отсеять карты.
mantech
Цитата(pvo125 @ May 16 2016, 06:06) *
Если это так то подскажите кто как реализовывал. Слышал что нужно писать большими блоками но контроллер у меня stm32f103 там 20КБ ОЗУ но даже 16 не получится выделить под буфер для записи на карту.


Вся прелесть работы с картами памяти как-раз в том, что весь этот гемор тут не нужен! Ибо всем низкоуровневым управлением занимается контроллер в карте паяти. Все, что вам(т.е. fatfs-у) нужно - читать и писать секторами, от 512байт до 4кб, а может и больше, все остальное сделает сама карта. Да, в случае с нандом все гораздо печальнее...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.